WdkDeprecatedApi (Windows 驅動程式 CodeQL 查詢)
概觀
針對 Windows 10 版本 2004 版,Microsoft引進了預設為零的新集區零 API: ExAllocatePool2 和 ExAllocatePool3。
wdk-deprecated-api CodeQL 查詢會尋找驅動程式不應該呼叫的所有已取代 API 實例。 已被取代的 API 如下:
Windows 10 版本 2004 之前的 Windows 版本驅動程式更新
如果您要建置以 Windows 10 版本 2004 和更新版本為目標的驅動程式,請改用取代 API ExAllocatePool2 和 ExAllocatePool3 。
舊版 API | 新增 API |
---|---|
ExAllocatePool | ExAllocatePool2 |
ExAllocatePoolWithTag | ExAllocatePool2 |
ExAllocatePoolWithQuota | ExAllocatePool2 |
ExAllocatePoolWithQuotaTag | ExAllocatePool2 |
ExAllocatePoolWithTagPriority | ExAllocatePool3 |
新的 API 預設會零集區配置,以協助避免可能的記憶體洩漏錯誤。
ExAllocatePoolWithTag
// Old code
PVOID Allocation = ExAllocatePoolWithTag(PagedPool, 100, 'abcd');
RtlZeroMemory(Allocation, 100);
// New code
PVOID Allocation = ExAllocatePool2(POOL_FLAG_PAGED, 100, 'abcd');
舊的集區配置 API 接受 POOL_TYPE 自變數,但新的配置 API 接受 POOL_FLAGS 自變數。 更新任何相關聯的程序代碼,以使用新的 POOL_FLAGS 自變數。
ExAllocatePoolWithQuota/ExAllocatePoolWithQuotaTag
新的函式現在預設會在配置失敗時傳回NULL。 若要讓配置器改為在失敗時引發例外狀況,必須將POOL_FLAG_RAISE_ON_FAILURE旗標傳遞,如 ExAllocatePool2 中所述。
// Old code
PVOID Allocation = ExAllocatePoolWithQuotaTag(PagedPool | POOL_QUOTA_FAIL_INSTEAD_OF_RAISE, 100, 'abcd');
RtlZeroMemory(Allocation, 100);
// New code
PVOID Allocation = ExAllocatePool2(POOL_FLAG_PAGED | POOL_FLAG_USE_QUOTA, 100, 'abcd');
ExAllocatePoolWithTagPriority
// Old code
PVOID Allocation = ExAllocatePoolWithTagPriority(PagedPool, 100, 'abcd', HighPoolPriority);
RtlZeroMemory(Allocation, 100);
// New code
POOL_EXTENDED_PARAMETER params = {0};
params.Type = PoolExtendedParameterPriority;
params.Priority = HighPoolPriority;
PVOID Allocation = ExAllocatePool3(POOL_FLAG_PAGED, 100, 'abcd', ¶ms, 1);
Windows 10 版本 2004 之前的 Windows 版本驅動程式更新
如果您要建置以 Windows 10 版本 2004 之前的 Windows 版本為目標的驅動程式,您必須使用下列強制內嵌包裝函式。
您也必須在驅動程式初始化期間 #define POOL_ZERO_DOWN_LEVEL_SUPPORT 並呼叫 ExInitializeDriverRuntime ,再呼叫集區配置函式。
本機定義的內嵌函式
PVOID
NTAPI
ExAllocatePoolZero (
_In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag
)
PVOID
NTAPI
ExAllocatePoolQuotaZero (
_In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag
)
PVOID
NTAPI
ExAllocatePoolPriorityZero (
_In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag,
_In_ EX_POOL_PRIORITY Priority
)
如需這些程式代碼包裝函式的實作程序代碼,請參閱最新的 wdm.h 標頭。 例如,這是 ExAllocatePoolPriorityZero 的實作,其中顯示 RtlZeroMemory 的使用方式。
{
PVOID Allocation;
Allocation = ExAllocatePoolWithTagPriority((POOL_TYPE) (PoolType | POOL_ZERO_ALLOCATION),
NumberOfBytes,
Tag,
Priority);
#if defined(POOL_ZERO_DOWN_LEVEL_SUPPORT)
if ((!ExPoolZeroingNativelySupported) && (Allocation != NULL)) {
RtlZeroMemory(Allocation, NumberOfBytes);
}
#endif
return Allocation;
}
將舊 API 對應至新的 API
舊版 API | 新增 API |
---|---|
ExAllocatePool | ExAllocatePoolZero |
ExAllocatePoolWithTag | ExAllocatePoolZero |
ExAllocatePoolWithQuota | ExAllocatePoolQuotaZero |
ExAllocatePoolWithQuotaTag | ExAllocatePoolQuotaZero |
ExAllocatePoolWithTagPriority | ExAllocatePoolPriorityZero |
範例
// Old code
PVOID Allocation = ExAllocatePoolWithTag(PagedPool, 100, 'abcd');
// New code
// Before headers are pulled in (or compiler defined)
#define POOL_ZERO_DOWN_LEVEL_SUPPORT
// Once during driver initialization
// Argument can be any value
ExInitializeDriverRuntime(0);
// Replacement for each pool allocation
PVOID Allocation = ExAllocatePoolZero(PagedPool, 100, 'abcd');
其他詳細資料
您可以在 Microsoft GitHub CodeQL 存放庫中找到此查詢。 如需 Windows 驅動程式開發人員如何下載和執行 CodeQL 的詳細資訊,請參閱 CodeQL 和靜態工具標誌測試頁面。