Compartir a través de


Regla RemoveLockMnSurpriseRemove (wdm)

La regla RemoveLockMnSurpriseRemove comprueba que las llamadas a IoAcquireRemoveLock y IoReleaseRemoveLockAndWait se usan correctamente al procesar IRP_MJ_PNP con MinorFunction IRP_MN_SUPRISE_REMOVAL. El controlador debe adquirir el bloqueo de eliminación antes de reenviar el IRP hacia abajo en la pila.

Esta regla solo se aplica a los controladores FDO y FIDO.

Por ejemplo, considere una pila de controladores PnP que consta de un controlador de filtro, un FDO y un PDO.

El administrador de PnP envía una consulta quitada a través de la pila. El FDO está habilitado para estar inactivo mientras se ejecuta el sistema. El FDO decide apagarse en el estado de eliminación de la consulta, por lo que solicita un IRP d0. Antes de que llegue el IRP d0, el administrador de PnP envía un IRP de eliminación de PnP y ese IRP lo procesa el controlador de filtro. El controlador de filtro se desasocia de la pila y limpia su estado. El d0 llega a la parte superior de la pila, pero el controlador de filtro no lo envía a la pila porque ya no tiene contexto ni datos para saber dónde enviarlo. El FDO está colgado esperando a que llegue el IRP d0, pero ese IRP nunca lo hará.

Para evitar este error

  1. Antes de que un dispositivo se desasocie de la pila de dispositivos, IoAcquireRemoveLock debe realizarse correctamente antes de que el IRP se reenvíe hacia abajo en la pila para los siguientes tipos IRP:

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. Se debe llamar a IoReleaseRemoveLockAndWait antes de llamar a IoDetachDevice o IoDeleteDevice. (Esto garantiza que todos los bloqueos de eliminación se liberen en los controladores de dispositivos).

Modelo de controlador: WDM

Cómo probar

En tiempo de compilación

Ejecute el comprobador de controladores estáticos y especifique la regla RemoveLockMnSurpriseRemove .

Usa los pasos siguientes para ejecutar un análisis de tu código:
  1. Prepara el código (usa declaraciones de tipos de rol).
  2. Ejecuta el comprobador de controlador estático.
  3. Consulta y analiza los resultados.

Para obtener más información, consulte Uso del comprobador de controladores estáticos para buscar defectos en controladores.

Se aplica a

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList