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


Метод 1. Определение поля "64Bit"

Поле "64Bit" определяется в коде элемента управления IOCTL или FSCTL. Это поле содержит битовый флаг, который всегда устанавливается для 64-разрядных вызывающих абонентов, но всегда является ясным для 32-разрядной. Какой бит в коде управления выбран в качестве поля "64Bit", зависит от драйвера, но он должен быть битом, который никогда не устанавливается для 32-разрядных вызывающих элементов. Хорошим выбором для большинства драйверов является наиболее значимый бит (MSB) в поле Функция.

Например, коды управления IOCTL (FSCTL), используемые в 32-разрядных драйверах, содержат четыре битовых поля:

Тип устройства Access Функция Метод

16 бит

2 бита

12 бит

2 бита

Если ни один из существующих кодов управления, определенных драйвером, не задает MSB в поле Функция, эти коды управления могут по-прежнему использоваться 32-разрядными приложениями в пользовательском режиме.

Для размещения 64-разрядных вызывающих абонентов драйвер определяет поле Функции, которое короче на один бит. Этот бит переопределен как поле "64Bit":

Тип устройства Access 64Bit Функция Метод

16 бит

2 бита

1 бит

11 бит

2 бита

В следующем примере кода показано, как определить поле "64Bit" в файле заголовка драйвера:

#define REGISTER_FUNCTION 0     // Define the IOCTL function code

#ifdef  _WIN64
#define CLIENT_64BIT   0x800
#define REGISTER_FUNCTION 0
#define IOCTL_REGISTER   CTL_CODE(FILE_DEVICE_UNKNOWN, \
  CLIENT_64BIT|REGISTER_FUNCTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
#else
#define IOCTL_REGISTER   CTL_CODE(FILE_DEVICE_UNKNOWN, \
  REGISTER_FUNCTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif

typedef struct _IOCTL_PARAMETERS {
    PVOID   Addr;
    SIZE_T  Length;
    HANDLE  Handle;
} IOCTL_PARAMETERS, *PIOCTL_PARAMETERS;