Compartilhar via


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

A rotina fornecida pelo minidriver é chamada quando o Kernel Streaming recebe uma solicitação de propriedade IOCTL_KS_METHOD, get/set. Forneça um ponteiro para esse manipulador na estrutura KSPROPERTY_ITEM KSMETHOD_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 uma estrutura KSMETHOD ou KSPROPERTY .

[in, out] Data

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

Retornar valor

Retornar 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 retornar dados, 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. Retornar qualquer outra mensagem de erro para indicar que o método não tem suporte ou que ocorreu um erro de parâmetro.

Comentários

O minidriver especifica o endereço dessa rotina no membro MethodHandler 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 retornados.

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étodo deve definir o membro Information da estrutura IO_STATUS_BLOCK para o membro IoStatus dentro do IRP (parâmetro Irp ) para o tamanho desse buffer de dados. O minidriver define o membro Flags da estrutura KSMETHOD_ITEM para o método 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 que retorna 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 membro GetPropertyHandler da estrutura KSPROPERTY_ITEM .

O minidriver especifica o endereço dessa rotina no membro SetPropertyHandler 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 retornados.

Requisitos

Requisito Valor
Plataforma de Destino Área de Trabalho
Cabeçalho ks.h (inclua Ks.h)

Confira também

KSMETHOD

KSMETHOD_ITEM

KSMETHOD_SET

KsMethodHandler