DeviceIoControl完全失效,返回时SystemBuffer为空。

问题描述 投票:0回答:1

我有一个IOCTL被发送到我的驱动程序中的结构,该结构被成功地传递,然后我的驱动程序做它的魔法,但当它完成时,它应该返回一个简单的unsigned _int64,这是8个字节长,我设置IRP的IoStatus.Information为unsigned _int64(8个字节)的大小,我把该值复制到AssociatedIrp.SystemBuffer中,最后我设置IoStatus.Status为STATUS_SUCCESS,然后调用IoCompleteRequest。

现在,我用WinDbg检查了SystemBuffer包含正确的输出,并且在调用IoCompleteRequest时,Status和Information字段是正确的,但是当我的userermode应用程序调用DeviceIoControl返回时,输出缓冲区并没有改变我在lpOutBuffer字段中指向的整数值。我在创建时将其初始化为一个普通的0x9,当调用结束时,它仍然是相同的值,而它应该是完全不同的东西,我有多个IOCTL,所有的工作和在exsact相同的方式,我不知道这里发生了什么,任何提示将是非常感激的,我相信这是一个Windows错误,现在或类似的东西,因为我已经阅读了我的代码100倍,但没有弄清楚这个简单而复杂的错误。

很抱歉,我不能发布任何代码,因为我不拥有它和其他原因。

c++ io driver ioctl
1个回答
0
投票

希望你能找到解决办法,因为你3年前就发过这个问题。我们在调查类似的事情时遇到了这个帖子,解决方案非常简单,但没有记录在案.如果驱动程序将一些数据复制到输出缓冲区,并使用WdfRequestComplete,状态为OK,则没有任何东西返回给调用者! 你需要调用WdfRequestCompleteWithInformation并在Information参数中传递写入的字节数。这将告诉框架要返回多少字节给调用者。

例如::

WDFMEMORY   reqMemory;
NTSTATUS    status = WdfRequestRetrieveOutputMemory(Request, &reqMemory);
if (!NT_SUCCESS(status))
{
    break;
}
WdfMemoryCopyFromBuffer(reqMemory, 0, data, dataLen);

/* this will complete the request but nothing is returned to the caller
WdfRequestComplete(Request, S_OK);
*/
/* this is the correct way of returning the data */
WdfRequestCompleteWithInformation(Request, S_OK, dataLen);
© www.soinside.com 2019 - 2024. All rights reserved.