Compartilhar via


IO_DPC_ROUTINE função de retorno de chamada (wdm.h)

A rotina DpcForIsr conclui a manutenção de uma operação de E/S, após o retorno de uma rotina InterruptService .

Sintaxe

IO_DPC_ROUTINE IoDpcRoutine;

void IoDpcRoutine(
  [in]           PKDPC Dpc,
  [in]           _DEVICE_OBJECT *DeviceObject,
  [in, out]      _IRP *Irp,
  [in, optional] PVOID Context
)
{...}

Parâmetros

[in] Dpc

Ponteiro fornecido pelo chamador para uma estrutura KDPC , que representa o objeto DPC associado a essa rotina DpcForIsr .

[in] DeviceObject

Ponteiro fornecido pelo chamador para uma estrutura DEVICE_OBJECT . Esse é o objeto de dispositivo para o dispositivo de destino, criado anteriormente pela rotina AddDevice do driver.

[in, out] Irp

Ponteiro fornecido pelo chamador para uma estrutura IRP que descreve a operação de E/S.

[in, optional] Context

Ponteiro fornecido pelo chamador para informações de contexto definidas pelo driver, especificadas em uma chamada anterior para IoRequestDpc.

Retornar valor

Nenhum

Comentários

Para registrar uma rotina DpcForIsr para um objeto de dispositivo específico, um driver deve chamar IoInitializeDpcRequest, o que faz com que o sistema aloque e inicialize um objeto DPC. (Se você precisar de várias rotinas de DPC, use rotinas CustomDpc .)

Para enfileirar uma rotina DpcForIsr para execução, a rotina InterruptService de um driver deve chamar IoRequestDPC.

Uma rotina DpcForIsr normalmente é responsável por pelo menos as seguintes tarefas:

  • Concluindo a operação de E/S descrita pelo IRP recebido.

  • Desempacotando o próximo IRP.

    Se o driver usar a fila IRP fornecida pelo sistema, a rotina DpcForIsr deverá chamar IoStartNextPacket ou IoStartNextPacketByKey, para que a rotina StartIo do driver comece a processar a próxima solicitação de E/S.

    Se o driver usar filas IRP internas, a rotina DpcForIsr deverá remover o próximo IRP e começar o processamento para a próxima solicitação de E/S.

  • Definir o bloco de status de E/S no IRP recebido e chamar IoCompleteRequest para a solicitação concluída.

Uma rotina DpcForIsr também pode repetir uma operação com falha ou configurar a próxima transferência para uma solicitação de E/S grande que foi dividida em partes menores.

Para obter mais informações sobre rotinas DpcForIsr , consulte DPCs e objetos DPC.

Exemplos

Para definir uma rotina de retorno de chamada DpcForIsr , primeiro você deve fornecer uma declaração de função que identifique o tipo de rotina de retorno de chamada que você está definindo. O Windows fornece um conjunto de tipos de função de retorno de chamada para drivers. Declarar uma função usando os tipos de função de retorno de chamada ajuda a Análise de Código para Drivers, SDV ( Verificador de Driver Estático ) e outras ferramentas de verificação a encontrar erros e é um requisito para escrever drivers para o sistema operacional Windows.

Por exemplo, para definir uma rotina de retorno de chamada DpcForIsr chamada MyDpcForIsr, use o tipo IO_DPC_ROUTINE conforme mostrado neste exemplo de código:

IO_DPC_ROUTINE MyDpcForIsr;

Em seguida, implemente sua rotina de retorno de chamada da seguinte maneira:

_Use_decl_annotations_
VOID
  MyDpcForIsr(
    PKDPC  Dpc,
    struct _DEVICE_OBJECT  *DeviceObject,
    struct _IRP  *Irp,
    PVOID  Context
    )
  {
      // Function body
  }

O tipo de função IO_DPC_ROUTINE é definido no arquivo de cabeçalho Wdm.h. Para identificar erros com mais precisão ao executar as ferramentas de análise de código, adicione a _Use_decl_annotations_ anotação à sua definição de função. A _Use_decl_annotations_ anotação garante que as anotações aplicadas ao tipo de função IO_DPC_ROUTINE no arquivo de cabeçalho sejam usadas. Para obter mais informações sobre os requisitos para declarações de função, consulte Declarando funções usando tipos de função de função para drivers WDM. Para obter informações sobre _Use_decl_annotations_, consulte Anotando o comportamento da função.

Requisitos

Requisito Valor
Plataforma de Destino Área de Trabalho
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL Chamado em DISPATCH_LEVEL.