Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Następujące identyfikatory DDI są przestarzałe począwszy od systemu Windows 10 w wersji 2004 i powinny zostać zastąpione zgodnie z opisem w tym artykule.
Aktualizacje sterowników dla wersji systemu Windows 10 w wersji 2004 lub nowszej
Jeśli tworzysz sterownik przeznaczony dla systemu Windows 10 w wersji 2004 lub nowszej, użyj zastępczych interfejsów API ExAllocatePool2 i ExAllocatePool3 .
| Stary interfejs API | Nowy interfejs API |
|---|---|
| ExAllocatePool | ExAllocatePool2 |
| ExAllocatePoolWithTag | ExAllocatePool2 |
| ExAllocatePoolWithQuota | ExAllocatePool2 |
| ExAllocatePoolWithQuotaTag | ExAllocatePool2 |
| ExAllocatePoolWithTagPriority | ExAllocatePool3 |
Nowe interfejsy API domyślnie nie będą przydzielać puli, aby uniknąć możliwych błędów ujawniania pamięci.
ExAllocatePool/ExAllocatePoolWithTag
// Old code
PVOID Allocation = ExAllocatePoolWithTag(PagedPool, 100, 'abcd');
RtlZeroMemory(Allocation, 100);
// New code
PVOID Allocation = ExAllocatePool2(POOL_FLAG_PAGED, 100, 'abcd');
Stare interfejsy API alokacji puli akceptują argument POOL_TYPE, ale nowe interfejsy API alokacji akceptują argument POOL_FLAGS. Zaktualizuj dowolny skojarzony kod, aby użyć nowego argumentu POOL_FLAGS.
ExAllocatePoolWithQuota/ExAllocatePoolWithQuotaTag
Nowa funkcja będzie teraz domyślnie zwracać wartość NULL w przypadku niepowodzenia alokacji. Aby alokator zgłaszał wyjątek w razie niepowodzenia, należy przekazać flagę POOL_FLAG_RAISE_ON_FAILURE zgodnie z opisem w 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);
Aktualizacje sterowników dla wersji systemu Windows starszych niż Windows 10 w wersji 2004
Jeśli tworzysz sterownik przeznaczony dla wersji systemu Windows wcześniejszych niż Windows 10, wersja 2004, musisz użyć następujących funkcji opakowujących z wymuszonym inlinem.
Należy również użyć dyrektywy #define POOL_ZERO_DOWN_LEVEL_SUPPORT i wywołać ExInitializeDriverRuntime podczas inicjowania sterownika, zanim zostaną wywołane funkcje alokacji puli.
Funkcje wbudowane zdefiniowane lokalnie
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
)
Zapoznaj się z najnowszym nagłówkiem wdm.h dla kodu implementacji tych opakowań kodu. Na przykład jest to implementacja funkcji ExAllocatePoolPriorityZero, pokazująca użycie 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;
}
Mapowanie starych interfejsów API na nowe interfejsy API
| Stary interfejs API | Nowy interfejs API |
|---|---|
| ExAllocatePool | ExAllocatePoolZero |
| ExAllocatePoolWithTag | ExAllocatePoolZero |
| ExAllocatePoolWithQuota | ExAllocatePoolQuotaZero |
| ExAllocatePoolWithQuotaTag | ExAllocatePoolQuotaZero |
| ExAllocatePoolWithTagPriority | ExAllocatePoolPriorityZero |
Przykład
// 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');
Reguły weryfikatora sterowników UnSafeAllocatePool
Reguła UnSafeAllocatePool weryfikatora sterowników jest ważną regułą zabezpieczeń, która sprawdza, czy sterownik nie używa przestarzałych identyfikatorów DDI do przydzielania pamięci. Ta reguła jest dostępna w wersjach zapoznawczych kompilacji zestawu WDK 20236 i nowszych.