Year: 2008

Let’s say that you allocated a PIRP and sent it down your device stack. You free the PIRP in the completion routine and then return STATUS_MORE_PROCESSING_REQUIRED. To make life more fun, you decide that you want to be able to cancel the sent IRP after you have sent it so you try to do it…

I was going to write about how to do this, but the awesome folks at WHDC got to it before I did. I did get to review it before it was published, so I did have some influence in what is in the tip ;). So on this one my job is easy, just go…

After a long wait (thank you for your patience!), the WDF 1.7 coinstallers are now up on the connect site. To get the bits go to http://connect.microsoft.com Log in using your passport account Navigate to the WDF page (I don’t know where it lives in the connection directory, sigh) Choose Downloads on the left The…

This is a pretty cool and somewhat obscure debugger command. It allows you to tell the debugger what functions to skip if you are using the trace command (‘t’). I think of the trace command as the ‘step into’ command though, but that is just me. Let’s say we have the following simple application: #include…

One of the WDM escapes in KMDF is EvtDeviceWdmIrpPreprocess (or EvtDevicePreprocessWdmIrp in the API in which you register it) which you can register for by calling WdfDeviceInitAssignWdmIrpPreprocessCallback. This function allows you to process a WDM PIRP before KMDF sees it and potentially processes it. From a KMDF adoption point of view, this functionaltiy was a…

Well, that is certainly a long title ;). First, let us look at an approximate implementation of KeAcquireSpinLock and KeRaiseIrql (and yes I know that KeRaiseIrql is really a #define to KfRaiseIrql, but it is the same thing that happens in the end…) KIRQL KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL PreviousIrql) { KeRaiseIrql(DISPATCH_LEVEL, PreviousIrql); [spin on the lock…

I have no idea who created the name for PNP_DEVICE_NOT_DISABLEABLE, but I probably have the same reaction as you … “seriously? that is what they named?” I mean come on, I think it could have at least been named PNP_DEVICE_CANNOT_BE_DISABLED. I am sure you can think of some better names too. If so, please leave…

One interesting quirk about the PNP_DEVICE_NOT_DISABLEABLE state is that once it has been set and the PnP manager has processed it, the state is sticky. By sticky I mean that even if you attempt to clear this bit on a subsequent IRP_MN_QUERY_PNP_DEVICE_STATE IRP, the PnP manager ignores your changes to this state. This state remains…

One thing that is easily overlooked about implementing DriverEntry is that upon return !NT_SUCCESS, DriverUnload is not called. I mentioned this anecdotally in a previous post, but it is worth expanding on. I was bit by this oversight when I was working on the Bluetooth stack. Driver verifier correctly identified that my driver had leaked…

During my sophomore year at Cal Poly, I decided that I wanted to learn about threads, synchronization techniques and other topics associated modern operating systems. Windows 95 had made its debut (yes, it is not a modern OS, but I didn’t know that at the time!) and I had heard about Windows NT, but had…