2009-10-03 16 views
6

J'utilise l'exemple KbFilter dans le WDK, en essayant d'envoyer un IOCTL dans une fonction appelée par KbFilter_ServiceCallback et donc exécuté à DISPATCH_LEVEL. La fonction doit simplement envoyer un IOCTL et revenir, je n'attends pas qu'un buffer de sortie soit rempli pour qu'il puisse être asynchrone, fire et forget.Envoi d'IOCTL à partir d'IRQL = DISPATCH_LEVEL (KbFilter/KMDF)

J'utilise actuellement les fonctions WDF WdfIoTargetFormatRequestForIoctl et WdfRequestSend essayer d'envoyer à DISPATCH_LEVEL et ne rien obtenir. L'appel à WdfRequestSend réussit mais l'IOCTL ne semble pas être reçu.

En utilisant l'une des WdfIoTargetSendIoctlSynchronously ou le modèle WDM IoBuildDeviceIoControlRequest() et IoCallDriver() exige PASSIVE_LEVEL et la seule façon que je sais d'appeler ces derniers à PASSIVE_LEVEL est de créer un thread séparé qui fonctionne à PASSIVE_LEVEL et transmettre des instructions via un tampon ou une file d'attente, synchronisé avec un spinlock et un sémaphore. Quelqu'un peut-il me dire s'il existe un moyen plus simple de transmettre des IOCTL aux pilotes sous mon filtre, ou si le thread/file d'attente approche le modèle normal lorsque vous devez faire des choses à un IRQL plus élevé? Dans quelles circonstances puis-je utiliser KeRaiseIrql et est-ce que je devrais utiliser? Merci.

Répondre

5

Utilisez IoAllocateIrp et IoCallDriver. Ils peuvent être exécutés à l'adresse IRQL < = DISPATCH_LEVEL.

Vous ne pouvez pas réduire votre IRQL (sauf si c'est vous qui l'avez levé). KeRaiseIrql est utilisé uniquement pour augmenter IRQL. Un appel à KeRaiseIrql est valide si l'appelant spécifie NewIrql> = CurrentIrql.

Attention: votre IOCTL est-il attendu à 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 = ... 
+0

Je ne suis pas familier avec WDF. –

+0

Merci, comment créer la requête IOCTL au niveau de l'envoi? IoAllocateIrp et IoCallDriver sont tous deux valides au niveau de la répartition, mais IoBuildDeviceIoControlRequest requiert un niveau passif. –

+0

réellement http://msdn.microsoft.com/en-us/library/ms801530.aspx dit qu'il a besoin au moins de niveau APC, alors que http://www.osronline.com/DDKx/kmarch/k104_8ble.htm dit qu'il a besoin être au niveau passif .. étrange –