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


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