Partilhar via


KMDF (conjunto de regras de uso de DDI)

Use essas regras para verificar se o driver usa corretamente os DDIs KMDF corretamente.

Nesta seção

Tópico Descrição

BufAfterReqCompletedIoctl

A regra BufAfterReqCompletedIoctl especifica que, dentro da função de retorno de chamada EvtIoDeviceControl , o buffer de solicitação de E/S recuperado não pode ser acessado após a conclusão da solicitação de E/S.

BufAfterReqCompletedIntIoctl

A regra BufAfterReqCompletedIntIoctl especifica que, depois que uma solicitação for concluída, seu buffer não poderá ser acessado (somente dentro da função de retorno de chamada EvtIoInternalDeviceControl ). O buffer é recuperado chamando WdfRequestRetrieveOutputBuffer ou WdfRequestRetrieveUnsafeUserOutputBuffer ou WdfRequestRetrieveInputBuffer ou WdfRequestRetrieveUnsafeUserInputBuffer.

BufAfterReqCompletedIntIoctlA

A regra BufAfterReqCompletedIntIoctlA verifica se, após a conclusão de uma solicitação, seu buffer não pode ser acessado (somente no retorno de chamada EvtIoInternalDeviceControl ). O buffer foi recuperado chamando WdfRequestRetrieveInputBuffer ou WdfRequestRetrieveOutputBuffer ou WdfRequestRetrieveUnsafeUserInputBuffer ou WdfRequestRetrieveUnsafeUserOutputBuffer.

BufAfterReqCompletedIoctlA

A regra BufAfterReqCompletedIoctlA especifica que, dentro da função de retorno de chamada EvtIoDeviceControl , o buffer de solicitação de E/S recuperado não pode ser acessado após a conclusão da solicitação de E/S.

BufAfterReqCompletedRead

A regra BufAfterReqCompletedRead especifica que, dentro da função de retorno de chamada EvtIoRead , o buffer de solicitação de E/S recuperado não pode ser acessado após a conclusão da solicitação de E/S. Há 14 DDIs que servem como possíveis métodos de acesso ao buffer.

BufAfterReqCompletedReadA

A regra BufAfterReqCompletedReadA especifica que, dentro da função de retorno de chamada EvtIoRead , o buffer de solicitação de E/S recuperado não pode ser acessado após a conclusão da solicitação de E/S. Há 14 DDIs que servem como possíveis métodos de acesso ao buffer.

BufAfterReqCompletedWrite

A regra BufAfterReqCompletedWrite especifica que, dentro da função de retorno de chamada EvtIoWrite , o buffer de solicitação de E/S recuperado não pode ser acessado após a conclusão da solicitação de E/S.

BufAfterReqCompletedWriteA

A regra BufAfterReqCompletedWriteA especifica que, dentro da função de retorno de chamada EvtIoWrite , o buffer de solicitação de E/S recuperado não pode ser acessado após a conclusão da solicitação de E/S.

ChildDeviceInitApi

A regra ChildDeviceInitApi especifica que, para um dispositivo filho, os métodos de inicialização de objeto do dispositivo de estrutura devem ser chamados antes que o driver chame o método WdfDeviceCreate para o objeto de dispositivo filho.

ControlDeviceDeleted

A regra ControDeviceDeleted especifica que, se um driver PnP criar um objeto de dispositivo de controle, o driver deverá excluir o objeto do dispositivo de controle em uma das funções de retorno de chamada de limpeza antes que o driver seja descarregado.

ControlDeviceInitAPI

A regra ControlDeviceInitAPI especifica que WdfControlDeviceInitAllocate e todos os outros DDIs de inicialização de objeto de dispositivo que configuram uma estrutura de WDFDEVICE_INIT para o dispositivo de controle devem ser chamados antes de WdfDeviceCreate para o dispositivo de controle.

CtlDeviceFinishInitDeviceAdd

A regra CtlDeviceFinishInitDeviceAdd especifica que, se um driver criar um objeto de dispositivo de controle em uma função de retorno de chamada EvtDriverDeviceAdd , ele deverá chamar WdfControlFinishInitializing depois que o dispositivo tiver sido criado e antes de sair da função de retorno de chamada EvtDriverDeviceAdd . Essa regra não se aplica a drivers não PnP.

CtlDeviceFinishInitDrEntry

A regra CtlDeviceFinishInitDrEntry especifica que, se um driver criar um objeto de dispositivo de controle em uma função de retorno de chamada DriverEntry , ele deverá chamar WdfControlFinishInitializing depois que o dispositivo tiver sido criado e antes de sair da função de retorno de chamada EvtDriverDeviceAdd . Essa regra não se aplica a drivers não PnP.

DeviceCreateFail

A regra DeviceCreateFail especifica que EVT_WDF_DRIVER_DEVICE_ADD retorna um erro status quando a chamada para WdfDeviceCreate falha.

