Suporte ao DMA em drivers AVStream de 64 bits

O AVStream dá suporte ao DMA em dispositivos endereçáveis de 32 bits e 64 bits.

Todos os drivers compilados para plataformas Win64 devem usar IKsDeviceFunctions::RegisterAdapterObjectEx em vez de KsDeviceRegisterAdapterObject.

IKsDeviceFunctions::RegisterAdapterObjectEx só está disponível no Microsoft Windows Server 2003 SP1 e posterior.

O exemplo de código a seguir ilustra como dar suporte ao AMD na versão do cliente baseada em x64 e nas plataformas de 32 bits:

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)
);
}
...

Este exemplo de código funciona em plataformas de 64 bits, bem como em plataformas de 32 bits. Se o driver não encontrar IKsDeviceFunctions::RegisterAdapterObjectEx, ele ainda chamará KsDeviceRegisterAdapter.

Além disso, ao criar um driver AVStream de 64 bits, minimize o número de bloqueios de quadro simultâneos mantidos. Como o AVStream gera mapeamentos de dispersão/coleta quando o minidriver bloqueia os quadros pela primeira vez, o driver pode ficar sem recursos se não seguir esta diretriz. Em particular, se você estiver escrevendo um driver para ser executado em uma plataforma Win64 com um cartão de 32 bits, aumentar o número de bloqueios simultâneos aumentará a chance de um bloqueio falhar porque buffers de memória baixa são um recurso limitado.