Freigeben über


Fehler beim Behandeln von Bereinigungs- und Schließenvorgängen

Einige Treiber unterscheiden nicht die Aufgaben, die in DispatchCleanup - und DispatchClose-Routinen erforderlich sind. Der E/A-Manager ruft die DispatchCleanup-Routine eines Treibers auf, wenn das letzte Handle für ein Dateiobjekt geschlossen wird. Die DispatchClose-Routine wird aufgerufen, wenn der letzte Verweis aus dem Dateiobjekt freigegeben wird. Ein Treiber sollte nicht versuchen, Ressourcen in seiner DispatchCleanup-Routine freizugeben, die an ein Dateiobjekt angefügt sind oder von anderen DispatchXxx-Routinen verwendet werden.

Beim Aufrufen von Dispatchroutinen enthält der E/A-Manager einen Verweis auf das Dateiobjekt für normale E/A-Aufrufe. Daher kann ein Treiber E/A-Anforderungen für ein Dateiobjekt empfangen, nachdem seine DispatchCleanup-Routine aufgerufen wurde, aber bevor seine DispatchClose-Routine aufgerufen wird. Beispielsweise kann ein Benutzermodusaufrufer das Dateihandle schließen, während eine E/A-Manageranforderung von einem anderen Thread ausgeführt wird. Wenn der Treiber die erforderlichen Ressourcen gelöscht oder freigegeben hat, bevor der E/A-Manager seine DispatchClose-Routine aufruft, können ungültige Zeigerverweise und andere Probleme auftreten.