Определение уровня IRQL
Как определить уровень IRQL для фрагмента кода драйвера? Макрос PAGED_CODE() указывает, что фрагмент кода может быть выполнен на уровне IRQL меньше, чем DISPATCH_LEVEL. Но как можно определить точный уровень IRQL.
1 ответ
Решение
KeGetCurrentIrql
Функция возвращает текущий IRQL:
KIRQL KeGetCurrentIrql(void);
PAGED_CODE
макрос использует эту функцию следующим образом:
#define PAGED_CODE() \
if (KeGetCurrentIrql() > APC_LEVEL) { \
KdPrint(( "EX: Pageable code called at IRQL %d\n", KeGetCurrentIrql() )); \
ASSERT(FALSE); \
}
Этот макрос должен быть помещен в любую функцию с возможностью постраничного вывода, он приводит к сбою драйвера в случае, когда функция вызывается на IRQL, который не допускает подкачку страниц.