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 プラットフォームで実行するドライバーを作成する場合、同時ロックの数を増やすと、メモリ バッファーが少なく、リソースが限られているためにロックが失敗する可能性が高くなります。