Envoi IOCTL de IRQL = DISPATCH_LEVEL (KbFilter / KMDF)
Question
J'utilise l'exemple KbFilter dans le WDK, en essayant d'envoyer un IOCTL dans une fonction qui est appelée par KbFilter_ServiceCallback et est donc exécuté à DISPATCH_LEVEL. La fonction a juste besoin d'envoyer un IOCTL et retour, je ne suis pas en attente d'un tampon de sortie à remplir de sorte qu'il peut être asynchrone, le feu et oublier.
Je suis actuellement en utilisant les fonctions WDF WdfIoTargetFormatRequestForIoctl et WdfRequestSend pour essayer d'envoyer à DISPATCH_LEVEL et ne rien obtenir. L'appel à WdfRequestSend réussit mais le IOCTL ne semble pas être reçu.
En utilisant soit WdfIoTargetSendIoctlSynchronously ou le modèle WDM IoBuildDeviceIoControlRequest () et IoCallDriver () nécessite PASSIVE_LEVEL et la seule façon que je sais d'appeler ces derniers à PASSIVE_LEVEL est de créer un séparé fil qui fonctionne à PASSIVE_LEVEL et la transmettre des instructions au moyen d'un tampon ou d'une file d'attente, synchronisé avec un verrou tournant et sémaphore.
Quelqu'un peut-il me dire s'il y a un moyen plus facile de passer IOCTL aux pilotes ci-dessous mon filtre, ou est le fil / file d'attente approche du modèle normal lorsque vous devez faire les choses à un IRQL supérieur? Dans quelles circonstances puis-je utiliser KeRaiseIrql et est-ce que je devrais utiliser? Merci.
La solution
Utilisez IoAllocateIrp et IoCallDriver. Ils peuvent être exécutés à IRQL <= DISPATCH_LEVEL.
Vous ne pouvez pas baisser votre IRQL (à moins que vous qui l'éleva). KeRaiseIrql est uniquement utilisé pour soulever IRQL. Un appel à KeRaiseIrql est valide si l'appelant spécifie NewIrql> = CurrentIrql.
Attention:? Votre IOCTL est attendue à DISPATCH_LEVEL
Voici un extrait de code:
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 = ...