[KMTESTS:EX]

- Test that quota allocations keep their QUOTA_POOL_MASK bit in POOL_HEADER

svn path=/trunk/; revision=60175
This commit is contained in:
Thomas Faber 2013-09-16 19:02:28 +00:00
parent 3aad455588
commit 4dcd167f3e
2 changed files with 28 additions and 2 deletions

View file

@ -131,6 +131,7 @@ extern PDRIVER_OBJECT KmtDriverObject;
VOID KmtSetIrql(IN KIRQL NewIrql); VOID KmtSetIrql(IN KIRQL NewIrql);
BOOLEAN KmtAreInterruptsEnabled(VOID); BOOLEAN KmtAreInterruptsEnabled(VOID);
ULONG KmtGetPoolTag(PVOID Memory); ULONG KmtGetPoolTag(PVOID Memory);
USHORT KmtGetPoolType(PVOID Memory);
#elif defined KMT_USER_MODE #elif defined KMT_USER_MODE
DWORD KmtRunKernelTest(IN PCSTR TestName); DWORD KmtRunKernelTest(IN PCSTR TestName);
@ -334,6 +335,20 @@ ULONG KmtGetPoolTag(PVOID Memory)
return Header->PoolTag; return Header->PoolTag;
} }
USHORT KmtGetPoolType(PVOID Memory)
{
PPOOL_HEADER Header;
/* it's not so easy for allocations of PAGE_SIZE */
if (((ULONG_PTR)Memory & (PAGE_SIZE - 1)) == 0)
return 0;
Header = Memory;
Header--;
return Header->PoolType;
}
INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0); INT __cdecl KmtVSNPrintF(PSTR Buffer, SIZE_T BufferMaxLength, PCSTR Format, va_list Arguments) KMT_FORMAT(ms_printf, 3, 0);
#elif defined KMT_USER_MODE #elif defined KMT_USER_MODE
static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T ResultBufferSize) static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T ResultBufferSize)

View file

@ -10,6 +10,11 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
#define TAG_POOLTEST 'tstP'
#define BASE_POOL_TYPE_MASK 1
#define QUOTA_POOL_MASK 8
static static
LONG LONG
GetRefCount( GetRefCount(
@ -19,8 +24,6 @@ GetRefCount(
return Header->PointerCount; return Header->PointerCount;
} }
#define TAG_POOLTEST 'tstP'
static VOID PoolsTest(VOID) static VOID PoolsTest(VOID)
{ {
PVOID Ptr; PVOID Ptr;
@ -190,6 +193,7 @@ TestPoolQuota(VOID)
PVOID Memory; PVOID Memory;
LONG InitialRefCount; LONG InitialRefCount;
LONG RefCount; LONG RefCount;
USHORT PoolType;
NTSTATUS ExceptionStatus; NTSTATUS ExceptionStatus;
InitialRefCount = GetRefCount(Process); InitialRefCount = GetRefCount(Process);
@ -212,6 +216,13 @@ TestPoolQuota(VOID)
StoredProcess = ((PVOID *)((ULONG_PTR)Memory + 2 * sizeof(LIST_ENTRY)))[-1]; StoredProcess = ((PVOID *)((ULONG_PTR)Memory + 2 * sizeof(LIST_ENTRY)))[-1];
ok_eq_pointer(StoredProcess, Process); ok_eq_pointer(StoredProcess, Process);
/* Pool type should have QUOTA_POOL_MASK set */
PoolType = KmtGetPoolType(Memory);
ok(PoolType != 0, "PoolType is 0\n");
PoolType--;
ok(PoolType & QUOTA_POOL_MASK, "PoolType = %x\n", PoolType);
ok((PoolType & BASE_POOL_TYPE_MASK) == PagedPool, "PoolType = %x\n", PoolType);
ExFreePoolWithTag(Memory, 'tQmK'); ExFreePoolWithTag(Memory, 'tQmK');
RefCount = GetRefCount(Process); RefCount = GetRefCount(Process);
ok_eq_long(RefCount, InitialRefCount); ok_eq_long(RefCount, InitialRefCount);