I have a observation that I need to confirm. I am seeing that when I fire a (internal) command from Prepare Hardware or from D0 entry, the ISR never gets called. When I create a thread and then return from Prepare hardware and fire the command from the thread, I am seeing that the ISR gets called.
I have claimed the interrupts and all resources in prepare hardware itself and all set to fire the commands.
I think the interrupt idt is hooked only after EvtInteruptEnable(), so for non-shared interrupts (MSI/X), interrupts that got generated before EvtInterruptEnale(MsgId) gets dropped. For line interrupts if one is lucky the isr() get invoked by chance even before InterruptEnale()
Right. When you call WdfInterruptCreate, that just lets the KMDF framework know that it needs to claim the interrupt later. It won’t be claimed until your EvtInterruptEnable is called.