Поделиться через


WdkDeprecatedApi (запрос CodeQL драйвера Windows)

Обзор

В выпуске Windows 10 версии 2004 корпорация Майкрософт представила новые API-интерфейсы обнуления пула, которые по умолчанию равны нулю: ExAllocatePool2 и ExAllocatePool3.

Запрос CodeQL wdk-deprecated-api находит все экземпляры устаревших API, которые драйвер не должен вызывать. Устаревшие API:

ExAllocatePool

ExAllocatePoolWithTag

ExAllocatePoolWithQuota

ExAllocatePoolWithQuotaTag

ExAllocatePoolWithTagPriority

Обновления драйверов для версий Windows позже Windows 10 версии 2004

Если вы создаете драйвер, предназначенный для 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', &params, 1);

Обновления драйверов для версий Windows до Windows 10 версии 2004

Если вы создаете драйвер, предназначенный для версий Windows до Windows 10 версии 2004, необходимо использовать следующие функции встроенной оболочки.

Перед вызовом функций выделения пула необходимо также #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, см. на странице "КодQL" и "Статические средства"