функция обратного вызова 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это значение не используется.
Возвращаемое значение
Никакой
Замечания
Чтобы создать объект DPC и зарегистрировать процедуру CustomDpc для этого объекта, драйвер должен вызвать KeInitializeDpc. (Если требуется только одна подпрограмма DPC, можно использовать подпрограмму DpcForIsr и объект DPC, выделенный системой.)
Чтобы очередь подпрограммы CustomDpc для выполнения, подпрограмма прерывания драйвера должна вызывать KeInsertQueueDpc.
Одно или несколько подпрограмм CustomDpc можно использовать вместо подпрограммы DpcForIsr. Драйвер, который поддерживает несколько внутренних очередей IRP, обычно предоставляет подпрограмму CustomDpc для каждой очереди. Каждая CustomDpc подпрограмма обычно отвечает по крайней мере за следующие задачи:
Завершение операции ввода-вывода, описанной текущим IRP.
Отмена следующего IRP из одной из очередей IRP драйвера. (Драйверы, использующие системную очередь IRP вместе с подпрограммным вызовом StartIoIoStartNextPacket.)
Задание блока состояния ввода-вывода в текущем IRP и вызове IoCompleteRequest для завершенного запроса.
Подпрограмма CustomDpc может также повторить неудачную операцию или настроить следующую передачу для большого запроса ввода-вывода, который был разбит на небольшие части.
Дополнительные сведения о подпрограммах CustomDpc см. в объектах DPC и ЦП.
Драйвер регистрирует CustomThreadedDpc для объекта DPC путем вызова KeInitializeThreadedDpc. Чтобы фактически добавить DPC в очередь DPC, чтобы программа CustomThreadedDpc выполнялась, вызовите KeInsertQueueDpc.
Дополнительные сведения об использовании подпрограмм CustomThreadedDpc см. в разделе Введение в потоковые.
Подпрограмма CustomThreadedDpc может выполняться в IRQL = DISPATCH_LEVEL или может выполняться в IRQL = PASSIVE_LEVEL в потоке в режиме реального времени.
Чтобы создать объект DPC и зарегистрировать CustomTimerDpc подпрограмму для этого объекта, драйвер должен вызвать KeInitializeDpc.
Чтобы очередь подпрограммы CustomTimerDpc CustomTimerDpc для выполнения, подпрограмма драйвера должна вызывать KeSetTimer или KeSetTimerEx, указав указатель объекта DPC, возвращаемый KeInitializeDpc. Система вызывает подпрограмму CustomTimerDpc, когда истекает интервал таймера.
Дополнительные сведения о подпрограммах CustomTimerDpc см. в объектах таймера иЦП.
Примеры
Чтобы определить подпрограмму обратного вызова, необходимо сначала указать объявление функции, определяющее тип определяемой процедуры обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализ кода для драйверов, статический проверяющий драйвер (SDV) и другие средства проверки подлинности, и это требование для написания драйверов для операционной системы Windows.
Например, чтобы определить подпрограмму обратного вызова CustomDpc 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 (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Вызывается в DISPATCH_LEVEL. |