Compartir a través de


Regla RemoveLockMnRemove (wdm)

La regla RemoveLockMnRemove comprueba que las llamadas a IoAcquireRemoveLock y IoReleaseRemoveLockAndWait se usan correctamente al procesar IRP_MJ_PNP con MinorFunction IRP_MN_REMOVE_DEVICE.

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 PnP quita IRP 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 ningún contexto ni datos para saber dónde enviarlo. El FDO está bloqueado 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 a la pila para los siguientes tipos de 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 dispositivo).

Modelo de controlador: WDM

Cómo probar

En tiempo de compilación

Ejecute el Comprobador de controladores estáticos y especifique la regla RemoveLockMnRemove .

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, vea Usar comprobador de controladores estáticos para buscar defectos en controladores.

Se aplica a

IoAcquireRemoveLockIoReleaseRemoveLockIoReleaseRemoveLockAndWaitRemoveHeadList