Partilhar via


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

CompleteRequest

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.

CompleteRequestStatusCheck

A regra CompleteRequestStatusCheck verifica se o valor de status de E/S no IRP corresponde ao valor de status retornado pelo driver inferior.

CompletionRoutineRegistered

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.

DoubleCompletion

A regra WDM (DoubleCompletion) especifica que o driver não deve chamar a rotina IoCompleteRequest duas vezes para o mesmo IRP.

IoReuseIrp

A regra IoReuseIrp especifica que um driver deve usar IoReuseIrp somente em IRPs alocados anteriormente com IoAllocateIrp.

IoReuseIrp2

A regra IoReuseIrp2 especifica que um driver deve usar IoReuseIrp somente em IRPs alocados anteriormente no driver.

IoSetCompletionExCompleteIrp

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.

IoSetCompletionRoutineExCheck

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.

IoSetCompletionRoutineExCheckDeviceObject

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.

IoSetCompletionRoutineNonPnpDriver

A regra IoSetCompletionRoutineNonPnpDriver especifica que os drivers que não são drivers PnP devem usar IoSetCompletionRoutineEx e não IoSetCompletionRoutine.

IrpCancelField

A regra IrpCancelField especifica que o driver marcar o valor do membro Irp-Cancel> ao definir uma rotina de cancelamento em um IRP pendente.

IrpProcessingComplete

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.

LowerDriverReturn

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.

SignalEventInCompletion

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.

SignalEventInCompletion2

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.

SignalEventInCompletion3

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.

StartIoCancel

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.

StartIoRecursion

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.

PnpRemove

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.

PnpSurpriseRemove

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 .

PowerDownAllocate

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].

PowerDownFail

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.

PowerIrpDDIs

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.

PowerUpFail

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.

PnpIrpCompletion

A regra PnpIrpCompletion verifica se um driver FDO passa IRPs PnP para o driver inferior.

WmiComplete

A regra WmiComplete especifica que, ao processar um IRP secundário WMI, o driver chama IoCompleteRequest antes de retornar da rotina DispatchSystemControl .

WmiForward

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

  1. Selecione seu projeto de driver (.vcxProj) no Microsoft Visual Studio. No menu Driver , clique em Iniciar Verificador de Driver Estático....

  2. 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).