共用方式為


使用記憶體緩衝區

驅動程式通常會使用記憶體緩衝區將數據傳入架構和其他驅動程式,或將資訊儲存在本機。 本主題描述 架構記憶體物件lookaside 清單MDL,以及 本機緩衝區

使用框架記憶體對象

架構會使用 記憶體物件 來描述驅動程式從 中接收並傳遞至架構的記憶體緩衝區。 每個架構記憶體物件都代表一個緩衝區。

若要建立記憶體物件,驅動程式會呼叫下列其中一個物件方法:

若要取得表示已接收 I/O 要求的緩衝區的記憶體對象,驅動程式會呼叫 WdfRequestRetrieveInputMemoryWdfRequestRetrieveOutputMemory。 如需擷取 I/O 要求緩衝區的詳細資訊,請參閱在 Framework-Based Drivers 中存取數據緩衝區

若要取得記憶體物件緩衝區的位址和大小,驅動程式會呼叫 WdfMemoryGetBuffer

若要將資料移入或移出記憶體物件的緩衝區,驅動程式會呼叫 WdfMemoryCopyFromBufferWdfMemoryCopyToBuffer。 這些物件方法會檢查來源和目的地大小,並防止緩衝區溢出錯誤。

如果您的驅動程式藉由呼叫 WdfMemoryCreatePreallocated來建立記憶體物件,它接著可以呼叫 WdfMemoryAssignBuffer,將不同的緩衝區指派給記憶體物件。

當驅動程式將 I/O 要求傳送至 I/O 目標時,通常會將輸入或輸出緩衝區傳遞至 架構 I/O 目標物件方法。 驅動程式透過傳遞描述緩衝區的 WDF_MEMORY_DESCRIPTOR 結構或傳遞記憶體物件控制碼來指定緩衝區。 (以同步方式傳送 I/O 要求的 I/O 目標物件方法需要 WDF_MEMORY_DESCRIPTOR 結構,以及以異步方式傳送 I/O 要求的方法需要記憶體物件句柄。

如需記憶體緩衝區有效時間的相關信息,請參閱 記憶體緩衝區生命週期

使用 Lookaside 列表

如果您的驅動程式需要大小大致相同的許多緩衝區,應該從 眺望清單配置這些緩衝區,。 驅動程式會呼叫 WdfLookasideListCreate來建立旁視清單。 接著,驅動程式可以呼叫 WdfMemoryCreateFromLookaside,從 lookaside 列表中取得緩衝區。

每次驅動程式呼叫 WdfMemoryCreateFromLookaside時,架構都會建立記憶體物件、從 lookaside 列表中取得緩衝區,並將緩衝區指派給物件。 當驅動程式使用這些記憶體物件的其中一個完成時,它會呼叫 WdfObjectDelete,這會刪除記憶體物件,並將緩衝區空間傳回 lookaside 清單。

作業系統會管理指派給 lookaside 清單的記憶體資源。 如果驅動程式在沒有可用時向 lookaside 清單要求緩衝區,例如驅動程式第一次呼叫 WdfMemoryCreateFromLookaside時,系統會配置緩衝區並將它指派給清單。 當驅動程式呼叫 WdfObjectDelete (而緩衝區空間會傳回至 lookaside 列表),系統會將現在未指派的緩衝區保留在清單中,直到驅動程式再次需要它為止。 系統會視需要增加清單的大小;例如,更頻繁請求緩衝區的驅動程式會收到較大的旁路清單。 另一方面,如果驅動程式未全部使用,系統可能會減少清單中的緩衝區數目。

使用 MDL

某些驅動程式會使用記憶體描述元清單 (MDL) 來描述緩衝區。 例如,直接記憶體存取 (DMA) 裝置的驅動程式必須在呼叫該方法時,將 MDL 傳遞至 WdfDmaTransactionInitialize 方法。

使用 MDL 的驅動程式可以藉由呼叫 WdfRequestRetrieveInputWdmMdlWdfRequestRetrieveOutputWdmMdl來取得代表已接收 I/O 要求的緩衝區的 MDL。

大部分以架構為基礎的驅動程式不會使用 MDL。

配置本機緩衝區

需要本機、內部緩衝區空間且不會傳遞至架構的驅動程式不需要建立記憶體物件來表示緩衝區。 驅動程式可以呼叫 ExAllocatePoolWithTag 來配置內部緩衝區。 當驅動程式使用緩衝區完成時,它必須呼叫 ExFreePoolWithTag

不過,驅動程式也可以將記憶體物件用於本機緩衝區。 使用記憶體緩衝區的優點,而不是呼叫 ExAllocatePoolWithTag,是架構會在刪除每個物件的父物件時自動刪除記憶體物件及其緩衝區。

這很重要

本主題中所討論的 ExAllocatePool DIS 已在 Windows 10 版本 2004 中淘汰,並已由 ExAllocatePool2ExAllocatePool3取代。 如需詳細資訊,請參閱 將已取代的 ExAllocatePool 呼叫更新為 ExAllocatePool2 和 ExAllocatePool3

對齊緩衝區

您的驅動程式可以使用 WDF_ALIGN_SIZE_UPWDF_ALIGN_SIZE_DOWN 函式來計算對齊指定對齊位移的緩衝區大小。 如果您的驅動程式必須配置多個連續緩衝區,如果每個緩衝區必須從位址對齊界限開始,這個計算就很有用。