Страничный и отбрасываемый код в драйвере протокола
Разработчики драйверов должны по возможности назначать код как доступный для страниц, освобождая системное пространство для кода, который должен быть резидентом памяти. Функции можно пометить как доступные для страницы с помощью макроса NDIS_PAGEABLE_FUNCTION . IrQL, функции управления ресурсами и другие характеристики функции могут запретить функцию быть страничной.
Каждая функция ProtocolXxx выполняется в irQL в диапазоне от PASSIVE_LEVEL до DISPATCH_LEVEL. Функции, которые выполняются исключительно в IRQL = PASSIVE_LEVEL, должны быть помечены как доступные для страниц.
Функцию драйвера, которая выполняется в IRQL = PASSIVE_LEVEL, можно сделать страничной, если она не вызывается и не вызывается какой-либо функцией, которая выполняется в IRQL >= DISPATCH_LEVEL, например функция, получающая спиновую блокировку. Получение блокировки спина приводит к тому, что IRQL потока получения вызывается до DISPATCH_LEVEL. Функция драйвера, например ProtocolBindAdapterEx, которая выполняется в IRQL = PASSIVE_LEVEL не должна вызывать функции NdisXxx , которые выполняются в IRQL >= DISPATCH_LEVEL если эта функция драйвера помечена как страничный код. Дополнительные сведения о IRQL для каждой функции NdisXxx см. в разделе Функции библиотеки NDIS.
Функцию DriverEntry драйверов протокола NDIS, а также код, вызываемый только из DriverEntry, следует указать как код только инициализации с помощью макроса NDIS_INIT_FUNCTION . Предполагается, что код, идентифицируемый с помощью этого макроса, выполняется только один раз во время инициализации системы и, как следствие, сопоставляется только в течение этого времени. После возврата функции, помеченной как только инициализация, она удаляется.