Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
No exemplo a seguir, o driver usa a macro ASSERT para verificar o estado correto do dispositivo em uma imagem de driver na sua versão de depuração, mas não verifica o estado do dispositivo na versão para venda da mesma fonte de driver.
case IOCTL_WAIT_FOR_EVENT:
ASSERT((!Extension->WaitEventIrp));
Extension->WaitEventIrp = Irp;
IoMarkIrpPending(Irp);
status = STATUS_PENDING;
Na imagem do driver de depuração, se o driver já mantiver o IRP pendente, o sistema afirmará. Em uma versão de varejo, no entanto, o driver não verifica esse erro. Duas chamadas para o mesmo IOCTL fazem com que o driver perca o controle de um IRP.
Em um sistema multiprocessador, esse fragmento de código pode causar problemas adicionais. Suponha que, ao iniciar, essa rotina tenha a propriedade (o direito de manipular) esse IRP. Quando a rotina salva o ponteiro Irp na estrutura global em Extension-WaitEventIrp>, outro thread pode obter o endereço IRP dessa estrutura global e executar operações no IRP. Para evitar esse problema, o driver deve marcar o IRP como pendente antes de salvá-lo e deve incluir tanto a chamada para IoMarkIrpPending quanto a operação de atribuição em uma sequência intertravada. Uma rotina de cancelamento para o IRP também pode ser necessária.