Введение в обработку прерываний
DPC-объекты
Вызов DPC описывается Объектом DPC. Определение Объекта DPC (KDPC) произведено в ntddk.h и показано на рис. 16.
Рис. 16. Объект DPC
Объект DPC может быть выделен драйвером из любого невыгружаемого пространства (типа невыгружаемого пула). Объекты DPC инициализируются, используя функцию KelnitializeDpc(), прототип которой:
VOID KelnitializeDpc (IN PKDPC Dpc, IN PKDEFERRED^ROUTINE DeferredRoutine, IN PVOID DeferredContext);
Где:
- Dpc – Указатель на DPC объект, который надо инициализировать;
- DeferredRoutine – указатель на функцию, по которому должен быть сделан отложенный вызов на уровне IRQL DISPATCH_LEVEL.
Прототип функции DeferredRoutine следующий:
VOID (*PKDEFERRED_ROUTINE)( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgumentI, IN PVOID SystemArgument2);
Где:
DeferredContext – значение для передачи к DeferredRoutine в качестве параметра, вместе с указателем на объект DPC и двумя дополнительными параметрами.
Запрос на выполнение конкретной подпрограммы DPC делается путем помещения объекта DPC, описывающего эту подпрограмму DPC, в Очередь DPC заданного CPU, и последующим (обычно) запросом программного прерывания уровня IRQL dispatch_level.
Имеется по одной Очереди DPC на процессор. CPU, к которому объект DPC поставлен в очередь, является обычно текущим процессором, на котором выдан запрос (на прерывание). Как выбирается процессор для конкретного DPC, обсуждается позже, в разделе "Характеристики Объекта DPC".
Объект DPC ставится в очередь с помощью функцию KelnsertQueueDpc(), прототип которой:
VOID KelnsertQueueDpc (IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
Где:
- Dpc – Указывает на объект DPC, который нужно поставить в очередь;
- SystemArgumentl, SystemArgument2 – произвольные значения, которые нужно передать функции DeferredRoutme как 3 и 4 параметры соответственно, наряду с указателем на объект DPC и параметром DeferredContext, определенным при инициализации Объекта DPC.