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


функция обратного вызова EVT_WDF_DPC (wdfdpc.h)

[Применяется только к KMDF]

Функция обратного вызова EvtDpcFunc драйвера выполняет определяемые драйвером операции в IRQL = DISPATCH_LEVEL.

Синтаксис

EVT_WDF_DPC EvtWdfDpc;

void EvtWdfDpc(
  [in] WDFDPC Dpc
)
{...}

Параметры

[in] Dpc

Дескриптор объекта DPC платформы.

Возвращаемое значение

None

Remarks

Чтобы зарегистрировать функцию обратного вызова EvtDpcFunc , драйвер должен поместить адрес функции в структуру WDF_DPC_CONFIG и вызвать WdfDpcCreate.

Драйверы обычно выполняют запросы ввода-вывода в функциях обратного вызова EvtDpcFunc .

Функция обратного вызова EvtDpcFunc выполняется в DISPATCH_LEVEL и не должна обращаться к коду для страничного доступа . Если функция обратного вызова EvtDpcFunc должна выполнять операции в IRQL = PASSIVE_LEVEL, она может использовать рабочие элементы платформы.

Вместо предоставления функций обратного вызова EvtDpcFunc многие драйверы предоставляют одну функцию обратного вызова EvtInterruptDpc для каждого типа прерывания, поддерживаемого устройствами. Если драйвер создает несколько объектов очереди платформы для каждого устройства, можно использовать отдельный объект DPC и функцию обратного вызова EvtDpcFunc для каждой очереди.

Чтобы запланировать выполнение функции обратного вызова EvtDpcFunc , драйвер должен вызвать WdfDpcEnqueue. Драйверы обычно вызывают WdfDpcEnqueue из функции обратного вызова EvtInterruptIsr .

Когда драйвер вызывает WdfDpcEnqueue, система добавляет объект DPC в очередь DPC системы. Если система не выполняет задачи с более высоким приоритетом, она удаляет объект из очереди и вызывает функцию обратного вызова EvtDpcFunc объекта.

Система не добавляет объект DPC в очередь DPC, если объект уже находится в очереди. Функция обратного вызова EvtInterruptIsr может вызываться несколько раз, прежде чем система вызовет функцию обратного вызова EvtDpcFunc . Таким образом, функция обратного вызова EvtDpcFunc должна иметь возможность обрабатывать сведения из нескольких прерываний и обрабатывать все прерывания, возникшие с момента последнего вызова.

Как правило, необходимо синхронизировать выполнение функции обратного вызова EvtDpcFunc драйвера с выполнением других функций обратного вызова. Дополнительные сведения см. в разделе Синхронизация кода прерывания.

Чтобы получить дескриптор родительского объекта DPC, функция обратного вызова EvtDpcFunc может вызвать WdfDpcGetParentObject. Чтобы получить указатель на базовую структуру KDPC объекта DPC, функция обратного вызова EvtDpcFunc может вызвать WdfDpcWdmGetDpc.

Дополнительные сведения об использовании функций обратного вызова EvtDpcFunc см. в разделе Обслуживание прерывания.

Требования

Требование Значение
Целевая платформа Универсальное
Минимальная версия KMDF 1,0
Верхняя часть wdfdpc.h (включая Wdf.h)
IRQL DISPATCH_LEVEL

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

EvtInterruptDpc

EvtInterruptIsr

WDF_DPC_CONFIG

WdfDpcCreate

WdfDpcEnqueue

WdfDpcGetParentObject

WdfDpcWdmGetDpc