Как настроить DEVICE_DESCRIPTION для IoGetDmaAdapter? - PullRequest
0 голосов
/ 14 июля 2020

Я пытался реализовать драйвер 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

...