Regola RemoveLockMnRemove2 (wdm)

La regola RemoveLockMnRemove2 verifica che le chiamate a IoAcquireRemoveLock e IoReleaseRemoveLockAndWait vengano usate correttamente durante l'elaborazione di IRP_MN_REMOVE_DEVICE richiesta prima che IRP venga inoltrata a driver inferiori.

Questa regola si applica solo ai driver FDO e FIDO.

Si consideri ad esempio uno stack di driver PnP costituito da un driver di filtro, un fdO e un pdo.

Il gestore PnP invia una query di rimozione tramite lo stack. L'oggetto FDO è abilitato per l'inattività durante l'esecuzione del sistema. L'fdO decide di arrestare lo stato della query rimossa, quindi richiede un IRP D0. Prima dell'arrivo dell'IRP d0, il gestore PnP invia un IRP di rimozione PnP e che L'IRP viene elaborato dal driver di filtro. Il driver di filtro si scollega dallo stack e ne pulisce lo stato. D0 arriva all'inizio dello stack, ma il driver di filtro non lo invia più nello stack perché non ha più contesto o dati per sapere dove inviarlo. L'fdO è bloccato in attesa dell'arrivo dell'IRP d0, ma tale IRP non lo farà mai.

Per evitare questo errore

  1. Prima che un dispositivo venga scollegato dallo stack di dispositivi, IoAcquireRemoveLock deve avere esito positivo prima che l'IRP venga inoltrato nello stack per i tipi di IRP seguenti:

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. IoReleaseRemoveLockAndWait deve essere chiamato prima di chiamare IoDetachDevice o IoDeleteDevice. In questo modo si garantisce che tutti i blocchi rimossi vengano rilasciati nei driver di dispositivo.

Modello di driver: WDM

Come eseguire il test

In fase di compilazione

Eseguire Static Driver Verifier e specificare la regola RemoveLockMnRemove2 .

Usa i passaggi descritti di seguito per eseguire un'analisi del codice:
  1. Prepara il codice (usa dichiarazioni di tipo ruolo).
  2. Esegui Driver Verifier statico.
  3. Visualizza e analizza i risultati.

Per altre informazioni, vedere Using Static Driver Verifier to Find Defects in Drivers.For more information, see Using Static Driver Verifier to Find Defects in Drivers.

Si applica a

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver