Dispatchroutinen und IRQLs
Die meisten Dispatchroutinen von Treibern werden in einem beliebigen Threadkontext unter IRQL = PASSIVE_LEVEL aufgerufen, mit den folgenden Ausnahmen:
Die Verteilungsroutinen aller Treiber auf oberster Ebene werden im Kontext des Threads aufgerufen, der die E/A-Anforderung ausgelöst hat, bei dem es sich häufig um einen Anwendungsthread im Benutzermodus handelt.
Anders ausgedrückt: Die Dispatchroutinen von Dateisystemtreibern und anderen Treibern der höchsten Ebene werden in einem nichtarbiträren Threadkontext unter IRQL = PASSIVE_LEVEL aufgerufen.
Die Routinen DispatchRead, DispatchWrite und DispatchDeviceControl von Gerätetreibern der untersten Ebene sowie von zwischengeschalteten Treibern, die über diesen im System pagingpfad liegen, können unter IRQL = APC_LEVEL und in einem beliebigen Threadkontext aufgerufen werden.
Die DispatchRead - und/oder DispatchWrite-Routinen sowie alle anderen Routinen, die auch Lese- und/oder Schreibanforderungen in einem solchen Gerät oder Zwischentreiber der niedrigsten Ebene verarbeitet, müssen jederzeit vorhanden sein. Diese Treiberroutinen können weder ausgelagert noch Teil eines Auslagerungsbildabschnitts eines Fahrers sein; sie dürfen nicht auf ausgelagerten Speicher zugreifen. Darüber hinaus sollten sie nicht von blockierenden Aufrufen (z. B. KeWaitForSingleObject mit einem Timeout ungleich null) abhängig sein.
Die DispatchPower-Routine von Treibern in den Ruhezustands- und/oder Pagingpfaden kann unter IRQL = DISPATCH_LEVEL aufgerufen werden. Die DispatchPnP-Routinen solcher Treiber müssen für die Verarbeitung von PnP-IRP_MN_DEVICE_USAGE_NOTIFICATION-Anforderungen vorbereitet sein.
Die DispatchPower-Routine von Treibern, die beim Start eine Einschaltleistung benötigen, kann unter IRQL = DISPATCH_LEVEL aufgerufen werden.
Weitere Informationen finden Sie unter Verwalten von Hardwareprioritäten.