共通バッファーの使用
[KMDF にのみ適用]
DMA デバイスのドライバーは、デバイスとドライバーの両方がアクセスできるバッファー領域を割り当てる必要があります。 たとえば、デバイスはこのバッファー領域にバイト数などの転送情報を書き込み、ドライバーはそれを読み取って、転送されたバイト数を決定できます。 この種類のバッファー領域は、共通バッファーと呼ばれます。
共通バッファーを割り当てるには、ドライバーの EvtDriverDeviceAdd コールバック関数を使用します。
WdfDmaEnablerCreate を呼び出して DMA イネーブラー オブジェクトを作成します。
WdfCommonBufferCreate または WdfCommonBufferCreateWithConfig を呼び出してバッファーを作成します。
WdfCommonBufferGetAlignedLogicalAddress を呼び出して、デバイスがアクセスできるバッファーの論理アドレスを取得します。
WdfCommonBufferGetAlignedVirtualAddress を呼び出して、ドライバーがアクセスできるバッファーの仮想アドレスを取得します。
次のコード例は、PLX9x5x サンプルの Init.c ファイルから取得したものです。 このコードは、KMDF ドライバーが共通のバッファー領域を割り当てる方法を示しています。
// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize =
sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
DevExt->WriteCommonBufferSize,
WDF_NO_OBJECT_ATTRIBUTES,
&DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
. . . //Error-handling code omitted
}
DevExt->WriteCommonBufferBase =
WdfCommonBufferGetAlignedVirtualAddress(
DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA =
WdfCommonBufferGetAlignedLogicalAddress(
DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);
ドライバーが WdfDmaEnablerCreate を呼び出す前に WdfDeviceSetAlignmentRequirement を呼び出す場合、WdfDmaEnablerCreate によって作成されるバッファーは、ドライバーが WdfDeviceSetAlignmentRequirement に指定したメモリ アドレス境界にアラインされます。 それ以外の場合、共通バッファーはワード アドレス境界にアラインされます。 または、ドライバーは WdfCommonBufferCreateWithConfig を呼び出しバッファーの配置を指定できます。
ドライバーが割り当てた共通バッファーの長さを取得するために、ドライバーは WdfCommonBufferGetLength を呼び出すことができます。
ドライバーが共通バッファーを使用して完了すると、ドライバーは WdfObjectDelete を呼び出します。