Поделиться через


Поддержка 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 невозможно легко переписать, чтобы исключить использование типов данных буфера точности указателя.