传递从用户模式可变长度结构来内核模式

问题描述:

我正在写虚拟磁盘驱动器,并有我有这样的定义的结构:传递从用户模式可变长度结构来内核模式

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

所以我有几分动态大小的结构。

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

+2

想''foo \ 0bar \ 0 \ baz \ 0“' – 2013-04-26 00:11:55

分配内存连续块,足以同时容纳你的结构和“重点”和“路径”的数据 - 这样的事情:

/* 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您的驱动程序,通总计缓冲区的大小,而不仅仅是MOUNT_NEW_QUERY结构的大小。

+0

哦,这很容易......我想我明白了。谢谢。 抱歉不能投票,没有足够的声望。 – externum 2013-04-26 00:22:29

+0

嗯...还有一个问题。我应该添加数组的长度结构? ** UPD:**再次抱歉。看来我需要更多的睡眠。 =) – externum 2013-04-26 00:29:51

+0

睡眠很好。不用担心,祝你好运! – 2013-04-26 00:35:33