Обработка IRP, который не поддерживается платформой
[Применяется только к KMDF]
Платформа не поддерживает запросы ввода-вывода со следующими основными кодами IRP:
- IRP_MJ_CREATE_MAILSLOT
- IRP_MJ_CREATE_NAMED_PIPE
- IRP_MJ_DEVICE_CHANGE
- IRP_MJ_DIRECTORY_CONTROL
- IRP_MJ_FILE_SYSTEM_CONTROL
- IRP_MJ_FLUSH_BUFFERS
- IRP_MJ_LOCK_CONTROL
- IRP_MJ_QUERY_EA
- IRP_MJ_QUERY_INFORMATION
- IRP_MJ_QUERY_QUOTA
- IRP_MJ_QUERY_SECURITY
- IRP_MJ_QUERY_VOLUME_INFORMATION
- IRP_MJ_SET_EA
- IRP_MJ_SET_INFORMATION
- IRP_MJ_SET_QUOTA
- IRP_MJ_SET_SECURITY
- IRP_MJ_SET_VOLUME_INFORMATION
Если платформа получает IRP, которая содержит один из этих кодов функций ввода-вывода, платформа не обрабатывает IRP. Если драйвер является драйвером фильтра, платформа передает IRP следующему ниже драйверу в стеке драйверов. Если драйвер не является драйвером фильтра, платформа вызывает IoCompleteRequest , чтобы завершить IRP со значением состояния STATUS_INVALID_DEVICE_REQUEST.
Если драйвер должен обрабатывать irP, содержащие любой из этих кодов функций ввода-вывода, драйвер должен вызвать WdfDeviceInitAssignWdmIrpPreprocessCallback , чтобы зарегистрировать функцию обратного вызова события EvtDeviceWdmIrpPreprocess для кода функции ввода-вывода.
Когда драйвер получает IRP, содержащий код функции ввода-вывода, для которого драйвер зарегистрировал функцию обратного вызова EvtDeviceWdmIrpPreprocess , платформа передает IRP функции обратного вызова. Затем функция обратного вызова должна обработать IRP, следуя правилам WDM для обработки IRP. Драйвер должен вызвать IoCompleteRequest для завершения IRP или вызвать IoCallDriver для передачи IRP следующему драйверу.
Пример функции обратного вызова EvtDeviceWdmIrpPreprocess , которая обрабатывает IRP, не поддерживаемую платформой, см. в примере драйвера Serial .