Partilhar via


Função de retorno de chamada PFNKSHANDLER (ks.h)

A rotina fornecida pelo minidriver é chamada quando o Kernel Streaming recebe um IOCTL_KS_METHOD, solicitação de propriedade get/set. Forneça um ponteiro para esse manipulador na estrutura KSMETHOD_ITEM, KSPROPERTY_ITEM relevante.

Sintaxe

PFNKSHANDLER Pfnkshandler;

NTSTATUS Pfnkshandler(
  [in]      PIRP Irp,
  [in]      PKSIDENTIFIER Request,
  [in, out] PVOID Data
)
{...}

Parâmetros

[in] Irp

Especifica o IRP que contém o método ou a solicitação de propriedade.

[in] Request

Especifica uma cópia alinhada do parâmetro de método. Normalmente, esse é um ponteiro para um KSMETHOD ou estrutura de KSPROPERTY.

[in, out] Data

Especifica uma cópia alinhada do parâmetro de dados do método ou do endereço do sistema do parâmetro de dados original, dependendo do sinalizador especificado na estrutura KSMETHOD_ITEM para o método.

Valor de retorno

Retorne STATUS_SUCCESS se o método for manipulado e o buffer de dados tiver sido preenchido de acordo com o sinalizador especificado em KSMETHOD_ITEM. Se os dados forem retornados, o driver deverá definir o campo Irp->IoStatus.Information, mas não deve definir o campo Irp->IoStatus.Status nem deve concluir o IRP. Marque o IRP pendente se ele for concluído de forma assíncrona.

Como alternativa, retorne STATUS_SOME_NOT_MAPPED se o método tiver sido tratado, mas a solicitação específica não tiver sido concluída e precisar ser concluída pela função auxiliar de chamada. Retorne qualquer outra mensagem de erro para indicar que o método não tem suporte ou ocorreu um erro de parâmetro.

Observações

O minidriver especifica o endereço dessa rotina no MethodHandler membro da estrutura KSMETHOD_ITEM.

A declaração de manipulador usada para KStrMethodHandler e KStrSupportHandler também é usada para manipuladores de conjuntos de propriedades e eventos, com os mesmos parâmetros e valores de retorno.

Quando uma função auxiliar como KsMethodHandler chama um manipulador de método cujo buffer de dados é definido como um buffer de gravação ou modificação, o manipulador de métodos deve definir o membro Information da estrutura IO_STATUS_BLOCK para o membro IoStatus dentro do IRP (parâmetroIrp) para o tamanho desse buffer de dados. O minidriver define o Flags membro da estrutura KSMETHOD_ITEM do método para KSMETHOD_TYPE_WRITE ou KSMETHOD_TYPE_MODIFY para definir o buffer de dados do manipulador de método como gravação ou modificação, respectivamente.

O snippet de código a seguir mostra um exemplo de uma implementação de um manipulador de método que define o tamanho do buffer de dados retornado no IRP:

NTSTATUS
  MethodHandler(PIRP pIrp, PKSIDENTIFIER Request, PVOID Data) {
    NTSTATUS Status = STATUS_UNSUCCESSFUL;
    // Pointer to hold the position on the Irp stack
    PIO_STACK_LOCATION  pIrpStack  = NULL;
    ASSERT(pIrp);
    if(Data) {
        // Modify data here
    }
    // Find the current Irp stack.
    pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
    if(pIrpStack) {
        // Set the size of the returning Irp data.
        pIrp->IoStatus.Information =
          pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
        Status = STATUS_SUCCESS;
    }
    return(Status);
}

O minidriver especifica o endereço dessa rotina no GetPropertyHandler membro da estrutura KSPROPERTY_ITEM.

O minidriver especifica o endereço dessa rotina no setPropertyHandler membro da estrutura KSPROPERTY_ITEM.

O minidriver especifica o endereço dessa rotina no membro SupportHandler da estrutura KSMETHOD_ITEM.

A declaração de manipulador usada para KStrMethodHandler e KStrSupportHandler também é usada para manipuladores de conjuntos de propriedades e eventos, com os mesmos parâmetros e valores de retorno.

Requisitos

Requisito Valor
da Plataforma de Destino Área de trabalho
cabeçalho ks.h (incluir Ks.h)

Consulte também

KSMETHOD

KSMETHOD_ITEM

KSMETHOD_SET

KsMethodHandler