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
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
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:
Para obter mais informações, consulte Usando o verificador de driver estático para localizar defeitos em drivers. |
Aplica-se a
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver