在64-bit 驱动中支持32-bit I/O 操作

原文

https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/supporting-32-bit-i-o-in-your-64-bit-driver

        WOW64 机制使得Win32 用户模式应用程序可以在64-bit windows 上运行。在Win32 函数调用转移到64-bit 内核之前,截获其调用并将指针精度类型的参数转化为恰当的固定精度的类型。这种转换叫做thunking,除了传递给DeviceIoControl 的数据缓冲外,其自动应用在所有的Win32 函数上。这些缓冲区的内容是通过InputBuffer和OutputBuffer 参数指定的,其并没有被thunk,因为它们的结构是驱动相关的。
        尽管缓冲区内容没有被thunk,缓冲区指针被转换为64-bit 指针。
        用户模式应用程序调用DeviceIoControl 函数来直接向特定的内核模式驱动发送一个I/O 请求。这个请求包含一个I/O 控制码(IOCTL)或者文件系统控制码(FSCTL)和指向输入和输出缓冲区的指针。这些数据缓冲区的结构是由IOCTL 或者 FSCTL 指定的,另外,这IOCTL 和 FSCTL 是由内核模式驱动定义的。因为缓冲区格式是任意的,只有定义它的驱动知道它的结构,而WOW64并不知道它的结构,所以thunk 这些数据的任务就留给了驱动。
        驱动程序满足下面的要求时将支持32-bit I/O。

  1. 驱动暴露一个IOCTL(或FSCTL)给用户模式应用程序。
  2. IOCTL 所使用的I/O 缓冲区至少有一个包含指针精度的数据类型。
  3. IOCTL 不能轻易被重写以消除指针精度的缓存数据类型的使用。

猜你喜欢

转载自blog.csdn.net/qq_18218335/article/details/78237108