DeviceInitAllocate

A regra DeviceInitAllocate especifica que, para um dispositivo PDO ou um objeto de dispositivo de controle, os métodos de inicialização de objeto do dispositivo de estrutura WdfPdoInitAllocate ou WdfControlDeviceInitAllocate devem ser chamados antes que o driver chame WdfDeviceCreate.

DeviceInitAPI

Para um dispositivo FDO, os métodos de inicialização de objeto do dispositivo de estrutura e os métodos de inicialização FDO da estrutura devem ser chamados antes que o driver chame o método WdfDeviceCreate para o objeto do dispositivo.

DoubleDeviceInitFree

A regra DoubleDeviceInitFree especifica que os drivers não devem liberar a estrutura de inicialização do dispositivo duas vezes.

DriverCriar

A regra DriverCreate especifica que um driver que usa o KMDF (Kernel Mode Driver Framework) deve chamar o método WdfDriverCreate para criar um objeto de driver de estrutura de dentro de sua rotina DriverEntry .

InitFreeDeviceCallback

A regra InitFreeDeviceCallback especifica que um driver deve chamar WdfDeviceInitFree se o driver encontrar um erro enquanto inicializa um novo objeto de dispositivo de estrutura e se o driver recebeu a estrutura WDFDEVICE_INIT de uma chamada para WdfControlDeviceInitAllocate.

InitFreeDeviceCreate

A regra InitFreeDeviceCreate especifica que um driver deve chamar WdfDeviceInitFree em vez de WdfDeviceCreate se ocorrer um erro em um dos métodos de inicialização de objeto do dispositivo e se o driver recebeu a estrutura WDFDEVICE_INIT de uma chamada para WdfControlDeviceInitAllocate.

InitFreeDeviceCreateType2

A regra InitFreeDeviceCreateType2 especifica que um driver não deve chamar WdfDeviceCreate depois de chamar WdfDeviceInitFree.

InitFreeDeviceCreateType4

A regra InitFreeDeviceCreateType4 especifica que um driver deve chamar WdfDeviceInitFree se o driver encontrar um erro enquanto chama WdfDeviceCreate e se o driver recebeu a estrutura WDFDEVICE_INIT de uma chamada para WdfControlDeviceInitAllocate.

InitFreeNull

A regra InitFreeNull especifica que os DDIs que recebem PWDFDEVICE_INIT como um parâmetro não podem ser chamados usando um ponteiro NULL para uma estrutura de WDFDEVICE_INIT .

MdlAfterReqCompletedIntIoctl

A regra MdlAfterReqCompletedIntIoctl especifica que, dentro da função de retorno de chamada EvtIoInternalDeviceControl , a MDL (lista de descritores de memória) não pode ser acessada após a conclusão da solicitação de E/S.

MdlAfterReqCompletedIntIoctlA

A regra MdlAfterReqCompletedIntIoctlA especifica que, dentro da função de retorno de chamada EvtIoInternalDeviceControl , a MDL (lista de descritores de memória) não pode ser acessada após a conclusão da solicitação de E/S.

MdlAfterReqCompletedIoctl

A regra MdlAfterReqCompletedIoctl especifica que, dentro da função de retorno de chamada EvtIoDeviceControl , a MDL (lista de descritores de memória) não pode ser acessada após a conclusão da solicitação de E/S.

MdlAfterReqCompletedIoctlA

A regra MdlAfterReqCompletedIoctlA especifica que, dentro da função de retorno de chamada EvtIoDeviceControl , a MDL (lista de descritores de memória) não pode ser acessada após a conclusão da solicitação de E/S.

MdlAfterReqCompletedRead

A regra MdlAfterReqCompletedRead especifica que, dentro da função de retorno de chamada EvtIoRead , o objeto MDL (lista de descritores de memória) recuperado não pode ser acessado após a conclusão da solicitação de E/S.

MdlAfterReqCompletedReadA

A regra MdlAfterReqCompletedReadA especifica que, dentro da função de retorno de chamada EvtIoRead , o objeto MDL (lista de descritores de memória) recuperado não pode ser acessado após a conclusão da solicitação de E/S.

MdlAfterReqCompletedWrite

A regra MdlAfterReqCompletedWrite especifica que, dentro da função de retorno de chamada EvtIoWrite , o objeto MDL (lista de descritores de memória) recuperado não pode ser acessado após a conclusão da solicitação de E/S.

MdlAfterReqCompletedWriteA

A regra MdlAfterReqCompletedWriteA especifica que, dentro da função de retorno de chamada EvtIoWrite , o objeto MDL (lista de descritores de memória) recuperado não pode ser acessado após a conclusão da solicitação de E/S.

MemAfterReqCompletedIntIoctl

A regra MemAfterReqCompletedIntIoctl especifica que, dentro da função de retorno de chamada EvtIoInternalDeviceControl , o objeto de memória da estrutura não pode ser acessado após a conclusão da solicitação de E/S.

