Поддержка 32-разрядного ввода-вывода в 64-разрядном драйвере

Windows в Windows (WOW64) позволяет приложениям в режиме пользователя Microsoft Win32 работать в 64-разрядной версии Windows. Это делается путем перехвата вызовов функций Win32 и преобразования параметров из 32-разрядных типов указателей в 64-разрядные типы указателей, как это необходимо, прежде чем переходить к 64-разрядному ядру. Это преобразование, которое называется thunking, выполняется автоматически для всех функций Win32 с одним важным исключением: буферы данных, передаваемые в DeviceIoControl. Содержимое этих буферов, на которые указывают параметры InputBuffer и OutputBuffer, не преобразуется, так как их структура является специфичной для драйвера.

Заметка Хотя содержимое буфера не модифицировано, указатели буфера преобразуются в 64-разрядные.

Приложения в пользовательском режиме вызывают DeviceIoControl для отправки запроса ввода-вывода непосредственно в указанный драйвер режима ядра. Этот запрос содержит код управления ввода-вывода (IOCTL) или код управления файловой системой (FSCTL) и указатели на буферы входных и выходных данных. Формат этих буферов данных зависит от IOCTL или FSCTL, который, в свою очередь, определяется драйвером режима ядра. Так как формат буфера является произвольным и известен драйверу, а не WOW64, задача преобразования данных возлагается на драйвер.

64-разрядный драйвер должен поддерживать 32-разрядный ввод-вывод, если выполняются все следующие условия:

  • Драйвер предоставляет IOCTL (или FSCTL) приложениям в пользовательском режиме.

  • По крайней мере один из буферов ввода-вывода, используемых IOCTL, содержит типы данных точности указателя.

  • Код IOCTL не может быть легко перезаписан, чтобы исключить использование типов данных буфера точности указателя.