Sdílet prostřednictvím


WdkDeprecatedApi (dotaz CodeQL ovladače Systému Windows)

Přehled

Pro verzi Windows 10 verze 2004 společnost Microsoft zavedla nová rozhraní API pro nulování fondu, která ve výchozím nastavení nulují: ExAllocatePool2 a ExAllocatePool3.

Dotaz CodeQLwdk-deprecated-api vyhledá všechny instance zastaralých rozhraní API, která by ovladač neměl volat. Zastaralá rozhraní API jsou:

exAllocatePool

ExAllocatePoolWithTag

ExAllocatePoolWithQuota

ExAllocatePoolWithQuotaTag

ExAllocatePoolWithTagPriority

Aktualizace ovladačů pro verze Windows novější než Windows 10 verze 2004

Pokud vytváříte ovladač, který cílí na Windows 10 verze 2004 a novější verze, použijte místo toho náhradní rozhraní API ExAllocatePool2 a ExAllocatePool3 .

Staré rozhraní API Nové rozhraní API
ExAllocatePool ExAllocatePool2
ExAllocatePoolWithTag ExAllocatePool2
ExAllocatePoolWithQuota ExAllocatePool2
ExAllocatePoolWithQuotaTag ExAllocatePool2
ExAllocatePoolWithTagPriority ExAllocatePool3

Nová rozhraní API ve výchozím nastavení nebudou mít žádné přidělení fondu, aby se zabránilo možným chybám ve zpřístupnění paměti.

ExAllocatePoolWithTag

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

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

Stará rozhraní API pro přidělování fondů přijímají argument POOL_TYPE, ale nová rozhraní API přidělení přijímají argument POOL_FLAGS. Aktualizujte veškerý přidružený kód tak, aby používal nový argument POOL_FLAGS.

ExAllocatePoolWithQuota/ExAllocatePoolWithQuotaTag

Nová funkce teď ve výchozím nastavení vrátí hodnotu NULL při selhání přidělení. Aby místo toho alokátor vyvolal výjimku při selhání, musí být příznak POOL_FLAG_RAISE_ON_FAILURE předán, jak je popsáno v 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', &params, 1);

Aktualizace ovladačů pro verze Windows starší než Windows 10 verze 2004

Pokud vytváříte ovladač, který cílí na verze Windows před Windows 10 verze 2004, musíte použít následující vynucené vložené funkce obálky.

Před voláním funkcí přidělování fondu musíte také během inicializace ovladače #define POOL_ZERO_DOWN_LEVEL_SUPPORT a zavolat ExInitializeDriverRuntime.

Místně definované vložené funkce

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
    )

Projděte si nejnovější hlavičkový soubor wdm.h pro implementační kód těchto obálek kódu. Jedná se například o implementaci ExAllocatePoolPriorityZero, která ukazuje použití 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;
}

Mapování starých rozhraní API na nová rozhraní API

Staré rozhraní API Nové rozhraní API
ExAllocatePool ExAllocatePoolZero
ExAllocatePoolWithTag ExAllocatePoolZero
ExAllocatePoolWithQuota ExAllocatePoolQuotaZero
ExAllocatePoolWithQuotaTag ExAllocatePoolQuotaZero
ExAllocatePoolWithTagPriority ExAllocatePoolPriorityZero

Příklad

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

Další podrobnosti

Tento dotaz najdete v úložišti Microsoft GitHub CodeQL. Podrobnosti o tom, jak mohou vývojáři ovladačů systému Windows stáhnout a spustit CodeQL, najdete na stránce CodeQL and the Static Tools Logo Test.