在 64 位驱动程序中支持 32 位 I/O

Windows 上的 Windows (WOW64) 使 Microsoft Win32 用户模式应用程序能够在 64 位 Windows 上运行。 在转换到 64 位内核之前,它通过截获 Win32 函数调用并将参数从 32 位指针类型转换为 64 位指针类型(视情况转换为 64 位指针类型)来执行此操作。 对于所有 Win32 函数,此转换(称为 thunking)会自动完成,但有一个重要例外:传递给 DeviceIoControl 的数据缓冲区。 这些缓冲区的内容(由 InputBufferOutputBuffer 参数指向)不会被弹出,因为它们的结构特定于驱动程序。

注意 尽管缓冲区 内容 未受到限制,但缓冲区 指针 将转换为 64 位指针。

用户模式应用程序调用 DeviceIoControl 以将 I/O 请求直接发送到指定的内核模式驱动程序。 此请求包含 I/O 控制代码 (IOCTL) 或文件系统控制代码 (FSCTL) 和指向输入和输出数据缓冲区的指针。 这些数据缓冲区的格式特定于 IOCTL 或 FSCTL,后者又由内核模式驱动程序定义。 由于缓冲区格式是任意的,并且驱动程序知道它,而不是 WOW64,因此将数据转换的任务留给驱动程序。

如果满足以下所有条件,则 64 位驱动程序必须支持 32 位 I/O:

  • 驱动程序向用户模式应用程序公开 IOCTL (或 FSCTL) 。

  • IOCTL 使用的至少一个 I/O 缓冲区包含指针精度数据类型。

  • 无法轻松重写 IOCTL 代码,以消除指针精度缓冲区数据类型的使用。