Condividi tramite


Regola RemoveLockMnSurpriseRemove (wdm)

La regola RemoveLockMnSurpriseRemove verifica che le chiamate a IoAcquireRemoveLock e IoReleaseRemoveLockAndWait vengano usate correttamente durante l'elaborazione IRP_MJ_PNP con MinorFunction IRP_MN_SUPRISE_REMOVAL. Il driver deve acquisire il blocco di rimozione prima di inoltrare l'IRP verso il basso dello stack.

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 oggetto FDO e un oggetto PDO.

Il gestore PnP invia una query rimuovendo lo stack. L'oggetto FDO è abilitato per l'inattività durante l'esecuzione del sistema. L'oggetto FDO decide di arrestare lo stato rimosso dalla query, quindi richiede un'IRP d0. Prima dell'arrivo dell'IRP d0, il gestore PnP invia un'IRP rimossa da PnP e che l'IRP viene elaborato dal driver di filtro. Il driver di filtro si scollega dallo stack e ne pulisce lo stato. Il d0 arriva nella parte superiore dello stack, ma il driver di filtro non lo invia più nello stack perché non ha più contesto o dati per sapere dove inviarlo. Il FDO è sospeso in attesa dell'arrivo dell'IRP d0, ma che l'IRP non verrà 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 allo 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. Questo assicura che tutti i blocchi vengano rilasciati nei driver di dispositivo.

Modello di driver: WDM

Come eseguire il test

In fase di compilazione

Eseguire il verifica driver statico e specificare la regola RemoveLockMnSurpriseRemove .

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 Uso del verificatore driver statico per trovare i difetti nei driver.

Si applica a

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList