Conjunto de regras de IrpProcessing (WDM)
Use essas regras para verificar se o driver processa corretamente os IRP (pacotes de solicitação de E/S).
Nesta seção
Tópico | Descrição |
---|---|
A regra CompleteRequest verifica se a rotina IoCompleteRequest não é chamada após a execução de uma rotina de conclusão e que ela não retorna STATUS_MORE_PROCESSING_REQUIRED. |
|
A regra CompleteRequestStatusCheck verifica se o valor de status de E/S no IRP corresponde ao valor de status retornado pelo driver inferior. |
|
A regra CompletionRoutineRegistered especifica que, se a rotina de expedição registrar uma rotina IoCompletion usando IoSetCompletionRoutineEx, a rotina de expedição deverá chamar IoCallDriver ou PoCallDriver posteriormente. |
|
A regra WDM (DoubleCompletion) especifica que o driver não deve chamar a rotina IoCompleteRequest duas vezes para o mesmo IRP. |
|
A regra IoReuseIrp especifica que um driver deve usar IoReuseIrp somente em IRPs alocados anteriormente com IoAllocateIrp. |
|
A regra IoReuseIrp2 especifica que um driver deve usar IoReuseIrp somente em IRPs alocados anteriormente no driver. |
|
A regra IoSetCompletionExCompleteIrp especifica que a rotina IoSetCompletionRoutineEx retorna um valor NTSTATUS. O driver deve marcar esse valor para determinar se a rotina IoCompletion foi registrada com êxito antes de chamar IoCallDriver ou PoCallDriver e, se IoSetCompletionRoutineEx falhar, o IRP deverá ser concluído e a rotina de expedição deverá retornar. |
|
A regra IoSetCompletionRoutineExCheck especifica que a rotina IoSetCompletionRoutineEx retorna um valor NTSTATUS. O driver deve marcar esse valor para determinar se a rotina IoCompletion foi registrada com êxito antes de chamar IoCallDriver ou PoCallDriver. |
|
A regra IoSetCompletionRoutineExCheckDeviceObject especifica que, se o objeto de dispositivo atual não for passado para IoSetCompletionRoutineEx e o objeto de dispositivo inferior for, isso poderá levar a uma condição de corrida em que o objeto de dispositivo atual possa ser descarregado mesmo que a rotina de conclusão não tenha sido executada. |
|
A regra IoSetCompletionRoutineNonPnpDriver especifica que os drivers que não são drivers PnP devem usar IoSetCompletionRoutineEx e não IoSetCompletionRoutine. |
|
A regra IrpCancelField especifica que o driver marcar o valor do membro Irp-Cancel> ao definir uma rotina de cancelamento em um IRP pendente. |
|
A regra IrpProcessingComplete especifica que, se uma rotina de expedição retornar STATUS_SUCCESS, o IRP deverá ter sido concluído pelo próprio driver ou por um driver de nível inferior. |
|
A regra LowerDriverReturn especifica que, depois de usar PoCallDriver ou IoCallDriver para chamar um driver inferior, o driver salva o retorno status da chamada e passa o retorno status que recebeu para a rotina de expedição. |
|
A regra SignalEventInCompletion especifica que, ao processar um IRP assíncrono, o driver precisa chamar o KeSetEvent na rotina de conclusão quando o sinalizador Irp-PendingReturned> é definido. |
|
A regra SignalEventInCompletion2 especifica que, ao processar um IRP assíncrono, o driver precisa chamar o KeSetEvent na rotina de conclusão quando o sinalizador Irp-PendingReturned> é definido. |
|
A regra SignalEventInCompletion3 especifica que, ao processar um IRP assíncrono, o driver precisa chamar o KeSetEvent na rotina de conclusão quando o sinalizador Irp-PendingReturned> é definido. |
|
A regra StartIoCancel especifica que o driver não deve chamar IoSetStartIoAttributes com o parâmetro NonCancelable definido como FALSE antes de chamar IoSetCancelRoutine com uma rotina cancel não NULL. |
|
A regra StartIoRecursion especifica que, se a rotina StartIo de um driver incluir uma chamada para IoStartNextPacket, o driver deverá primeiro chamar IoSetStartIoAttributes com o atributo DeferredStartIo definido como TRUE. Caso contrário, a recursão infinita poderá resultar. |
|
A regra PnpRemove especifica que o driver não pode concluir IRP_MN_SURPRISE_REMOVAL, IRP_MN_CANCEL_REMOVE_DEVICE, IRP_MN_CANCEL_STOP_DEVICE ou solicitações de IRP_MN_REMOVE_DEVICE com uma falha. |
|
A regra PnpSurpriseRemove especifica que o driver não chama IoDeleteDevice ou IoDetachDevice durante o processamento de uma solicitação de IRP_MN_SURPRISE_REMOVAL . |
|
A regra PowerDownAllocate especifica que um driver FDO e FIDO não devem alocar memória ao processar uma solicitação de IRP_MN_SET_POWER para uma transição SystemPowerState que vai de s0 para [S1... S5]. |
|
A regra PowerDownFail especifica que um driver FDO ou FIDO não deve falhar em uma solicitação de IRP_MN_SET_POWER quando o dispositivo está desligando. Essa regra só se aplica a drivers FDO e FIDO. |
|
A regra PowerIrpDDIs especifica que quando um driver está processando um sistema ou um dispositivo IRP_MJ_POWER com IRP_MN_SET_POWER, ele não deve chamar DDIs que só podem ser chamados em PASSIVE_LEVEL. |
|
A regra PowerUpFail especifica que um driver FDO ou FIDO não deve falhar em uma solicitação de IRP_MN_SET_POWER quando o dispositivo estiver sendo ligado. |
|
A regra PnpIrpCompletion verifica se um driver FDO passa IRPs PnP para o driver inferior. |
|
A regra WmiComplete especifica que, ao processar um IRP secundário WMI, o driver chama IoCompleteRequest antes de retornar da rotina DispatchSystemControl . |
|
A regra WmiForward especifica que o driver deve encaminhar IRPs secundários WMI quando o encaminhamento é necessário. |
Para selecionar o conjunto de regras IrpProcessing
Selecione seu projeto de driver (.vcxProj) no Microsoft Visual Studio. No menu Driver , clique em Iniciar Verificador de Driver Estático....
Clique na guia Regras . Em Conjuntos de Regras, selecione IrpProcessing.
Para selecionar o conjunto de regras padrão em uma janela do prompt de comando do desenvolvedor do Visual Studio, especifique IrpProcessing.sdv com a opção /marcar. Por exemplo:
msbuild /t:sdv /p:Inputs="/check:IrpProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
Para obter mais informações, consulte Using Static Driver Verifier to Find Defects in Drivers and Static Driver Verifier commands (MSBuild).