Megosztás:


WdkDeprecatedApi (Windows Driver CodeQL Query)

Áttekintés

A Windows 10 2004-es verziójának kiadásához a Microsoft új készlet nullázási API-kat vezetett be, amelyek alapértelmezés szerint nullára vannak állítva: ExAllocatePool2 és ExAllocatePool3.

A wdk-deprecated-apiCodeQL lekérdezés megkeresi az összes elavult API-példányt, amelyet az illesztőprogram nem hívhat meg. Az elavult API-k a következők:

ExAllocatePool

ExAllocatePoolWithTag

ExAllocatePoolWithQuota

ExAllocatePoolWithQuotaTag

ExAllocatePoolWithTagPriority

A Windows 10-nél későbbi, 2004-es verziójú Windows-verziók illesztőprogram-frissítései

Ha olyan illesztőprogramot készít, amely a Windows 10 2004-es és újabb verzióit célozza meg, használja helyette az ExAllocatePool2 és az ExAllocatePool3 helyettesítő API-kat.

Régi API Új API
ExAllocatePool ExAllocatePool2
ExAllocatePoolWithTag ExAllocatePool2
ExAllocatePoolWithQuota ExAllocatePool2
ExAllocatePoolWithQuotaTag ExAllocatePool2
ExAllocatePoolWithTagPriority ExAllocatePool3

Az új API-k alapértelmezés szerint nullára állítják a memóriakészletek foglalását, hogy elkerüljék a memória feltárásának esetleges hibáit.

ExAllocatePoolWithTag

// Old code
PVOID Allocation = ExAllocatePoolWithTag(PagedPool, 100, 'abcd');
RtlZeroMemory(Allocation, 100);

// New code
PVOID Allocation = ExAllocatePool2(POOL_FLAG_PAGED, 100, 'abcd');

A régi készletfoglalási API-k elfogadnak egy POOL_TYPE argumentumot, de az új foglalási API-k elfogadnak egy POOL_FLAGS argumentumot. Frissítse a társított kódot az új POOL_FLAGS argumentum használatára.

ExAllocatePoolWithQuota/ExAllocatePoolWithQuotaTag

Az új függvény alapértelmezés szerint NULL értéket ad vissza a foglalási hiba esetén. Ahhoz, hogy a kiosztó hiba esetén kivételt dobhasson, az ExAllocatePool2-ben ismertetett módon a POOL_FLAG_RAISE_ON_FAILURE jelzőt át kell adni.

// 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', &params, 1);

A Windows 10-nél korábbi, 2004-es verziójú Windows-verziók illesztőprogram-frissítései

Ha olyan illesztőprogramot hoz létre, amely a Windows 10 2004-es verziója előtti Windows-verziót célozza meg, az alábbi kényszerítő beágyazott burkolófüggvényeket kell használnia.

A driver inicializálása során, a készlet foglalási függvények meghívása előtt, meg kell határoznia a #define POOL_ZERO_DOWN_LEVEL_SUPPORT és meg kell hívnia az ExInitializeDriverRuntime-t.

Helyileg definiált beágyazott függvények

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
    )

Tekintse meg a legújabb wdm.h fejlécet a kódburkolók implementációs kódjának megtekintéséhez. Ez például az ExAllocatePoolPriorityZero implementációja, amely az RtlZeroMemory használatát mutatja.

{
    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;
}

Régi API-k leképezése új API-khoz

Régi API Új API
ExAllocatePool ExAllocatePoolZero
ExAllocatePoolWithTag ExAllocatePoolZero
ExAllocatePoolWithQuota ExAllocatePoolQuotaZero
ExAllocatePoolWithQuotaTag ExAllocatePoolQuotaZero
ExAllocatePoolWithTagPriority ExAllocatePoolPriorityZero

példa

// 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');

További részletek

Ez a lekérdezés a Microsoft GitHub CodeQL-adattárban található. A CodeQL és a Static Tools emblématesztelési oldalán részletesen tájékozódhat arról, hogy a Windows-illesztőprogram-fejlesztők hogyan tölthetik le és futtathatják a CodeQL-t.