функция обратного вызова KDEFERRED_ROUTINE (wdm.h)
Подпрограмма обратного вызова выполняет действия после того, как функция прерывания возвращает поток DPC,
Подпрограмма CustomDpc завершает обслуживание операции ввода-вывода после возврата подпрограммы InterruptService .
Подпрограмма CustomThreadedDpc выполняет действие потокового DPC. Система выполняет эту подпрограмму при запуске потокового DPC.
Подпрограмма CustomTimerDpc выполняется по истечении интервала времени объекта таймера.
Синтаксис
KDEFERRED_ROUTINE KdeferredRoutine;
void KdeferredRoutine(
[in] _KDPC *Dpc,
[in, optional] PVOID DeferredContext,
[in, optional] PVOID SystemArgument1,
[in, optional] PVOID SystemArgument2
)
{...}
Параметры
[in] Dpc
Предоставленный вызывающим объектом указатель на структуру KDPC , которая представляет объект DPC, связанный с этой подпрограммой обратного вызова.
[in, optional] DeferredContext
Для CustomDpc — предоставленный вызывающим объектом указатель на определяемые драйвером контекстные сведения, указанные в предыдущем вызове KeInitializeDpc.
Для CustomThreadedDpc указывает определяемые драйвером сведения о контексте. При инициализации объекта DPC драйвер предоставил это значение в качестве параметра DeferredContextдля KeInitializeThreadedDpc.
Предоставленный вызывающим объектом указатель на структуру KDPC , которая представляет объект DPC, связанный с этой подпрограммой CustomTimerDpc .
[in, optional] SystemArgument1
Предоставленный вызывающим объектом указатель на предоставленные драйвером сведения, указанные в предыдущем вызове KeInsertQueueDpc. При добавлении DPC в очередь DPC драйвер предоставил это значение в качестве параметра SystemArgument1для KeInsertQueueDpc.
Для CustomTimerDpc это значение не используется.
[in, optional] SystemArgument2
Указывает определяемые драйвером сведения о контексте. При добавлении DPC в очередь DPC драйвер предоставил это значение в качестве параметра SystemArgument2для KeInsertQueueDpc.
Для CustomTimerDpc это значение не используется.
Возвращаемое значение
None
Remarks
Чтобы создать объект DPC и зарегистрировать подпрограмму CustomDpc для этого объекта, драйвер должен вызвать KeInitializeDpc. (Если вам нужна только одна подпрограмма DPC, можно использовать подпрограмму DpcForIsr и выделенный системой объект DPC.)
Чтобы поставить подпрограмму CustomDpc в очередь для выполнения, подпрограмма Прерывания драйвера должна вызвать KeInsertQueueDpc.
Одну или несколько подпрограмм CustomDpc можно использовать вместо подпрограммы DpcForIsr или в сочетании с ней. Драйвер, который поддерживает несколько внутренних очередей IRP, обычно предоставляет подпрограмму CustomDpc для каждой очереди. Каждая подпрограмма CustomDpc обычно отвечает по крайней мере за следующие задачи:
Завершение операции ввода-вывода, описанной текущим IRP.
Вывод следующего IRP из одной из очередей IRP драйвера. (Драйверы, использующие предоставленную системой очередь IRP вместе с подпрограммой StartIo , вызывают IoStartNextPacket.)
Установка блока состояния ввода-вывода в текущем IRP и вызов IoCompleteRequest для завершенного запроса.
Подпрограмма CustomDpc также может повторить неудачную операцию или настроить следующую передачу для большого запроса ввода-вывода, разбитого на более мелкие части.
Дополнительные сведения о подпрограммах CustomDpc см. в разделе Объекты И DPC DPC.
Драйвер регистрирует CustomThreadedDpc для объекта DPC, вызывая KeInitializeThreadedDpc. Чтобы добавить DPC в очередь DPC для выполнения подпрограммы CustomThreadedDpc , вызовите KeInsertQueueDpc.
Дополнительные сведения об использовании процедур CustomThreadedDpc см. в статье Введение в потоковые DPC.
Подпрограмма CustomThreadedDpc может выполняться в IRQL = DISPATCH_LEVEL или в IRQL = PASSIVE_LEVEL в потоке в режиме реального времени.
Чтобы создать объект DPC и зарегистрировать подпрограмму CustomTimerDpc для этого объекта, драйвер должен вызвать KeInitializeDpc.
Чтобы поставить подпрограмму CustomTimerDpc в очередь для выполнения, подпрограмма драйвера должна вызвать KeSetTimer или KeSetTimerEx, указав указатель объекта DPC, возвращенный KeInitializeDpc. Система вызывает подпрограмму CustomTimerDpc по истечении интервала таймера.
Дополнительные сведения о подпрограммах CustomTimerDpc см. в разделе Объекты таймера и DPC.
Примеры
Чтобы определить подпрограмму обратного вызова, необходимо сначала предоставить объявление функции, определяющее тип определяемой процедуры обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.
Например, чтобы определить подпрограмму обратного вызова CustomDpc с именем MyCustomDpc
, используйте тип KDEFERRED_ROUTINE, как показано в следующем примере кода:
KDEFERRED_ROUTINE MyCustomDpc;
Затем реализуйте процедуру обратного вызова следующим образом:
_Use_decl_annotations_
VOID
MyCustomDpc(
struct _KDPC *Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
PVOID SystemArgument2
)
{
// Function body
}
Требования
Требование | Значение |
---|---|
Целевая платформа | Персональный компьютер |
Верхняя часть | wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Звонил на DISPATCH_LEVEL. |