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) |