Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Поле "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;