Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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-разрядным карта, увеличение числа одновременных блокировок увеличивает вероятность сбоя блокировки из-за нехватки буферов памяти является ограниченным ресурсом.