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


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 или быстрые операции ввода-вывода.