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


Отслеживание IRQL

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

Существуют и другие флаги, которые управляют другими атрибутами, но названия флагов уровня диспетчеризации:

NDIS_SEND_FLAGS_DISPATCH_LEVEL

NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL

NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL

Флаги возврата NDIS - уровень выполнения диспетчера (NDIS_RETURN_FLAGS_DISPATCH_LEVEL)

NDIS_RWL_AT_DISPATCH_LEVEL

Звонящий должен определить настройку флага диспетчерского уровня, исходя из известного текущего IRQL, а не тестировать IRQL. Например, вы знаете IRQL, так как он является фиксированной характеристикой дизайна драйвера, или драйвер сохранил текущий IRQL.

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

Драйверы не должны проверять IRQL для определения значения флага уровня отправки. Тестирование сводит на нет цель флага. При необходимости вызываемая функция может просто выполнить тестирование. Как драйвер определяет, должен ли он устанавливать флаг или нет, решается при проектировании конкретного драйвера.