Программирование драйверов Windows

Проверка корректности вызовов кода, размещенного в страничной памяти


Если программный код размещен в страничной памяти, то в отладочной версии драйвера можно организовать проверку, всегда ли он вызывается на должном уровне привилегий. Для странично размещенного кода этот уровень IRQL должен быть ниже DISPATCH_LEVEL.

Для выполнения этой работы сконструировано специальное макроопределение 'PAGED_CODE();', которое проверяет текущий уровень IRQL (не превышает ли он APC_LEVEL) и генерирует отладочное сообщение при помощи вызовов KdPrint и RtlAssert, которое можно наблюдать, например, в окне программы DebugView, если она к тому моменту запущена.

Кстати, сам факт существования макроопределения PAGED_CODE говорит о том, что использование станичной памяти на высоких уровнях IRQL является некорректным не само по себе (иногда оно может "сойти с рук"). Причина в том, что данное стечение обстоятельств является потенциальной угрозой правилам системы: она откажется обслуживать ситуацию, когда данная страничная память окажется на диске, а уровень IRQL будет столь же высок.

В том случае, если выявлено диагностическое сообщение от макроопределения PAGED_CODE, следует изменить тактику использования страничной памяти в указанном месте программного кода (в сообщении указан файл и строка, где возникла некорректная ситуация), возможно, отказаться от нее.



Содержание раздела