VOID KmtSetIrql(IN KIRQL NewIrql);
BOOLEAN KmtAreInterruptsEnabled(VOID);
ULONG KmtGetPoolTag(PVOID Memory);
+USHORT KmtGetPoolType(PVOID Memory);
#elif defined KMT_USER_MODE
DWORD KmtRunKernelTest(IN PCSTR TestName);
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);
#elif defined KMT_USER_MODE
static PKMT_RESULTBUFFER KmtAllocateResultBuffer(SIZE_T ResultBufferSize)
#define NDEBUG
#include <debug.h>
+#define TAG_POOLTEST 'tstP'
+
+#define BASE_POOL_TYPE_MASK 1
+#define QUOTA_POOL_MASK 8
+
static
LONG
GetRefCount(
return Header->PointerCount;
}
-#define TAG_POOLTEST 'tstP'
-
static VOID PoolsTest(VOID)
{
PVOID Ptr;
PVOID Memory;
LONG InitialRefCount;
LONG RefCount;
+ USHORT PoolType;
NTSTATUS ExceptionStatus;
InitialRefCount = GetRefCount(Process);
StoredProcess = ((PVOID *)((ULONG_PTR)Memory + 2 * sizeof(LIST_ENTRY)))[-1];
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');
RefCount = GetRefCount(Process);
ok_eq_long(RefCount, InitialRefCount);