MemAfterReqCompletedIntIoctlA

A regra MemAfterReqCompletedIntIoctlA especifica que, dentro da função de retorno de chamada EvtIoInternalDeviceControl , o objeto de memória da estrutura não pode ser acessado após a conclusão da solicitação de E/S.

MemAfterReqCompletedIoctl

A regra MemAfterReqCompletedIoctl especifica que, dentro da função de retorno de chamada EvtIoDeviceControl , o objeto de memória da estrutura não pode ser acessado após a conclusão da solicitação de E/S.

MemAfterReqCompletedIoctlA

A regra MemAfterReqCompletedIoctlA especifica que, dentro da função de retorno de chamada EvtIoDeviceControl , o objeto de memória da estrutura não pode ser acessado após a conclusão da solicitação de E/S.

MemAfterReqCompletedRead

A regra MemAfterReqCompletedRead especifica que, dentro da função de retorno de chamada EvtIoRead , o objeto de memória da estrutura não pode ser acessado após a conclusão da solicitação de E/S.

MemAfterReqCompletedReadA

A regra MemAfterReqCompletedReadA especifica que, dentro da função de retorno de chamada EvtIoRead , o objeto de memória da estrutura não pode ser acessado após a conclusão da solicitação de E/S.

MemAfterReqCompletedWrite

A regra MemAfterReqCompletedWrite especifica que, dentro da função de retorno de chamada EvtIoWrite , o objeto de memória da estrutura não pode ser acessado após a conclusão da solicitação de E/S.

MemAfterReqCompletedWriteA

A regra MemAfterReqCompletedWriteA especifica que, dentro da função de retorno de chamada EvtIoWrite , o objeto de memória da estrutura não pode ser acessado após a conclusão da solicitação de E/S.

NullCheck

A regra NullCheck verifica se um valor NULL dentro do código do driver não é desreferenciado posteriormente no driver. Essa regra relatará um defeito se qualquer uma dessas condições for verdadeira:

  • Há uma atribuição de NULL que é desreferenciada posteriormente.
  • Há um parâmetro/global para um procedimento em um driver que pode ser NULL que é desreferenciado posteriormente e há uma marcar explícita no driver que sugere que o valor inicial do ponteiro pode ser NULL.

Com violações de regra nullCheck, as instruções de código mais relevantes são realçadas no painel de árvore de rastreamento. Para obter mais informações sobre como trabalhar com a saída do relatório, consulte Relatório do Verificador de Driver Estático e Noções básicas sobre o Visualizador de Rastreamento.

PdoDeviceInitAPI

A regra PdoDeviceInitAPI especifica que WdfPdoInitAllocate e todos os outros DDIs de inicialização de objeto do dispositivo que configuram uma estrutura de WDFDEVICE_INIT para o objeto de dispositivo físico (PDO) devem ser chamados antes que o driver chame WdfDeviceCreate para o PDO.

PdoInitFreeDeviceCallback

A regra PdoInitFreeDeviceCallback especifica que o driver deve chamar WdfDeviceInitFree se ocorrer um erro quando o driver chamar qualquer função de inicialização de objeto de dispositivo de estrutura.

PdoInitFreeDeviceCreate

A regra PdoInitFreeDeviceCreate especifica que um driver deve chamar WdfDeviceInitFree em vez de WdfDeviceCreate se ocorrer um erro em uma das funções de inicialização de objeto do dispositivo e se o driver recebeu a estrutura WDFDEVICE_INIT de uma chamada para WdfPdoInitAllocate.

PdoInitFreeDeviceCreateType2

A regra PdoInitFreeDeviceCreateType2 especifica que um driver não deve chamar WdfDeviceCreate depois de chamar WdfDeviceInitFree.

PdoInitFreeDeviceCreateType4

A regra PdoInitFreeDeviceCreateType4 especifica que o driver deve chamar WdfDeviceInitFree se ocorrer um erro quando o driver chamar WdfDeviceCreate.

ControlDeviceInitAllocate

A regra ControlDeviceInitAllocate especifica que, para um objeto de dispositivo de controle, o driver deve chamar o método de inicialização de objeto do dispositivo de estrutura WdfControlDeviceInitAllocate antes que o driver chame WdfDeviceCreate.

InputBufferAPI

A regra InputBufferAPI especifica que os DDIs corretos para recuperação de buffer são usados na função de retorno de chamada EvtIoRead. Na função de retorno de chamada EvtIoRead , os seguintes DDIs não podem ser chamados para recuperação de buffer:

Para selecionar o conjunto de regras de uso DDI

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

    Para selecionar o conjunto de regras padrão em uma janela do prompt de comando do desenvolvedor do Visual Studio, especifique DDIUsage.sdv com a opção /marcar. Por exemplo:

    msbuild /t:sdv /p:Inputs="/check:DDIUsage.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).