Partilhar 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 um interruptService rotina retornar.

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 de KDPC, que representa o objeto DPC associado a esse rotina de DpcForIsr.

[in] DeviceObject

Ponteiro fornecido pelo chamador para uma estrutura de DEVICE_OBJECT. Esse é o objeto do dispositivo de destino, criado anteriormente pela rotina de 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, especificado em uma chamada anterior para IoRequestDpc.

Valor de retorno

Nenhum

Observações

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 de CustomDpc.)

Para enfileirar uma rotina de DpcForIsr para execução, a rotina de interruptservice de do 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.

  • Desativando o próximo IRP.

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

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

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

Uma rotina de 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 de DpcForIsr, consulte DPC Objects and DPCs.

Exemplos

Para definir um DpcForIsr rotina de retorno de chamada, 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 encontram erros e é um requisito para gravar drivers para o sistema operacional Windows.

Por exemplo, para definir uma rotina de retorno de chamada DpcForIsr denominada 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 anotação _Use_decl_annotations_ à sua definição de função. A anotação _Use_decl_annotations_ 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
da Plataforma de Destino Área de trabalho
cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL Chamado no DISPATCH_LEVEL.