Windows System Software -- Consulting, Training, Development -- Unique Expertise, Guaranteed Results

Sept/Oct 2019 Issue of The NT Insider available

Download PDF here:

It’s a particularly BIG issue, too: 40 pages of technical goodness, ranging from WDF to Minifilters. Check it out.
Before Posting...
Please check out the Community Guidelines in the Announcements and Administration Category.

Question on loading firmware into PCIe device.

Erik_DabrowskyErik_Dabrowsky Member - All Emails Posts: 16


I'd like to get an answer to a question and some ideas/feedback on a good way to load a firmware binary into my PCIe device.

The card requires that I specify the address of the firmware code in system memory using four 16 bit registers (it can support a 64 bit address) and two 16 bit registers for the length. Then write a command to another register to cause it to read the data from system memory. The firmware binary is approx 256kb.

My game plan so far is to read the firmware binary off disk and into a WDFMemory object during DriverEntry. This way if the file is not found or something is wrong with it, I can fail the driver early (also the framework will clean up the memory object for me when the driver unloads).

Next in the EvtDeviceAdd callback I'll set up a WDFDMAEnabler and WDFCommonBuffer. I'll need this later anyway for other DMA operations.

The routine to actually load the firmware into the device will probably be called from EvtDeviceD0EntryPostInterruptsEnabled.
In this routine I plan to copy the data from the WDFMemory buffer to the WDFCommonBuffer, then start a DMA transaction.

Here's where I hit a bit of a snag. The WdfDmaTransactionInitialize function requires an MDL and a VirtualAddress.
I'm assuming I can supply the virtual address of the WDFCommonBuffer, but where do I get the MDL from?
Do I need to call IoAllocateMdl and MmBuildMdlForNonPagedPool and then pass that to the WdfDmaTransactionInitialize function?



  • Peter_Viscarola_(OSR)Peter_Viscarola_(OSR) Administrator Posts: 7,411

    Ah! I just did this... don’t use a DMA transaction. Instead, just pass the Logical address of the Common Buffer to your device to use in its DMA operation. Done!


    Peter Viscarola

  • Erik_DabrowskyErik_Dabrowsky Member - All Emails Posts: 16

    Thanks Peter. This feels like one of those "duh!" moments where the answer was right in front of my face and I didn't see it. For some reason I was thinking the "map registers" part of it happened later in the DMA process.

Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Upcoming OSR Seminars
Writing WDF Drivers 21 Oct 2019 OSR Seminar Space & ONLINE
Internals & Software Drivers 18 Nov 2019 Dulles, VA
Kernel Debugging 30 Mar 2020 OSR Seminar Space
Developing Minifilters 27 Apr 2020 OSR Seminar Space & ONLINE