Поддержка DMA в 64-разрядных драйверах AVStream

AVStream поддерживает DMA на 32- и 64-разрядных устройствах с адресной поддержкой.

Все драйверы, скомпилированные для платформ Win64, должны использовать IKsDeviceFunctions::RegisterAdapterObjectEx вместо KsDeviceRegisterAdapterObject.

IKsDeviceFunctions::RegisterAdapterObjectEx доступен только в Microsoft Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версиях.

В следующем примере кода показано, как поддерживать DMA на 64-разрядных и 32-разрядных платформах:

NTSTATUS MyDeviceStart (...) {
// Get the DMA adapter object and store it in the Context member of the I/O stack location.
Context -> AdapterObject = IoGetDmaAdapter (
Device -> PhysicalDeviceObject,
&DeviceDesc,
&Context -> NumberOfMapRegisters
);

PUNKNOWN DeviceUnk =
KsDeviceGetOuterUnknown (
Device
);

// Register the DMA adapter with AVStream
IKsDeviceFunctions *DeviceFunctions;
NTSTATUS Status = DeviceUnk -> QueryInterface (
__uuidof (IKsDeviceFunctions),
(PVOID *)&DeviceFunctions
);

// Conditionally, call IksDeviceFunctions::RegisterAdapterObjectEx, 
// which will not break downlevel load compatibility.

if (NT_SUCCESS (Status)) {
DeviceFunctions -> RegisterAdapterObjectEx (
Context -> AdapterObject,
&DeviceDesc,
Context -> NumMapRegisters,
MAX_MAPPING,
sizeof (KSMAPPING)
);
DeviceFunctions -> Release ();
}

// If this call fails, call KsDeviceRegisterAdapterObject to
// preserve downlevel load compatibility.
else {
KsDeviceRegisterAdapterObject (
Device,
Context -> AdapterObject,
MAX_MAPPING,
sizeof (KSMAPPING)
);
}
...

Этот пример кода работает на 64-разрядных и 32-разрядных платформах. Если драйвер не находит IKsDeviceFunctions::RegisterAdapterObjectEx, он по-прежнему вызывает KsDeviceRegisterAdapter.

Кроме того, при создании 64-разрядного драйвера AVStream сведите к минимуму количество одновременных блокировок кадров. Так как AVStream создает точечные и собираемые сопоставления, когда мини-драйвер сначала блокирует кадры, ваш драйвер может не использовать ресурсы, если он не будет следовать этому руководству. В частности, если вы пишете драйвер для работы на платформе Win64 с 32-разрядным карта, увеличение числа одновременных блокировок увеличивает вероятность сбоя блокировки из-за нехватки буферов памяти является ограниченным ресурсом.