Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przegląd
W przypadku wydania systemu Windows 10 w wersji 2004 firma Microsoft wprowadziła nowe interfejsy API zerowania puli, które domyślnie zero: ExAllocatePool2 i ExAllocatePool3.
Zapytanie codeQLwdk-deprecated-api znajduje wszystkie wystąpienia przestarzałych interfejsów API, których sterownik nie powinien wywoływać. Przestarzałe interfejsy API to:
Aktualizacje sterowników dla wersji systemu Windows nowszych niż Windows 10 w wersji 2004
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.
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 w wersji 2004, musisz użyć następujących funkcji wymuszania inline.
Przed wywołaniem funkcji alokacji puli należy również zdefiniować POOL_ZERO_DOWN_LEVEL_SUPPORT i wywołać funkcję ExInitializeDriverRuntime podczas inicjowania sterownika.
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');
// 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');
Dodatkowe szczegóły
To zapytanie można znaleźć w repozytorium Microsoft GitHub CodeQL. Zobacz stronę CodeQL i Static Tools Logo Test, aby uzyskać szczegółowe informacje na temat pobierania i uruchamiania CodeQL przez programistów sterowników systemu Windows.