Обновление устаревших вызовов ExAllocatePool для ExAllocatePool2 и ExAllocatePool3

Следующие DIS являются устаревшими начиная с Windows 10 версии 2004 и должны быть заменены, как описано в этом разделе.

ExAllocatePool

ExAllocatePoolWithTag

ExAllocatePoolWithQuota

ExAllocatePoolWithQuotaTag

ExAllocatePoolWithTagPriority

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

Если вы создаете драйвер, предназначенный для Windows 10 версии 2004 и более поздних версий, используйте вместо них API ExAllocatePool2 и ExAllocatePool3.

Старый API Новый API
ExAllocatePool ExAllocatePool2
ExAllocatePoolWithTag ExAllocatePool2
ExAllocatePoolWithQuota ExAllocatePool2
ExAllocatePoolWithQuotaTag ExAllocatePool2
ExAllocatePoolWithTagPriority ExAllocatePool3

Новые API не будут выделять пулы по умолчанию, чтобы избежать возможных ошибок раскрытия памяти.

ExAllocatePool/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');
RtlZeroMemory(Allocation, 100);

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

Правила проверки драйверов UnSafeAllocatePool

Правило проверки драйверов UnSafeAllocatePool — это важное правило безопасности, которое проверяет, не использует ли драйвер устаревшие DDIs для выделения памяти. Это правило доступно в предварительных сборках WDK 20236 и более поздних версий.

См. также:

ExAllocatePool2

ExAllocatePool3

ExAllocatePool

ExAllocatePoolWithTag

ExAllocatePoolWithQuota

ExAllocatePoolWithQuotaTag

ExAllocatePoolWithTagPriority