使用DirectIO传递DeviceIoControl输入缓冲区

时间:2014-10-12 19:53:39

标签: windows kernel driver system

我知道我们可以使用带有METHOD_IN_DIRECT的IOCTL从驱动程序获取输出缓冲区。但是可以通过OSR上的METHOD_IN_DIRECT / METHOD_OUT_DIRECT.I传递输入缓冲区,即METHOD_IN_DIRECT / METHOD_OUT_DIRECT仅适用于输出缓冲区。为什么输入缓冲IO总是直接IO。

1 个答案:

答案 0 :(得分:0)

如果使用METHOD_IN_DIRECT定义控制代码,则DeviceIoControl具有以下签名:

BOOL WINAPI DeviceIoControl(
  _In_         HANDLE hDevice,
  _In_         DWORD dwIoControlCode,
  _In_opt_     LPVOID lpInBuffer1,
  _In_         DWORD nInBuffer1Size,
  _In_opt_     LPVOID lpInBuffer2,
  _In_         DWORD nInBuffer2Size,
  _Out_opt_    LPDWORD lpBytesReturned,
  _Inout_opt_  LPOVERLAPPED lpOverlapped
);

请注意,有两个输入缓冲区(两个都包含要读取的设备驱动程序的数据)和没有输出缓冲区(因此设备驱动程序无法将任何数据返回到用户模式)。

第一个输入缓冲区lpInBuffer1被复制到系统缓冲区,因此它应该相对较小。如果控制代码不需要两个输入缓冲区,lpInBuffer1将为NULL

第二个输入缓冲区lpInBuffer2可通过Direct IO提供给设备驱动程序,因此适用于大型缓冲区和/或与DMA或PIO一起使用。

应该注意的是,Windows似乎不包含任何使用METHOD_IN_DIRECT作为用户模式可访问的控制代码的驱动程序。 (它用于驱动程序之间传递的某些控制代码。)但是,第三方设备驱动程序可以提供使用此方法的控制代码。