Compatibilidad con DMA en controladores AVStream de 64 bits
AVStream admite DMA en dispositivos direccionables de 32 y 64 bits.
Todos los controladores compilados para plataformas Win64 deben usar IKsDeviceFunctions::RegisterAdapterObjectEx en lugar de KsDeviceRegisterAdapterObject.
IKsDeviceFunctions::RegisterAdapterObjectEx solo está disponible en Microsoft Windows Server 2003 SP1 y versiones posteriores.
En el ejemplo de código siguiente se muestra cómo admitir DMA tanto en la versión de cliente basada en x64 como en las 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 ejemplo de código funciona en plataformas de 64 bits y de 32 bits. Si el controlador no encuentra IKsDeviceFunctions::RegisterAdapterObjectEx, todavía llama a KsDeviceRegisterAdapter.
Además, al crear un controlador AVStream de 64 bits, minimice el número de bloqueos de fotograma simultáneos mantenidos. Dado que AVStream genera asignaciones de dispersión o recopilación cuando el minidriver bloquea los fotogramas por primera vez, el controlador podría agotarse de recursos si no sigue esta guía. En concreto, si está escribiendo un controlador para que se ejecute en una plataforma Win64 con una tarjeta de 32 bits, aumentar el número de bloqueos simultáneos aumenta la posibilidad de que se produzca un error en un bloqueo porque los búferes de memoria bajos son un recurso limitado.