From e5fc2b4ce3962145feadce5a6f17fe454ff0f85e Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 30 Sep 2018 16:09:26 +0200 Subject: [PATCH] [KMTESTS:EX] Add a test that triggers big pool expansion. CORE-15051 --- modules/rostests/kmtests/ntos_ex/ExPools.c | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/modules/rostests/kmtests/ntos_ex/ExPools.c b/modules/rostests/kmtests/ntos_ex/ExPools.c index 9b67eeda82c..5ed7f4b09f1 100644 --- a/modules/rostests/kmtests/ntos_ex/ExPools.c +++ b/modules/rostests/kmtests/ntos_ex/ExPools.c @@ -264,10 +264,52 @@ TestPoolQuota(VOID) KmtEndSeh(STATUS_SUCCESS); } +static +VOID +TestBigPoolExpansion(VOID) +{ + POOL_TYPE PoolType; + PVOID *BigAllocations; + const ULONG MaxAllocations = 1024 * 128; + ULONG NumAllocations; + + for (PoolType = NonPagedPool; PoolType <= PagedPool; PoolType++) + { + BigAllocations = ExAllocatePoolWithTag(PoolType, + MaxAllocations * sizeof(*BigAllocations), + 'ABmK'); + + /* Allocate a lot of pages (== big pool allocations) */ + for (NumAllocations = 0; NumAllocations < MaxAllocations; NumAllocations++) + { + BigAllocations[NumAllocations] = ExAllocatePoolWithTag(PoolType, + PAGE_SIZE, + 'aPmK'); + if (BigAllocations[NumAllocations] == NULL) + { + NumAllocations--; + break; + } + } + + trace("Got %lu allocations for PoolType %d\n", NumAllocations, PoolType); + + /* Free them */ + for (; NumAllocations < MaxAllocations; NumAllocations--) + { + ASSERT(BigAllocations[NumAllocations] != NULL); + ExFreePoolWithTag(BigAllocations[NumAllocations], + 'aPmK'); + } + ExFreePoolWithTag(BigAllocations, 'ABmK'); + } +} + START_TEST(ExPools) { PoolsTest(); PoolsCorruption(); TestPoolTags(); TestPoolQuota(); + TestBigPoolExpansion(); }