A
avearz
Создан драйвер с помощью Driver Studio 3.0.
В нём есть такой кусок:
NTSTATUS Driver_fc_pciDevice::OnStartDevice(KIrp I)
{
NTSTATUS status = STATUS_SUCCESS;
I.Information() = 0;
PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources();
PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources();
#define MAX_DMA_LENGTH 0x3200000 // 0x100000 is 1 MB
// Initialize the device descriptor for the DMA object using the assigned resource
DEVICE_DESCRIPTION dd;
RtlZeroMemory(&dd, sizeof(dd));
dd.Version = DEVICE_DESCRIPTION_VERSION;
dd.Master = TRUE;
dd.ScatterGather = FALSE;
dd.DemandMode = TRUE;
dd.AutoInitialize = FALSE;
dd.Dma32BitAddresses = TRUE;
dd.IgnoreCount = FALSE;
dd.DmaChannel = 0;
dd.InterfaceType = PCIBus;
dd.DmaWidth = Width32Bits; // PCI default width
dd.DmaSpeed = Compatible;
dd.MaximumLength = MAX_DMA_LENGTH;
// Initialize the DMA adapter object
m_Dma.Initialize(&dd, m_Lower.PDO());
Virtual_address_for_user = m_Dma.AllocateCommonBuffer(MAX_DMA_LENGTH,&Address_for_dma,false);
if (Virtual_address_for_user == NULL) {
m_Dma.Invalidate();
return STATUS_INSUFFICIENT_RESOURCES;
}
mdl = IoAllocateMdl(Virtual_address_for_user, MAX_DMA_LENGTH, FALSE, FALSE, NULL);
if (mdl == NULL) {
m_Dma.Invalidate();
return STATUS_INSUFFICIENT_RESOURCES;
}
................................
return status;
}
Если MAX_DMA_LENGTH более чем 3200000, то есть запрашивается выделение памяти размером более 32 Мбайт, то при установке этого драйвера он отторгается системой и устройство появляется в списке с желтым восклицательным знаком.
При этом реально в системе 4 Гигабайта оперативной памяти.
Может ли это быть принципиальным ограничением связанным, например, с контроллером DMA?
Или всё-таки возможно заставить WINDOWS предоставить эти ресурсы?
Буду благодарен форуму за любую информацию на эту тему
В нём есть такой кусок:
NTSTATUS Driver_fc_pciDevice::OnStartDevice(KIrp I)
{
NTSTATUS status = STATUS_SUCCESS;
I.Information() = 0;
PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources();
PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources();
#define MAX_DMA_LENGTH 0x3200000 // 0x100000 is 1 MB
// Initialize the device descriptor for the DMA object using the assigned resource
DEVICE_DESCRIPTION dd;
RtlZeroMemory(&dd, sizeof(dd));
dd.Version = DEVICE_DESCRIPTION_VERSION;
dd.Master = TRUE;
dd.ScatterGather = FALSE;
dd.DemandMode = TRUE;
dd.AutoInitialize = FALSE;
dd.Dma32BitAddresses = TRUE;
dd.IgnoreCount = FALSE;
dd.DmaChannel = 0;
dd.InterfaceType = PCIBus;
dd.DmaWidth = Width32Bits; // PCI default width
dd.DmaSpeed = Compatible;
dd.MaximumLength = MAX_DMA_LENGTH;
// Initialize the DMA adapter object
m_Dma.Initialize(&dd, m_Lower.PDO());
Virtual_address_for_user = m_Dma.AllocateCommonBuffer(MAX_DMA_LENGTH,&Address_for_dma,false);
if (Virtual_address_for_user == NULL) {
m_Dma.Invalidate();
return STATUS_INSUFFICIENT_RESOURCES;
}
mdl = IoAllocateMdl(Virtual_address_for_user, MAX_DMA_LENGTH, FALSE, FALSE, NULL);
if (mdl == NULL) {
m_Dma.Invalidate();
return STATUS_INSUFFICIENT_RESOURCES;
}
................................
return status;
}
Если MAX_DMA_LENGTH более чем 3200000, то есть запрашивается выделение памяти размером более 32 Мбайт, то при установке этого драйвера он отторгается системой и устройство появляется в списке с желтым восклицательным знаком.
При этом реально в системе 4 Гигабайта оперативной памяти.
Может ли это быть принципиальным ограничением связанным, например, с контроллером DMA?
Или всё-таки возможно заставить WINDOWS предоставить эти ресурсы?
Буду благодарен форуму за любую информацию на эту тему