Compartilhar via


Regra RemoveLockMnSurpriseRemove (wdm)

A regra RemoveLockMnSurpriseRemove verifica se as chamadas para IoAcquireRemoveLock e IoReleaseRemoveLockAndWait são usadas corretamente ao processar IRP_MJ_PNP com MinorFunction IRP_MN_SUPRISE_REMOVAL. O driver deve adquirir o bloqueio de remoção antes de encaminhar o IRP para baixo na pilha.

Essa regra só se aplica aos 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 consulta para remover 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 PnP e esse IRP é processado pelo driver de filtro. O driver de filtro se 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 da pilha porque não tem contexto ou dados para saber mais para onde enviá-lo. O FDO está pendurado 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 da pilha para os seguintes tipos 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 RemoveLockMnSurpriseRemove .

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

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList