2009-10-03 6 views
6

मैं डब्लूडीके में केबीफ़िल्टर उदाहरण का उपयोग कर रहा हूं, जो कि एक आईओसीटीएल को एक फ़ंक्शन में भेजने की कोशिश कर रहा है जिसे KbFilter_ServiceCallback द्वारा बुलाया जाता है और इसलिए DISPATCH_LEVEL पर निष्पादित किया जाता है। फ़ंक्शन को केवल एक आईओसीटीएल भेजना है और वापसी करना है, आउटपुट बफर भरने की प्रतीक्षा नहीं कर रहा है, इसलिए यह असीमित, आग और भूल सकता है।IRQL = DISPATCH_LEVEL (KbFilter/KMDF) से IOCTL भेज रहा है

मैं वर्तमान में WDF उपयोग कर रहा हूँ काम करता है WdfIoTargetFormatRequestForIoctl और WdfRequestSend कोशिश करते हैं और DISPATCH_LEVEL में और कुछ भी नहीं हो रही है भेजने के लिए। WdfRequestSend को कॉल सफल हो रहा है लेकिन आईओसीटीएल प्राप्त नहीं होता है।

के दोनों WdfIoTargetSendIoctlSynchronously या WDM पैटर्न IoBuildDeviceIoControlRequest() और IoCallDriver() PASSIVE_LEVEL और एक ही तरीका है की आवश्यकता है मैं PASSIVE_LEVEL पर इन कॉल करने के लिए एक अलग थ्रेड कि PASSIVE_LEVEL से चलता बना सकते हैं और यह निर्देश पारित करने के लिए है पता है का उपयोग करना एक बफर या कतार के माध्यम से, एक स्पिनलॉक और सेमफोर के साथ सिंक्रनाइज़।

क्या कोई मुझे बता सकता है कि मेरे फ़िल्टर के नीचे ड्राइवरों को आईओसीटीएल पास करने का कोई आसान तरीका है या क्या थ्रेड/क्यूई सामान्य पैटर्न से संपर्क करता है जब आपको उच्च आईआरक्यूएल पर चीजों को करने की आवश्यकता होती है? किस परिस्थितियों में मैं KeRaiseIrql का उपयोग कर सकता हूं और क्या मुझे इसका उपयोग करना चाहिए? धन्यवाद।

उत्तर

5

IoAllocateIrp और IoCallDriver का उपयोग करें। उन्हें आईआरक्यूएल < = DISPATCH_LEVEL पर चलाया जा सकता है।

आप अपने आईआरक्यूएल को कम नहीं कर सकते (जब तक कि यह आप इसे उठाए नहीं)। KeRaiseIrql केवल आईआरक्यूएल बढ़ाने के लिए प्रयोग किया जाता है। KeRaiseIrql को कॉल मान्य है यदि कॉलर NewIrql> = CurrentIrql निर्दिष्ट करता है।

सावधान रहें: क्या आपकी आईओसीटीएल DISPATCH_LEVEL पर अपेक्षित है?

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

मैं WDF से परिचित नहीं हूँ:

कोड स्निपेट है। –

+0

धन्यवाद, मैं प्रेषण स्तर पर आईओसीटीएल अनुरोध कैसे बना सकता हूं? IoAllocateIrp और IoCallDriver दोनों प्रेषण स्तर पर ठीक हैं, लेकिन IoBuildDeviceIoControlRequest को निष्क्रिय स्तर की आवश्यकता होती है। –

+0

वास्तव में http://msdn.microsoft.com/en-us/library/ms801530.aspx का कहना है कि इसे कम से कम एपीसी स्तर की आवश्यकता है, जबकि http://www.osronline.com/DDKx/kmarch/k104_8ble.htm कहता है कि इसकी आवश्यकता है निष्क्रिय स्तर पर होना .. अजीब –

संबंधित मुद्दे