DeviceIoControl完全无法正常工作,返回时SystemBuffer为空

时间:2017-01-02 15:47:26

标签: c++ io driver ioctl

我有一个IOCTL发送到我的驱动程序结构,结构成功通过,然后我的驱动程序发挥其魔力,但当它完成它应该返回一个简单的无符号_int64,这是8字节长,我设置IRP的IoStatus.Information到无符号_int64(8字节)的大小,我将值复制到AssociatedIrp.SystemBuffer,最后我将IoStatus.Status设置为STATUS_SUCCESS,然后调用IoCompleteRequest。

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

对不起,我不能发布任何代码,因为我不拥有它以及其他原因。

1 个答案:

答案 0 :(得分:0)

希望自3年前发布此问题以来,您已经找到了解决方案。我们在调查类似内容时遇到了这篇文章,该解决方案非常简单,但没有记录在案。 如果驱动程序将一些数据复制到输出缓冲区,并使用状态为OK的WdfRequestComplete,则没有任何内容返回给调用方!您需要调用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);