_RxAllocatePoolWithTag函式
_RxAllocatePoolWithTag 從集區配置記憶體,其區塊開頭有四位元組標記,可用來協助攔截記憶體回收的實例。
語法
VOID* _RxAllocatePoolWithTag(
ULONG Type,
ULONG Size,
ULONG Tag,
PSZ FileName,
ULONG LineNumber
);
參數
類型
要配置的集區類型。 此參數可以是下列其中一個列舉值,適用於 POOL_TYPE:
NonPagedPool
可從任何 IRQL 存取的非可分頁系統記憶體。 NonPagedPool 記憶體是一項不足的資源,驅動程式應該在必要時才配置它。 系統只能以PAGE_SIZE的倍數配置大於 NonPagedPool PAGE_SIZE的緩衝區。 緩衝區的要求大於PAGE_SIZE,但不是PAGE_SIZE多個緩衝區,會浪費不可分頁的記憶體。
PagedPool
只能在 IRQL < DISPATCH_LEVEL配置和存取的可分頁系統記憶體。
大小
要配置的記憶體區塊大小,以位元組為單位。
標籤
要用來標記已配置緩衝區的四位元組標記。 如需如何使用標籤的描述,請參閱 ExAllocatePoolWithTag。 標記中每個字元的 ASCII 值必須介於 0 到 127 之間。
FileName
發生記憶體配置的來源檔名指標。 目前未使用此參數。
LineNumber
來源檔案中發生記憶體配置的行號。 目前未使用此參數。
傳回值
如果可用集區中的記憶體不足,RxAllocatePoolWithTag 會傳回 NULL,以滿足要求。 否則,例程會傳回已配置記憶體的指標。
備註
建議呼叫 RxAllocatePoolWithTag 宏,而不是直接使用此例程。 在零售組建上,此宏會定義為呼叫 ExAllocatePoolWithTag。 在核取的組建上,此宏會定義為呼叫 _RxAllocatePoolWithTag。
_RxAllocatePoolWithTag例程會呼叫 ExAllocatePoolWithTagPriority,其優先順序 (要求的重要性) 設為 LowPoolPriority。 當低資源執行時,系統可能會使 LowPoolPriority 的要求失敗。 使用這個例程時,驅動程式應該準備好從配置失敗中復原。
當系統從集區內存配置緩衝區PAGE_SIZE或更新版本時,它會對齊頁面界限上的緩衝區。 小於PAGE_SIZE的記憶體要求不一定在頁面界限上對齊,但一律符合單一頁面,而且會對齊 8 位元組界限。 任何要求大於PAGE_SIZE區塊且不是多個PAGE_SIZE成功配置都會浪費最後一個配置頁面上所有未使用的位元組。
系統會將集區標籤與配置的記憶體產生關聯。 WinDbg 之類的程式設計工具可以顯示與每個配置緩衝區相關聯的集區標籤。 Tag 的值通常會以反向順序顯示。 例如,如果呼叫端將 『Fred』 當做 標籤傳遞,則會在傾印記憶體時或追蹤調試程式中的記憶體使用量時顯示為 『derF』。
呼叫 _RxFreePool,應釋放配置_RxAllocatePoolWithTag的記憶體。
_RxAllocatePoolWithTag的呼叫端必須在 IRQL <= DISPATCH_LEVEL執行。 在 DISPATCH_LEVEL 執行的呼叫端必須指定 Type 參數的 NonPagedPool 值。 在 IRQL <= APC_LEVEL執行的呼叫端可以指定 Type 參數的任何POOL_TYPE值。
規格需求
目標平台 |
桌面 |
標頭 |
Ntrxdef.h (包含 Ntrxdef.h) |
IRQL |
請參閱一節。 |