使用記憶體緩衝區
驅動程式通常會使用記憶體緩衝區,將資料傳入架構和其他驅動程式,或將資料儲存在本機。 本主題描述 架構記憶體物件、 lookaside 清單、 MDL和 本機緩衝區。
使用 Framework 記憶體物件
架構會使用 記憶體物件 來描述驅動程式從 和 傳遞至架構的記憶體緩衝區。 每個架構記憶體物件都代表一個緩衝區。
若要建立記憶體物件,您的驅動程式會呼叫下列其中一個物件方法:
WdfMemoryCreate,它會建立記憶體物件,並配置指定大小的記憶體緩衝區。
WdfMemoryCreatePreallocated,它會為預先配置的緩衝區建立記憶體物件。
WdfMemoryCreateFromLo一side,它會從 lookaside 清單中建立記憶體緩衝區。
若要取得代表所接收 I/O 要求緩衝區的記憶體物件,您的驅動程式會呼叫 WdfRequestRetrieveInputMemory 和 WdfRequestRetrieveOutputMemory。 如需擷取 I/O 要求緩衝區的詳細資訊,請參閱 存取Framework-Based驅動程式中的資料緩衝區。
若要取得記憶體物件緩衝區的位址和大小,您的驅動程式會呼叫 WdfMemoryGetBuffer。
若要將資料移入或移出記憶體物件的緩衝區,您的驅動程式會呼叫 WdfMemoryCopyFromBuffer 或 WdfMemoryCopyToBuffer。 這些物件方法會檢查來源和目的地大小,並防止緩衝區溢位錯誤。
如果您的驅動程式藉由呼叫 WdfMemoryCreatePreallocated來建立記憶體物件,則後續可以藉由呼叫 WdfMemoryAssignBuffer將不同的緩衝區指派給記憶體物件。
當驅動程式將 I/O 要求傳送至 I/O 目標時,通常會將輸入或輸出緩衝區傳遞至 架構 I/O 目標物件方法。 驅動程式會傳遞 描述緩衝區的WDF_MEMORY_DESCRIPTOR 結構,或傳遞記憶體物件控制碼來指定緩衝區。 (以同步方式傳送 I/O 要求的 I/O 目標物件方法需要 WDF_MEMORY_DESCRIPTOR 結構,以及以非同步方式傳送 I/O 要求的方法需要記憶體物件控制碼。)
如需記憶體緩衝區何時有效的相關資訊,請參閱 記憶體緩衝區生命週期。
使用 Lookaside 清單
如果您的驅動程式需要大小約相同的許多緩衝區,則應該從 lookaside 清單中配置這些緩衝區。 驅動程式會藉由呼叫 WdfLo,sideListCreate來建立 lookaside 清單。 接著,驅動程式可以藉由呼叫 WdfMemoryCreateFromLo以從 lookaside清單中取得緩衝區。
每次驅動程式呼叫 WdfMemoryCreateFromLo一side 時,架構都會建立記憶體物件、從 lookaside 清單中取得緩衝區,並將緩衝區指派給物件。 當驅動程式使用其中一個記憶體物件完成時,它會呼叫 WdfObjectDelete,這會刪除記憶體物件,並將緩衝區空間傳回至 lookaside 清單。
作業系統會管理指派給 lookaside 清單的記憶體資源。 如果驅動程式在沒有可用時向 lookaside 清單要求緩衝區,例如驅動程式第一次呼叫 WdfMemoryCreateFromLo在side 時,系統會配置緩衝區並將它指派給清單。 當驅動程式呼叫 WdfObjectDelete (,並將緩衝區空間傳回至 lookaside 清單) 時,系統會將現在未指派的緩衝區保留在清單中,直到驅動程式再次需要為止。 系統會視需要增加清單的大小;例如,要求緩衝區更頻繁的驅動程式會收到較大的外觀清單。 另一方面,如果驅動程式未全部使用,系統可能會減少清單中的緩衝區數目。
使用 MDL
某些驅動程式會使用記憶體描述項清單 (MDL) 來描述緩衝區。 例如,直接記憶體存取的驅動程式 (DMA) 裝置必須在呼叫該方法時,將 MDL 傳遞至 WdfDmaTransactionInitialize 方法。
使用 MDL 的驅動程式可以藉由呼叫 WdfRequestRetrieveInputWdmMdl 和 WdfRequestRetrieveOutputWdmMdl來取得代表已接收 I/O 要求的緩衝區的 MDL。
大部分以架構為基礎的驅動程式都不會使用 MDL。
配置本機緩衝區
需要本機內部緩衝區空間且不會傳遞給架構的驅動程式不需要建立記憶體物件來表示緩衝區。 驅動程式可以呼叫 ExAllocatePoolWithTag 來配置內部緩衝區。 當驅動程式使用完緩衝區時,它必須呼叫 ExFreePoolWithTag。
不過,驅動程式也可以針對本機緩衝區使用記憶體物件。 使用記憶體緩衝區的優點,而不是呼叫 ExAllocatePoolWithTag,是當刪除每個物件的父物件時,架構會自動刪除記憶體物件及其緩衝區。
重要
本主題中所討論的 ExAllocatePool DIS 在 Windows 10 2004 版中已被取代,而且已由ExAllocatePool2和ExAllocatePool3取代。 如需詳細資訊,請參閱 更新對 ExAllocatePool2 和 ExAllocatePool3 的已淘汰 ExAllocatePool 呼叫。
對齊緩衝區
您的驅動程式可以使用 WDF_ALIGN_SIZE_UP 或 WDF_ALIGN_SIZE_DOWN 函式來計算對齊指定對齊位移的緩衝區大小。 如果您的驅動程式必須配置多個連續緩衝區,如果每個緩衝區必須從位址對齊界限開始,則此計算很有用。