Unterstützung von DMA in 64-Bit-AVStream-Treibern

AVStream unterstützt DMA auf 32-Bit- und 64-Bit-adressierbaren Geräten.

Alle Treiber, die für Win64-Plattformen kompiliert werden, sollten IKsDeviceFunctions::RegisterAdapterObjectEx anstelle von KsDeviceRegisterAdapterObject verwenden.

IKsDeviceFunctions::RegisterAdapterObjectEx ist nur in Microsoft Windows Server 2003 SP1 und höher verfügbar.

Im folgenden Codebeispiel wird veranschaulicht, wie DMA sowohl auf der x64-basierten Clientversion als auch auf 32-Bit-Plattformen unterstützt wird:

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

Dieses Codebeispiel funktioniert sowohl auf 64-Bit- als auch auf 32-Bit-Plattformen. Wenn der Treiber IKsDeviceFunctions::RegisterAdapterObjectEx nicht findet, ruft er trotzdem KsDeviceRegisterAdapter auf.

Darüber hinaus minimieren Sie beim Erstellen eines 64-Bit-AVStream-Treibers die Anzahl gleichzeitiger Framesperren. Da AVStream Punkt-/Gather-Zuordnungen generiert, wenn der Minitreiber Frames zum ersten Mal sperrt, können ihrem Treiber die Ressourcen ausgehen, wenn er diese Richtlinie nicht befolgt. Insbesondere wenn Sie einen Treiber schreiben, der auf einer Win64-Plattform mit einem 32-Bit-Karte ausgeführt werden soll, erhöht das Erhöhen der Anzahl gleichzeitiger Sperren die Wahrscheinlichkeit, dass eine Sperre fehlschlägt, da Puffer mit geringem Arbeitsspeicher eine begrenzte Ressource sind.