Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Observação
A partir do Windows 10 Versão 2004, o Verificador de Driver Estático (SDV) não requer mais anotações para identificar tipos de função de rotinas de despacho para drivers WDM. Siga as orientações na seção Inicializações básicas e avançadas desta página.
Para informar o SDV sobre os pontos de entrada do driver ao analisar um driver WDM, deve-se declarar funções usando declarações de tipos de função. Os tipos de função são definidos em Wdm.h. Cada ponto de entrada na rotina DriverEntry no driver WDM deve ser declarado especificando o tipo de função correspondente. Os tipos de função são typedefs predefinidos que correspondem aos pontos de entrada reconhecidos em um driver WDM.
Por exemplo, para criar uma declaração de tipo de função para a rotina Unload de um driver chamada CsampUnload, use a declaração de tipo de função typedef DRIVER_UNLOAD predefinida. A declaração de tipo de função deve aparecer antes da definição de função.
DRIVER_UNLOAD CsampUnload;
A definição da função CsampUnload permanece inalterada:
VOID
CsampUnload(
IN PDRIVER_OBJECT DriverObject
)
{
...
}
O SDV reconhece os tipos de pontos de entrada mostrados na tabela a seguir.
| Tipo de função WDM | Rotina WDM |
|---|---|
DRIVER_INITIALIZE |
|
DRIVER_STARTIO |
|
DESCARREGAMENTO_DO_DRIVER |
|
DRIVER_ADD_DEVICE |
|
| Dispatch_type(tipo) DRIVER_DISPATCH | A(s) rotina(s) de despacho utilizada(s) pelo motorista. Consulte Rotinas de despacho de escrita. |
IO_COMPLETION_ROUTINE |
A rotina IoCompletion é definida chamando IoSetCompletionRoutine ou IoSetCompletionRoutineEx e passando o ponteiro da função para a rotina IoCompletion como o segundo parâmetro. |
DRIVER_CANCEL |
A rotina Cancel é definida chamando IoSetCancelRoutine e passando, como o segundo parâmetro para a função, o ponteiro da função para a rotina de cancelamento do IRP. |
IO_DPC_ROUTINE |
A rotina DpcForIsr é registrada chamando IoInitializeDpcRequest e passando o ponteiro da função para a rotina DpcForIsr como o segundo parâmetro. Para enfileirar o DPC, chame IoQueueDpc da rotina ISR usando o mesmo objeto DPC. |
KDEFERRED_ROUTINE |
A rotina CustomDpc é definida chamando KeInitializeDpc e passando o ponteiro da função para o CustomDpc como o segundo parâmetro. Para inserir na fila o CustomDpc para o driver, utilize a rotina ISR chamando KeInsertQueueDpc com o mesmo objeto DPC. |
KSERVICE_ROUTINE |
A rotina InterruptService (ISR) atende a uma interrupção de dispositivo e agenda o processamento pós-interrupção dos dados recebidos, se necessário. |
SOLICITAÇÃO_DE_ENERGIA_COMPLETA |
A rotina de retorno de chamada PowerCompletion conclui o processamento de um IRP de energia. Se o driver precisar executar tarefas adicionais depois que todos os outros drivers tiverem concluído o IRP, o driver registrará uma rotina de retorno de chamada PowerCompletion durante a chamada para a rotina PoRequestPowerIrp que aloca o IRP. |
ROTINA_DE_THREAD_DE_TRABALHADOR |
Rotina Rotina é a rotina de callback especificada no segundo parâmetro da função ExInitializeWorkItem. A rotina só deve ser declarada dessa forma se o driver chamar ExQueueWorkItem para adicionar o item de trabalho a uma fila do sistema. |
Declarando rotinas de despacho de motoristas
A partir do Windows 10 Versão 2004, as declarações de tipo de função para rotinas de despacho são refinadas automaticamente com a sua categoria IRP, com base na inicialização da tabela DriverObject-MajorFunction na rotina DriverEntry de um driver WDM.
Um driver Foo deve realizar declarações de funções usando o estilo básico ou avançado de declaração para ser compatível com o SDV.
Inicializações básicas e avançadas
O estilo básico pode ser visto no exemplo abaixo (observe que os nomes de rotina de despacho FooCreate e FooCleanup são apenas exemplos, qualquer nome apropriado pode ser usado):
DriverObject->MajorFunction[IRP_MJ_CREATE] = FooCreate; //Basic style
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCleanup;
Pode adotar-se uma abordagem mais avançada para encurtar a lista necessária. Enquanto a mesma rotina de despacho é usada para mais de uma categoria de IRP, um driver pode codificar duas inicializações desta maneira:
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCreateCleanup; // Advanced style for a multi-role dispatch routine
Para que um driver seja capaz de executar SDV corretamente, o driver deve usar apenas o estilo básico ou avançado mostrado acima. A verificação SDV no driver não funcionará como esperado se um desses dois métodos não for usado.
Parâmetros de função e tipos de função
Conforme exigido na linguagem de programação C, os tipos de parâmetro utilizados na definição da função devem corresponder aos tipos de parâmetro do protótipo de função, ou, neste caso, ao tipo do papel da função. SDV depende das assinaturas de função para análise e ignora funções cujas assinaturas não correspondem.
Por exemplo, você deve declarar uma rotina IoCompletion usando o tipo de função IO_COMPLETION_ROUTINE:
IO_COMPLETION_ROUTINE myCompletionRoutine;
Quando você implementa myCompletionRoutine, os tipos de parâmetro devem corresponder aos usados por IO_COMPLETION_ROUTINE, ou seja, PDEVICE_OBJECT, PIRP e PVOID (consulte a rotina IoCompletion para sintaxe).
NTSTATUS
myCompletionRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
)
{
}
Executando a análise de código para drivers para verificar as declarações de função
Para ajudá-lo a determinar se o código-fonte está preparado, execute a Análise de Código para Drivers. A Análise de Código para Drivers verifica as declarações do tipo de função e pode ajudar a identificar declarações de função que tenham sido esquecidas ou avisá-lo se os parâmetros da definição da função não corresponderem aos do tipo de função.