Я пытался реализовать драйвер WDM с использованием системного DMA (или Intel CBDMA) для доступа к данным из памяти в память. Однако я просто получаю NULL, возвращаемый IoGetDmaAdapter, когда хочу получить объект адаптера DMA. Этот драйвер предназначен для установки в качестве службы, которая не будет привязана к какому-либо физическому устройству.
NTSTATUS Status = STATUS_SUCCESS;
ULONG DmaRequestLine = 2;
PDMA_ADAPTER pWriteAdapter = NULL;
ULONG AllocatableMapRegisters = 0, RequestedMapRegisters = 2;
DEVICE_DESCRIPTION Description;
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
RtlZeroMemory(&Description, sizeof(Description));
Description.Version = DEVICE_DESCRIPTION_VERSION;
Description.DmaAddressWidth = 32;
Description.DmaRequestLine = DmaRequestLine;
Description.DmaChannel = DmaRequestLine;
Description.InterfaceType = Isa;
Description.Master = FALSE;
Description.ScatterGather = FALSE;
Description.MaximumLength = 8*1024;
pWriteAdapter = IoGetDmaAdapter(DeviceObject,
&Description,
&AllocatableMapRegisters);
//
// This is the expected return path on all systems, since no
// system DMA controller supports request line 0x1000.
//
if ( pWriteAdapter == NULL )
{
DbgPrintEx(DPFLTR_IHVBUS_ID, 0, "IoGetDmaAdapter failed for request line %d. \n", Description.DmaRequestLine );
Status = STATUS_NO_MATCH;
goto Exit;
}
DbgPrint("DMA adapter is allocated.\n");
Коды, указанные в Windows -driver-samples