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