Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Следующие DDIs устарели начиная с Windows 10 версии 2004 и должны быть заменены, как описано в этой статье.
Обновления драйверов для версий 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', ¶ms, 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 и выше.