IRP-Based операций IOCTL и FSCTL
В следующих операциях ввода-вывода на основе IRP используется метод буферизации, соответствующий типу передачи, указанному в определении кода управления ввода-вывода (IOCTL) или кода управления файловой системы (FSCTL):
IRP_MJ_DEVICE_CONTROL
IRP_MJ_FILE_SYSTEM_CONTROL
IRP_MJ_INTERNAL_DEVICE_CONTROL
Тип передачи указывается в параметре TransferType макроса CTL_CODE. Чтобы получить тип передачи для заданного IOCTL или FSCTL, используйте следующий макрос:
#define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
Этот макрос возвращает одно из следующих значений:
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
Дополнительные сведения о макросе CTL_CODE см. в разделе Определение кодов управления вводом-выводом.
Обратите внимание, что IRP_MJ_DEVICE_CONTROL также может быть быстрой операцией ввода-вывода. Если это быстрая операция ввода-вывода, она всегда не использует ни буферизованного, ни прямого ввода-вывода, независимо от типа передачи IOCTL. Дополнительные сведения о том, когда IRP_MJ_DEVICE_CONTROL может быть быстрой операцией ввода-вывода, см. в разделе Операции, которые могут быть IRP-Based или быстрые операции ввода-вывода.