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.

Était-ce utile?

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 = ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top