USB Filter driver ASSERTs at IRQL 2 when calling USBD_ParseDescriptors

I have written an USB filter driver that is trying to change some
elements of the config descriptors of our USB device. For this purpose
I have registered a completion routine for
URB_FUNCTION_CONTROL_TRANSFER. Everything is working fine, except that
I’m getting an ASSERT from the checked build of USBD.SYS when calling
USBD_ParseDescriptors from my completion routine. This happens both
under Windows Me and Windows XP.

I don’t understand this ASSERT, since the DDK says: Callers of
USBD_ParseDescriptors can be running at IRQL <= DISPATCH_LEVEL. My
completion routine is running at DISPATCH_LEVEL (= 2). So, where’s the

This is the ASSERT as seen under XP:

1:EX: Pageable code called at IRQL 2
*** Assertion failed: FALSE
*** Source File: d:\xpclient\drivers\wdm\usb\usbd\service.c, line

And this is the appropriate calling stack:

ChildEBP RetAddr
fc8e3a50 805265a6 nt!DbgBreakPoint
fc8e3d34 805265d3 nt!RtlAssert2+0xd8
fc8e3d50 fc99d5a0 nt!RtlAssert+0x16
fc8e3d70 fae6b387 USBD!USBD_ParseDescriptors+0x41
fc8e3d98 fae6de0c myfilt!OnUrbFcnCtrlXfer+0xf8
fc8e3dd4 fae6f80f myfilt!OnUrbComplete+0x50
fc8e3e08 804d5a14 nt!IovpLocalCompletionRoutine+0xb2
fc8e3e38 80639736 nt!IopfCompleteRequest+0xa0
fc8e3ea0 fc0ce493 nt!IovCompleteRequest+0x90
fc8e3eec fc0d4810 USBPORT!USBPORT_CompleteTransfer+0x5ab
fc8e3f20 fc0d7e27 USBPORT!USBPORT_DoneTransfer+0x252
fc8e3f50 fc0dd80d USBPORT!USBPORT_FlushDoneTransferList+0x281
fc8e3f80 fc1092b8 USBPORT!USBPORT_DpcWorker+0x4d3
fc8e3fb8 fc1099a8 USBPORT!USBPORT_IsrDpcWorker+0x7bc
fc8e3fdc 804dd55e USBPORT!USBPORT_IsrDpc+0x266
fc8e3ff4 804dd0eb nt!KiRetireDpcList+0x48

Does anybody have an idea?

Best regards,

Mail Powered by BizAdigm™ -