Compartilhar via


Regra RemoveLockMnRemove2 (wdm)

A regra RemoveLockMnRemove2 verifica se as chamadas para IoAcquireRemoveLock e IoReleaseRemoveLockAndWait são usadas corretamente ao processar IRP_MN_REMOVE_DEVICE solicitação antes que o IRP seja encaminhado para drivers inferiores.

Essa regra só se aplica a drivers FDO e FIDO.

Por exemplo, considere uma pilha de driver PnP que consiste em um driver de filtro, um FDO e um PDO.

O gerenciador PnP envia uma remoção de consulta por meio da pilha. O FDO está habilitado para ocioso enquanto o sistema está em execução. O FDO decide desligar no estado removido da consulta, portanto, ele solicita um IRP d0. Antes da chegada do IRP d0, o gerenciador PnP envia um IRP de remoção de PnP e esse IRP é processado pelo driver de filtro. O driver de filtro desanexa da pilha e limpa seu estado. O d0 chega na parte superior da pilha, mas o driver de filtro não o envia para baixo na pilha porque não tem contexto ou dados para saber mais para onde enviá-lo. O FDO está suspenso aguardando a chegada do IRP d0, mas esse IRP nunca chegará.

Para evitar esse erro

  1. Antes que um dispositivo seja desanexado da pilha de dispositivos, IoAcquireRemoveLock deve ter êxito antes que o IRP seja encaminhado para baixo na pilha para os seguintes tipos de IRP:

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. IoReleaseRemoveLockAndWait deve ser chamado antes de chamar IoDetachDevice ou IoDeleteDevice. (Isso garante que todos os bloqueios de remoção sejam liberados em drivers de dispositivo).

Modelo de driver: WDM

Como testar

Em tempo de compilação

Execute o Verificador de Driver Estático e especifique a regra RemoveLockMnRemove2 .

Use as seguintes etapas para executar uma análise do código:
  1. Prepare seu código (use declarações de tipo de função).
  2. Execute o Verificador de Driver Estático.
  3. Exiba e analise os resultados.

Para obter mais informações, consulte Usando o verificador de driver estático para localizar defeitos em drivers.

Aplica-se a

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver