RemoveLockMnSurpriseRemove-Regel (wdm)
Die RemoveLockMnSurpriseRemove-Regel überprüft, ob Aufrufe von IoAcquireRemoveLock und IoReleaseRemoveLockAndWait ordnungsgemäß verwendet werden, wenn IRP_MJ_PNP mit MinorFunction IRP_MN_SUPRISE_REMOVAL verarbeitet werden. Der Treiber sollte die Remove-Sperre abrufen, bevor der IRP den Stapel hinunterleite.
Diese Regel gilt nur für FDO- und FIDO-Treiber.
Betrachten Sie beispielsweise einen PnP-Treiberstapel, der aus einem Filtertreiber, einer FDO und einer PDO besteht.
Der PnP-Manager sendet eine Abfrage zum Entfernen durch den Stapel. Die FDO wird im Leerlauf aktiviert, während das System ausgeführt wird. Die FDO entscheidet sich, den Status "Abfrage entfernt" herunterzuschalten, sodass ein d0-IRP angefordert wird. Bevor die d0-IRP eintrifft, sendet der PnP-Manager eine PnP-Entfernungs-IRP, die vom Filtertreiber verarbeitet wird. Der Filtertreiber trennt sich vom Stapel und bereinigt seinen Zustand. Der d0 kommt am oberen Rand des Stapels an, aber der Filtertreiber sendet ihn nicht nach unten im Stapel, da er keinen Kontext oder Keine Daten mehr hat, um zu wissen, wohin er gesendet werden soll. Die FDO wird aufgehängt und wartet darauf, dass der D0-IRP eintrifft, aber das wird IRP nie.
So vermeiden Sie diesen Fehler
Bevor ein Gerät vom Gerätestapel getrennt wird, muss IoAcquireRemoveLock erfolgreich sein, bevor das IRP den Stapel für die folgenden IRP-Typen weiterleitet:
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
IoReleaseRemoveLockAndWait sollte vor dem Aufruf von IoDetachDevice oder IoDeleteDevice aufgerufen werden. (Dadurch wird sichergestellt, dass alle Entfernungssperren in Gerätetreibern freigegeben werden.)
Treibermodell: WDM
So führen Sie einen Test durch
Beim Kompilieren: |
---|
Führen Sie Static Driver Verifier aus, und geben Sie die RemoveLockMnSurpriseRemove-Regel an . Gehen Sie folgendermaßen vor, um Ihren Code zu analysieren:
Weitere Informationen finden Sie unter Verwenden der statischen Treiberüberprüfung, um Fehler in Treibern zu finden. |
Gilt für:
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList