Enviando Ioctl de IRQV = DISPATCH_LEVEL (KbFilter / KMDF)
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.
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 = ...