Auslagerungs- und verwerfbarer Code in einem Protokolltreiber
Treiberentwickler sollten Code nach Möglichkeit als ausserstellbar festlegen und so Systemspeicherplatz für Code freigeben, der speicherresident sein muss. Sie können Funktionen mit dem makro NDIS_PAGEABLE_FUNCTION als ausgelagert markieren. IrQL, Ressourcenverwaltungsfeatures und andere Merkmale einer Funktion können verhindern, dass die Funktion ausgelagert werden kann.
Jede ProtocolXxx-Funktion wird an einem IRQL im Bereich von PASSIVE_LEVEL bis DISPATCH_LEVEL ausgeführt. Funktionen, die ausschließlich unter IRQL = PASSIVE_LEVEL ausgeführt werden, sollten als ausgelagert markiert werden.
Eine Treiberfunktion, die unter IRQL = PASSIVE_LEVEL ausgeführt wird, kann ausgelagert werden, solange sie weder von einer Funktion aufgerufen wird, die unter IRQL >= DISPATCH_LEVEL ausgeführt wird, wie z. B. eine Funktion, die eine Drehsperre erhält. Durch das Abrufen einer Drehsperre wird die IRQL des abrufenden Threads auf DISPATCH_LEVEL erhöht. Eine Treiberfunktion, z. B . ProtocolBindAdapterEx, die unter IRQL = PASSIVE_LEVEL ausgeführt wird, darf keine NdisXxx-Funktionen aufrufen, die unter IRQL >= DISPATCH_LEVEL ausgeführt werden, wenn diese Treiberfunktion als auslagerungsfähiger Code gekennzeichnet ist. Weitere Informationen zum IRQL für jede NdisXxx-Funktion finden Sie unter NDIS-Bibliotheksfunktionen.
Die DriverEntry-Funktion von NDIS-Protokolltreibern sowie Code, der nur von DriverEntry aufgerufen wird, sollten mithilfe des makros NDIS_INIT_FUNCTION als nur Initialisierungscode angegeben werden. Es wird davon ausgegangen, dass code, der mit diesem Makro identifiziert wird, nur einmal zum Zeitpunkt der Systeminitialisierung ausgeführt wird und daher nur während dieser Zeit zugeordnet wird. Nachdem eine Als nur initialisierungsgeschützte Funktion zurückgegeben wurde, wird sie verworfen.