Здравствуйте!
Разрабатываю PCI устройство на базе ПЛИС. Оно имеет один BAR для настройки и обмена данными. Со стороны ОС в ПЛИС можно писать и читать. ПЛИС не поддерживает работу в режиме мастера PCI, и DMA контроллер в ней не реализован.
Работоспособность устройства подтверждена на ОС QNX. Сейчас стоит задача написать драйвер WDF под Windows 7 x32. 
Использую пример PLX9x5x от Microsoft.
Изменил пример следующим образом.
В инициализации памяти: 
 desc = WdfCmResourceListGetDescriptor(ResourcesTranslated, i);    // desc->Type == CmResourceTypeMemory
  regsBasePA = desc->u.Memory.Start;
  regsLength = desc->u.Memory.Length;
  foundRegs = TRUE;
  bar = "BAR0";
  
  DevExt->RegsBase = (PUCHAR)LocalMmMapIoSpace(regsBasePA,
			regsLength);
  DevExt->RegsLength = regsLength;
  DevExt->Regs = (PPCI9656_REGS)DevExt->RegsBase;
Получаю подтверждение о трансляции регистровой памяти.
Создаю очереди обработки запросов на чтение и запись запросов DMA. При этом убрал запуск выполнения DMA (поскольку у меня его нет), а так же ряд других функций, которые приводили к падению.
Сейчас драйвер устанавливается на устройство. При запуске пользовательского приложения ( находится в том же примере) устройство находится, можно инициализировать транзакцию чтения, которая выглядит так: 
 VOID
  PLxEvtIoRead(
    IN WDFQUEUE         Queue,
    IN WDFREQUEST       Request,
    IN size_t            Length
    )
  {
    NTSTATUS                status = STATUS_UNSUCCESSFUL;
    PDEVICE_EXTENSION       devExt;
    TraceEvents(TRACE_LEVEL_INFORMATION, DBG_READ,
                "--> PLxEvtIoRead: Request %p", Request);
    //
    // Get the DevExt from the Queue handle
    //
    devExt = PLxGetDeviceContext(WdfIoQueueGetDevice(Queue));
	TraceEvents(TRACE_LEVEL_INFORMATION, DBG_READ,"--> My Write:");
  
  // Мои вызовы функций записи в устройство.
	WRITE_REGISTER_UCHAR((PUCHAR)&devExt->Regs + 0xa000,8);
	WRITE_REGISTER_ULONG((PULONG)&devExt->Regs+0xa000, 1);
	WRITE_REGISTER_ULONG((PULONG)&devExt->RegsBase, 2);
	WRITE_REGISTER_ULONG((PULONG)&devExt->RegsBase+0xA001, 3);
	WRITE_PORT_ULONG((PULONG)&devExt->RegsBase, 4);
  
  status = STATUS_SUCCESS;
  WdfRequestComplete(Request, status);
  return;
  
Эта функция выполняется, но мои запросы на запись через функции WRITE_REGISTER_ULONG не приводят к транзакции записи на PCI шине (это отслеживаю через отладчик для ПЛИС).
Мой вопрос: как произвести чтение, запись в регистровую память устройства? 
В QNX для этого достаточно знать указатель на начало транслированного буфера. Может для Windows нужно сделать что-то ещё?
Имею очень слабые представления о драйверах, читаю MSDN и Орвика.