Поделиться через


функция обратного вызова 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.

См. также раздел

KeInsertQueueDpc

KeSetTimer

KeSetTimerEx