Определение уровня 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, который не допускает подкачку страниц.

Другие вопросы по тегам