64 ビット AVStream ドライバーの DMA のサポート

AVStream は、32 ビットおよび 64 ビットのアドレス指定可能なデバイスの DMA をサポートします。

Win64 プラットフォーム用にコンパイルされたすべてのドライバーでは、IKsDeviceFunctions::RegisterAdapterObjectEx を使用し、KsDeviceRegisterAdapterObjectは使用すべきではありません。

IKsDeviceFunctions::RegisterAdapterObjectEx は、Microsoft Windows Server 2003 SP1 以降でのみ使用できます。

次のコード例は、x64 ベースのクライアント リリースと 32 ビット プラットフォームの両方で DMA をサポートする方法を示しています。

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 はミニドライバーが最初にフレームをロックするときに散布図/収集マッピングを生成するため、このガイドラインに従っていない場合、ドライバーはリソースが不足する可能性があります。 特に、32 ビット カードを使用して Win64 プラットフォームで実行するドライバーを作成する場合、同時ロックの数を増やすと、メモリ バッファーが少なく、リソースが限られているためにロックが失敗する可能性が高くなります。