使用一般緩衝區
[僅適用于 KMDF]
DMA 裝置的驅動程式有時必須配置裝置和驅動程式可以存取的緩衝區空間。 例如,裝置可能會將傳輸資訊寫入此緩衝區空間中,例如位元組計數,而驅動程式可以讀取它,以判斷已傳輸的位元組數目。 這種類型的緩衝區空間稱為 一般緩衝區。
若要配置一般緩衝區,驅動程式的 EvtDriverDeviceAdd 回呼函式:
呼叫 WdfDmaEnablerCreate 以建立 DMA enabler 物件。
呼叫 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。