Pergunta

Eu estou usando o exemplo KbFilter no WDK, tentando enviar um IOCTL em uma função que é chamado por KbFilter_ServiceCallback e, portanto, é executado no DISPATCH_LEVEL. A função só tem que enviar um IOCTL e retorno, não estou à espera de tampão a ser preenchida uma saída para que ele possa ser assíncrona, fogo e esquecer.

Atualmente, estou usando as funções WDF WdfIoTargetFormatRequestForIoctl e WdfRequestSend para tentar enviar a DISPATCH_LEVEL e não receber nada. A chamada para WdfRequestSend está tendo sucesso, mas que o IOCTL não parecem ser recebido.

Usando qualquer um de WdfIoTargetSendIoctlSynchronously ou o padrão WDM IoBuildDeviceIoControlRequest () e IoCallDriver () requer PASSIVE_LEVEL ea única forma que conheço para chamar estes em PASSIVE_LEVEL é criar um separado linha que corre no PASSIVE_LEVEL e passá-la através de um tampão de instruções ou de uma fila, sincronizado com um spinlock e semáforo.

Alguém pode me dizer se existe uma maneira mais fácil de passar IOCTLs para os motoristas abaixo do meu filtro, ou é o fio / fila se aproximar do padrão normal quando você precisa fazer as coisas em um IRQL maior? Sob que circunstâncias posso usar KeRaiseIrql e é isso o que eu devo usar? Obrigado.

Foi útil?

Solução

Use IoAllocateIrp e IoCallDriver. Eles podem ser executado no IRQL <= DISPATCH_LEVEL.

Você não pode diminuir sua IRQL (a menos que seja você quem levantou-lo). KeRaiseIrql é usado apenas para aumentar IRQL. Uma chamada para KeRaiseIrql é válido se especifica chamador NewIrql> = CurrentIrql.

Tenha cuidado: é seu IOCTL esperado em DISPATCH_LEVEL

Aqui está um trecho de código:

PIRP Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

Irp->Tail.Overlay.Thread  = PsGetCurrentThread(); 
Irp->RequestorMode        = KernelMode; 
Irp->IoStatus.Status      = STATUS_NOT_SUPPORTED; 
Irp->IoStatus.Information = 0; 

PIO_STACK_LOCATION stack  = IoGetNextIrpStackLocation(Irp); 
stack->MajorFunction      = IRP_MJ_DEVICE_CONTROL; 
stack->Parameters.DeviceIoControl.IoControlCode = ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top