使用 DeviceIoControl 从应用程序向驱动程序发送数据

Posted

技术标签:

【中文标题】使用 DeviceIoControl 从应用程序向驱动程序发送数据【英文标题】:data send using DeviceIoControl from app to driver 【发布时间】:2015-01-09 04:56:16 【问题描述】:

我可以将数据驱动程序发送到应用程序。

应用内:

DeviceIoControl(dHandle, IOCTL_TEST, (PVOID)InputBuffer, sizeof(InputBuffer), (PVOID)OutputBuffer, sizeof(OutputBuffer), &dwRet, 0);
printf("num : %s\n", OutputBuffer);

在驱动程序中:

char pData[1024];
pData="eeee";
case IOCTL_TEST:
        pInputBuffer = Irp->AssociatedIrp.SystemBuffer;
        pOutputBuffer = Irp->AssociatedIrp.SystemBuffer;
        inputBufferLength = pStack->Parameters.DeviceIoControl.OutputBufferLength;
        RtlCopyMemory(pOutputBuffer, pData, strlen(pData));
        break;
Irp.iostatus.Information=1024;

结果在应用程序控制台中打印"eeee"

但我不知道如何将应用数据发送给驱动程序。 DeviceIoControl的3、4个参数是输入缓冲区和长度。 如果我在应用程序中添加char InputBuffer[1024] = "InputBuffer's data";,驱动程序如何接收此数据? 我想使用DbgPrint() 接收来自应用程序的数据。


我想选择答案。请回答不要评论。

【问题讨论】:

取决于控制码中的TransferType参数。对于METHOD_BUFFERED,设备驱动程序只是从pInputBuffer 读取数据。这一切都在msdn.microsoft.com/en-us/library/windows/hardware/… 进行了描述 hm...这是我的想法...我调用 Irp->AssociatedIrp.Systembuffer 2 tiems,所以 pInputBuffer 和 pOutputBuffer 指向相同的地址。 RtlCopyMemory() 用 pData 写入 pOutputBuffer。然后,如果 pInputBuffer 有来自应用程序的数据,则该数据消失了。因此我必须将 pInputBuffer(data from app) 复制到另一个缓冲区,并且必须调用 RtlCopyMemory 将数据写入应用程序。对吗? 是的。如果您需要在写入输出数据之后 使用输入数据,则必须将输入数据复制到某处。不过,通常情况下,您会先处理输入数据(例如将其发送到 DbgPrint),然后才将输出数据写入缓冲区。 感谢您的帮助。我在应用程序 - 驱动程序通信方面取得了成功。但是,如果我想首先并且几乎每次都将数据从驱动程序发送到应用程序,(不需要将数据从应用程序写入驱动程序),DeviceIoControl 不适合。 其实我是开发包过滤驱动的。所以调用了drver中的抓包函数。我想将捕获的这个数据包数据发送到应用程序。但是 DeviceIoControl 必须在应用程序中调用。应用程序只需要在驱动程序发送时从驱动程序读取数据包数据。此发送工作发生的速度快于 1 秒。 ...驱动程序仅将数据包数据写入应用程序,应用程序仅在驱动程序发送数据包数据时读取数据包。 【参考方案1】:

我解决了。 解决方案是 驱动程序使用 Irp->AssociatedIrp.Systembuffer 从应用程序接收数据;所以,只需打印这个指针的数据。

【讨论】:

以上是关于使用 DeviceIoControl 从应用程序向驱动程序发送数据的主要内容,如果未能解决你的问题,请参考以下文章

DeviceIoControl 返回 ERROR_ACCESS_DENIED

使用 usbser.sys 冻结 SerialPort.Open / DeviceIoControl / GetcommState

带有输入无符号字符缓冲区 C++ 的 DeviceIoControl

使用带有 FSCTL_LOCK_VOLUME 的 DeviceIoControl 来锁定卷。调试器问题

使用 DeviceIoControl 都有哪些好的策略?

用于 DeviceIOControl 的 SetWindowsHookEx,要使用啥 hookid?