【问题标题】:Passing variable length struct from User Mode to Kernel Mode将可变长度结构从用户模式传递到内核模式
【发布时间】:2013-04-26 00:02:12
【问题描述】:

我正在编写虚拟磁盘驱动程序,我有这样定义的结构:

typedef struct _MOUNT_NEW_QUERY {
    PWCHAR imagePath;
    WCHAR letter;
    PCHAR key;
} MOUNT_NEW_QUERY, *PMOUNT_NEW_QUERY;

所以我有一种动态大小的结构。

我必须如何将它从用户模式传递给我的驱动程序?

【问题讨论】:

  • 想想"foo\0bar\0\baz\0"

标签: c windows drivers wdk


【解决方案1】:

分配一块连续的内存,足以容纳你的结构和“key”和“path”的数据——像这样:

/* we add + 1 for terminating NULLs to make life easy */
size_t keyLen = (strlen(key) +  1); 
size_t imgLen = (wcslen(imagePath) + 1) * sizeof(WCHAR);

PMOUNT_NEW_QUERY pMNQ = malloc(sizeof(MOUNT_NEW_QUERY) + keyLen + imgLen);

if(pMNQ != NULL) 
{       
   /* make imagePath point to the allocated buffer immediately after 
    * the MOUNT_NEW_QUERY portion 
    */
   pMNQ->imagePath = (PWCHAR)((PBYTE)pMNQ + sizeof(MOUNT_NEW_QUERY));

   /* make the key point to the allocated buffer immediately after 
    * the imagePath portion (including a NULL WCHAR terminator)
    */
   pMNQ->key = (PCHAR)((PBYTE)pMNQ + sizeof(MOUNT_NEW_QUERY) + imgLen);

   /* populate the data here appropriately, typically with strcpy
    * and wcscpy, and then send the IOCTL 
    */
   fun(pMNQ);
}

当您为驱动程序调用 IOCTL 时,传递 total 缓冲区大小,而不仅仅是 MOUNT_NEW_QUERY 结构的大小。

【讨论】:

  • 哦,这很简单……我想我明白了。谢谢你。抱歉不能投票,没有足够的声望。
  • 嗯...还有一个问题。我应该将数组的长度添加到结构吗? UPD: 再次抱歉。看来我需要更多的睡眠。 =)
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 2012-04-15
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
相关资源
最近更新 更多