Condividi tramite


Supporto di DMA nei driver AVStream a 64 bit

AVStream supporta DMA nei dispositivi indirizzabili a 32 bit e a 64 bit.

Tutti i driver compilati per le piattaforme Win64 devono usare IKsDeviceFunctions::RegisterAdapterObjectEx anziché KsDeviceRegisterAdapterObject.

IKsDeviceFunctions::RegisterAdapterObjectEx è disponibile solo in Microsoft Windows Server 2003 SP1 e versioni successive.

Nell'esempio di codice seguente viene illustrato come supportare DMA sia nella versione client basata su x64 che sulle piattaforme a 32 bit:

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

Questo esempio di codice funziona su piattaforme a 64 bit e a 32 bit. Se il driver non trova IKsDeviceFunctions::RegisterAdapterObjectEx, chiama comunque KsDeviceRegisterAdapter.

Inoltre, quando si crea un driver AVStream a 64 bit, ridurre al minimo il numero di blocchi di fotogrammi simultanei mantenuti. Poiché AVStream genera mapping a dispersione/raccolta quando il minidriver blocca i fotogrammi, il driver potrebbe esaurire le risorse se non segue questa linea guida. In particolare, se si sta scrivendo un driver per l'esecuzione in una piattaforma Win64 con una scheda a 32 bit, aumentando il numero di blocchi simultanei aumenta la probabilità che un blocco avrà esito negativo perché i buffer di memoria insufficiente sono una risorsa limitata.