PALLOCATE_COMMON_BUFFER_EX回呼函式 (wdm.h)
AllocateCommonBufferEx 例程會配置一般緩衝區的記憶體,並對應此記憶體,讓處理器和執行 DMA 作業的裝置可以存取它。
語法
PALLOCATE_COMMON_BUFFER_EX PallocateCommonBufferEx;
PVOID PallocateCommonBufferEx(
[in] PDMA_ADAPTER DmaAdapter,
[in, optional] PPHYSICAL_ADDRESS MaximumAddress,
[in] ULONG Length,
[out] PPHYSICAL_ADDRESS LogicalAddress,
[in] BOOLEAN CacheEnabled,
[in] NODE_REQUIREMENT PreferredNode
)
{...}
參數
[in] DmaAdapter
DMA_ADAPTER 結構的指標。 這個結構是代表驅動程式總線主機 DMA 裝置或系統 DMA 通道的配接器物件。 呼叫端從先前呼叫 IoGetDmaAdapter 例程取得此指標。
[in, optional] MaximumAddress
變數的指標,其中包含通用緩衝區的最大邏輯位址。 此參數表示緩衝區應該從此位址下方的記憶體配置。 此參數是選擇性的,而且可以指定為 NULL,表示沒有最大位址。
[in] Length
要配置給 DMA 作業之通用緩衝區的大小,以位元組為單位。
[out] LogicalAddress
變數的指標,此例程會寫入裝置可用來存取通用緩衝區的邏輯位址。 DMA 裝置應該使用此邏輯位址,而不是 由 MmGetPhysicalAddress 等例程傳回的實體位址。
[in] CacheEnabled
例程是否必須在要配置的通用緩衝區中啟用或停用快取的記憶體。 如果為 TRUE,則會啟用快取。 如果為 FALSE,則會停用它。 如果硬體平臺不會強制執行 DMA 作業的快取共通,則傳遞 FALSE。 如需 ARM 或 ARM 64 處理器目標電腦上此參數的相關信息,請參閱。
[in] PreferredNode
要從中配置記憶體的慣用NUMA節點。 如果 N 是多處理器系統中的 NUMA 節點數目, PreferredNode 是範圍 0 到 N–1 的數位。 如果是一個處理器系統或非 NUMA 多處理器系統,請將 PreferredNode 設定為零。
傳回值
AllocateCommonBufferEx 會傳回為通用緩衝區配置的記憶體虛擬位址。 如果無法配置緩衝區,則會傳回NULL。
備註
AllocateCommonBufferEx 不是可直接依名稱呼叫的系統例程。 此例程只能由 DMA_OPERATIONS 結構中 傳回之位址的指標呼叫。 驅動程式會呼叫 IoGetDmaAdapter ,並將 DeviceDescription 參數的Version成員設定為DEVICE_DESCRIPTION_VERSION3,以取得此例程的位址。 如果 IoGetDmaAdapter 傳回 NULL,您的平台上無法使用例程。
AllocateCommonBufferEx 是 AllocateCommonBuffer 例程的擴充版本。 下列清單摘要說明僅適用於擴充版本的功能:
呼叫端可以為要配置的通用緩衝區指定最大邏輯位址。
呼叫端可以指定要配置通用緩衝區的慣用NUMA節點。
在具有 ARM 或 ARM 64 處理器的電腦上,系統 ACPI 中的快取設定優先順序高於驅動程式所傳遞的 CacheEnabled 參數值。 如果 ACPI _CCA 方法指出裝置未快取一致,即使驅動程式將快取記憶體配置為 TRUE,操作系統仍會停用快取。
在具有 ARM 或 ARM 64 處理器的電腦上,作業系統會將未快取的通用緩衝區配置為裝置記憶體。 如需緩衝區的詳細資訊,請參閱 ARMv7架構參考手冊中的A3.5.1和A3.5.6小節。
處理器不允許未對齊裝置記憶體的存取。 您的驅動程式一律必須使用自然對齊的作業,從一般緩衝區存取數據。 大部分的核心例程不接受裝置記憶體作為輸入參數。 例如,網路驅動程式無法將裝置記憶體傳遞至 NdisMIndicateReceiveNetBufferLists。 如果您的驅動程式需要將數據從 DMA 通用緩衝區傳遞至核心例程,請將 CacheEnabled 設定為 TRUE 的緩衝區配置,或將數據從未快取的通用緩衝區複製到暫存集區配置。
如需使用通用緩衝區之 DMA 作業的詳細資訊,請參閱下列主題:
使用 Common-Buffer Bus-Master DMA
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 從 Windows 8 開始提供。 |
目標平台 | 桌面 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | PASSIVE_LEVEL |