Freigeben über


Einschränkungen für ausgelagerten Code in Speichertreibern

Um deadlocks zu verhindern, sollte kein Teil eines Speichertreibers, der zum Verarbeiten von Lese- oder Schreibanforderungen verwendet wird, über auslagerungsfähigen Code verfügen und auch nicht versuchen, auf ausgelagerten Speicher zuzugreifen. Dies liegt daran, dass die DispatchRead - und DispatchWrite-Routinen des Treibers am IRQL-PASSIVE_LEVEL > aufgerufen werden können, und die In-Paging-E/A, die einen Seitenfehler unterstützt, bei IRQL = APC_LEVEL erfolgt.

Ähnliche Regeln gelten für die Dispatch-Routine für die Gerätesteuerung eines Speichertreibers, DispatchDeviceControl, mit bestimmten Qualifikationen. Die Dispatchroutine für die Gerätesteuerung eines Speichertreibers darf keinen auslagerungsfähigen Code enthalten oder auf ausgelagerten Arbeitsspeicher zugreifen. Die Dispatchroutine muss in der Lage sein, IOCTL-Anforderungen zu empfangen, die für andere Treiber bei beliebigen IRQLs vorgesehen sind, und sie über den Treiberstapel weiterzureichen. Treiber müssen alle nicht behandelten IOCTL-Anforderungen über den Stapel übergeben, ohne die IRQL oder den Kontext der Anforderung zu ändern.

Microsoft erfordert jedoch, dass alle Speicher-IOCTL-Anforderungen an PASSIVE_LEVEL übermittelt werden. Obwohl die Dispatchroutine selbst nicht ausgelagert werden kann, kann sie seitenfähige Unterroutinen aufrufen, um Speicher-IOCTL-Anforderungen zu verarbeiten. Diese Unterroutinen können auch auf ausgelagerten Arbeitsspeicher zugreifen.

Routinen wie DriverEntry, Reitialize und Unload, die keine E/A-Vorgänge ausführen und unter IRQL = PASSIVE_LEVEL ausgeführt werden, können ebenfalls ausgelagerten Code enthalten.

Besondere Überlegungen gelten für Treiber, die Speichergeräte im Pagingpfad verwalten. Ein Treiber befindet sich im "Pagingpfad", wenn er an E/A-Vorgängen für die Auslagerungsdatei teilnimmt. Wenn sich ein Speichertreiber im Pagingpfad befindet, darf seine DispatchPower-Routine für IRP_MJ_POWER Anforderungen nicht ausgelagert werden können.

Standardmäßig ist der Code für Kernelmodustreiber nicht ausgelagert, und der globale Speicher, der von Kernelmodustreibern verwendet wird, kann nicht ausgelagert werden. Informationen dazu, wie Code ausgelagert werden kann, finden Sie unter Making Driver Code or Data Pageable( Making Driver Code or Data Pageable).