функция обратного вызова IO_DPC_ROUTINE (wdm.h)
Подпрограмма DpcForIsr завершает обслуживание операции ввода-вывода после возврата подпрограммы Прерывание.
Синтаксис
IO_DPC_ROUTINE IoDpcRoutine;
void IoDpcRoutine(
[in] PKDPC Dpc,
[in] _DEVICE_OBJECT *DeviceObject,
[in, out] _IRP *Irp,
[in, optional] PVOID Context
)
{...}
Параметры
[in] Dpc
Вызывающий указатель на структуру KDPC, которая представляет объект DPC, связанный с этой подпрограммой DpcForIsr.
[in] DeviceObject
Указатель на DEVICE_OBJECT структуру, предоставляемую вызывающим абонентом. Это объект устройства для целевого устройства, ранее созданный драйвера AddDevice.
[in, out] Irp
Вызывающий указатель на структуру IRP, описывающую операцию ввода-вывода.
[in, optional] Context
Указатель на определяемые драйвером контекстные сведения, указанные в предыдущем вызове IoRequestDpc.
Возвращаемое значение
Никакой
Замечания
Чтобы зарегистрировать подпрограмму DpcForIsr для определенного объекта устройства, драйвер должен вызвать IoInitializeDpcRequest, что приводит к выделению и инициализации одного объекта DPC. (Если требуется несколько подпрограмм DPC, используйте подпрограммы CustomDpc.)
Чтобы очередь подпрограммы DpcForIsr для выполнения, подпрограмма прерывания драйвера должна вызывать IoRequestDPC.
Обычно подпрограмма DpcForIsr отвечает по крайней мере за следующие задачи:
Завершение операции ввода-вывода, описанной полученным IRP.
Отмена следующего IRP.
Если драйвер использует очередь IRP, предоставленной системой, подпрограмма DpcForIsr должна вызывать IoStartNextPacket или IoStartNextPacketByKey, поэтому подпрограмма драйвера StartIo начнет обработку следующего запроса ввода-вывода.
Если драйвер использует внутренние очереди IRP, подпрограмма DpcForIsr должна открепить следующий IRP и начать обработку для следующего запроса ввода-вывода.
Задание блока состояния ввода-вывода в полученном IRP и вызове IoCompleteRequest для завершенного запроса.
Процедура DpcForIsr может также повторить неудачную операцию или настроить следующую передачу для большого запроса ввода-вывода, который был разбит на небольшие части.
Дополнительные сведения о подпрограммах DpcForIs r см. в объектов DPC и DPCs.
Примеры
Чтобы определить подпрограмму обратного вызова DpcForIsr, необходимо сначала указать объявление функции, определяющее тип определяемой процедуры обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализ кода для драйверов, статический проверяющий драйвер (SDV) и другие средства проверки подлинности, и это требование для написания драйверов для операционной системы Windows.
Например, чтобы определить подпрограмму обратного вызова DpcForIsr с именем MyDpcForIsr
, используйте тип IO_DPC_ROUTINE, как показано в этом примере кода:
IO_DPC_ROUTINE MyDpcForIsr;
Затем реализуйте подпрограмму обратного вызова следующим образом:
_Use_decl_annotations_
VOID
MyDpcForIsr(
PKDPC Dpc,
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp,
PVOID Context
)
{
// Function body
}
Тип функции IO_DPC_ROUTINE определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте в определение функции _Use_decl_annotations_
заметку. Заметка _Use_decl_annotations_
гарантирует, что используются заметки, применяемые к типу функции IO_DPC_ROUTINE в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в объявлении функций с помощью типов ролей функций для драйверов WDM. Сведения о _Use_decl_annotations_
см. в поведению функции.
Требования
Требование | Ценность |
---|---|
целевая платформа | Настольный |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Вызывается в DISPATCH_LEVEL. |