ドライバー開発者は、可能な限りページング可能なコードを指定し、メモリ常駐である必要があるコードのシステム領域を解放する必要があります。 NDIS_PAGEABLE_FUNCTION マクロを使用して、関数をページング可能としてマークできます。 IRQL、リソース管理機能、および関数のその他の特性により、関数がページングできない場合があります。
すべての ProtocolXxx 関数は、PASSIVE_LEVEL から DISPATCH_LEVEL までの範囲の IRQL で実行されます。 IRQL = PASSIVE_LEVEL でのみ実行される関数は、ページング可能としてマークする必要があります。
IRQL = PASSIVE_LEVEL で実行されるドライバー関数は、IRQL >= DISPATCH_LEVEL で実行される関数 (例えば、スピン ロックを取得する関数) を呼び出すことがなく、またその関数から呼び出されない限り、ページング可能にすることができます。 スピン ロックを取得すると、取得するスレッドのIRQLはDISPATCH_LEVELに上げられます。 IRQL = PASSIVE_LEVEL で実行される ProtocolBindAdapterEx などのドライバー関数は、そのドライバー関数がページング可能なコードとしてマークされている場合、IRQL >= DISPATCH_LEVELで実行される NdisXxx 関数を呼び出してはなりません。 各 NdisXxx 関数の IRQL の詳細については、 NDIS ライブラリ関数を参照してください。
NDIS プロトコル ドライバーの DriverEntry 関数と、 DriverEntry からのみ呼び出されるコードは、 NDIS_INIT_FUNCTION マクロを使用して初期化専用コードとして指定する必要があります。 このマクロで識別されるコードは、システム初期化時に 1 回だけ実行されると見なされ、その結果、その間にのみマップされます。 初期化専用としてマークされた関数が返されると、破棄されます。