функция обратного вызова IO_DPC_ROUTINE (wdm.h)
Подпрограмма DpcForIsr завершает обслуживание операции ввода-вывода после возврата подпрограммы InterruptService .
Синтаксис
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.
Возвращаемое значение
None
Remarks
Чтобы зарегистрировать подпрограмму DpcForIsr для определенного объекта устройства, драйвер должен вызвать IoInitializeDpcRequest, в результате чего система выделяет и инициализирует один объект DPC. (Если вам нужно несколько подпрограмм DPC, используйте подпрограммы CustomDpc .)
Чтобы поместить подпрограмму DpcForIsr в очередь для выполнения, подпрограмма Прерывания драйвера должна вызвать IoRequestDPC.
Подпрограмма DpcForIsr обычно отвечает по крайней мере за следующие задачи:
Завершение операции ввода-вывода, описанной полученной IRP.
Вывод из очереди следующего IRP.
Если драйвер использует предоставленную системой очередь IRP, подпрограмма DpcForIsr должна вызвать IoStartNextPacket или IoStartNextPacketByKey, поэтому подпрограмма StartIo драйвера начнет обработку следующего запроса ввода-вывода.
Если драйвер использует внутренние очереди IRP, подпрограмма DpcForIsr должна выпустить следующий IRP и начать обработку для следующего запроса ввода-вывода.
Установка блока состояния ввода-вывода в полученном IRP и вызов IoCompleteRequest для завершенного запроса.
Подпрограмма DpcForIsr также может повторить неудачную операцию или настроить следующую передачу для большого запроса ввода-вывода, разбитого на более мелкие части.
Дополнительные сведения о подпрограммах DpcForIsr см. в разделе Объекты DPC и DPC.
Примеры
Чтобы определить подпрограмму обратного вызова 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 (включая Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Звонил на DISPATCH_LEVEL. |