我知道我们可以使用带有METHOD_IN_DIRECT的IOCTL从驱动程序获取输出缓冲区。但是可以通过OSR上的METHOD_IN_DIRECT / METHOD_OUT_DIRECT.I传递输入缓冲区,即METHOD_IN_DIRECT / METHOD_OUT_DIRECT仅适用于输出缓冲区。为什么输入缓冲IO总是直接IO。
答案 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作为用户模式可访问的控制代码的驱动程序。 (它用于驱动程序之间传递的某些控制代码。)但是,第三方设备驱动程序可以提供使用此方法的控制代码。