Share via


共通バッファーの使用

[KMDF にのみ適用]

DMA デバイスのドライバーは、デバイスとドライバーの両方がアクセスできるバッファー領域を割り当てる必要があります。 たとえば、デバイスはこのバッファー領域にバイト数などの転送情報を書き込み、ドライバーはそれを読み取って、転送されたバイト数を決定できます。 この種類のバッファー領域は、共通バッファーと呼ばれます。

共通バッファーを割り当てるには、ドライバーの EvtDriverDeviceAdd コールバック関数を使用します。

次のコード例は、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 を呼び出します。