15 #define MODULE_INVOLVED_IN_ARM3 18 #undef ExAllocatePoolWithQuota 19 #undef ExAllocatePoolWithQuotaTag 23 #define POOL_BIG_TABLE_ENTRY_FREE 0x1 31 #define POOL_BIG_TABLE_USE_RATE 4 61 #define POOL_ENTRY(x) (PPOOL_HEADER)((ULONG_PTR)(x) - sizeof(POOL_HEADER)) 62 #define POOL_FREE_BLOCK(x) (PLIST_ENTRY)((ULONG_PTR)(x) + sizeof(POOL_HEADER)) 63 #define POOL_BLOCK(x, i) (PPOOL_HEADER)((ULONG_PTR)(x) + ((i) * POOL_BLOCK_SIZE)) 64 #define POOL_NEXT_BLOCK(x) POOL_BLOCK((x), (x)->BlockSize) 65 #define POOL_PREV_BLOCK(x) POOL_BLOCK((x), -((x)->PreviousSize)) 198 if (
Entry->PreviousSize)
218 DPRINT1(
"PreviousEntry BlockSize %lu, tag %.4s. Entry PreviousSize %lu, tag %.4s\n",
220 Entry->PreviousSize, (
char *)&
Entry->PoolTag);
239 if (!
Entry->BlockSize)
242 if (
Entry->PreviousSize)
245 DPRINT1(
"PreviousEntry tag %.4s. Entry tag %.4s\n",
246 (
char *)&PreviousEntry->
PoolTag,
247 (
char *)&
Entry->PoolTag);
252 (
char *)&
Entry->PoolTag);
282 DPRINT1(
"Entry BlockSize %lu, tag %.4s. NextEntry PreviousSize %lu, tag %.4s\n",
348 DPRINT1(
"Allocation has wrong pool tag! Expected '%.4s', got '%.4s' (0x%08lx)\n",
357 RealPoolType = (
Entry->PoolType - 1);
366 DPRINT1(
"Wrong pool type! Expected %s, got %s\n",
479 #define ExpTagAllowPrint(Tag) \ 480 ((Tag) >= 0x20 && (Tag) <= 0x7E ) 483 #define MiDumperPrint(dbg, fmt, ...) \ 484 if (dbg) KdbpPrint(fmt, ##__VA_ARGS__); \ 485 else DPRINT1(fmt, ##__VA_ARGS__) 487 #define MiDumperPrint(dbg, fmt, ...) \ 488 DPRINT1(fmt, ##__VA_ARGS__) 502 DPRINT1(
"---------------------\n");
503 DPRINT1(
"Out of memory dumper!\n");
523 MiDumperPrint(CalledFromDbg,
"\t\t\t\tNonPaged\t\t\t\t\t\t\tPaged\n");
524 MiDumperPrint(CalledFromDbg,
"Tag\t\tAllocs\t\tFrees\t\tDiff\t\tUsed\t\tAllocs\t\tFrees\t\tDiff\t\tUsed\n");
528 MiDumperPrint(CalledFromDbg,
"\t\tNonPaged\t\t\tPaged\n");
529 MiDumperPrint(CalledFromDbg,
"Tag\t\tAllocs\t\tUsed\t\tAllocs\t\tUsed\n");
566 if (ExpTagAllowPrint(
Tag[0]) && ExpTagAllowPrint(
Tag[1]) && ExpTagAllowPrint(
Tag[2]) && ExpTagAllowPrint(
Tag[3]))
573 MiDumperPrint(CalledFromDbg,
"'%c%c%c%c'\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\n",
Tag[0],
Tag[1],
Tag[2],
Tag[3],
581 MiDumperPrint(CalledFromDbg,
"'%c%c%c%c'\t\t%ld\t\t%ld\t\t%ld\t\t%ld\n",
Tag[0],
Tag[1],
Tag[2],
Tag[3],
590 MiDumperPrint(CalledFromDbg,
"0x%08x\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\n",
TableEntry->Key,
598 MiDumperPrint(CalledFromDbg,
"0x%08x\t%ld\t\t%ld\t\t%ld\t\t%ld\n",
TableEntry->Key,
608 MiDumperPrint(CalledFromDbg,
"Anon\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\t\t%ld\n",
616 MiDumperPrint(CalledFromDbg,
"Anon\t\t%ld\t\t%ld\t\t%ld\t\t%ld\n",
626 DPRINT1(
"---------------------\n");
712 for (
i = 0;
i <
sizeof(TagList) /
sizeof(
ULONG);
i++)
824 DPRINT1(
"Empty item reached in tracker table. Hash=0x%lx, TableMask=0x%lx, Tag=0x%08lx, NumberOfBytes=%lu, PoolType=%d\n",
842 DPRINT1(
"Out of pool tag space, ignoring...\n");
960 DPRINT1(
"Out of pool tag space, ignoring...\n");
977 PoolDescriptor->PoolType =
PoolType;
978 PoolDescriptor->PoolIndex = PoolIndex;
979 PoolDescriptor->Threshold = Threshold;
980 PoolDescriptor->LockAddress = PoolLock;
985 PoolDescriptor->RunningAllocs = 0;
986 PoolDescriptor->RunningDeAllocs = 0;
987 PoolDescriptor->TotalPages = 0;
988 PoolDescriptor->TotalBytes = 0;
989 PoolDescriptor->TotalBigPages = 0;
994 PoolDescriptor->PendingFrees =
NULL;
995 PoolDescriptor->PendingFreeDepth = 0;
1000 NextEntry = PoolDescriptor->ListHeads;
1002 while (NextEntry < LastEntry)
1038 for (
i = 0;
i < 32;
i++)
1120 for (
i = 0;
i < 32;
i++)
1187 DPRINT(
"EXPOOL: Pool Tracker Table at: 0x%p with 0x%lx bytes\n",
1189 DPRINT(
"EXPOOL: Big Pool Tracker Table at: 0x%p with 0x%lx bytes\n",
1354 IN ULONG SystemInformationLength,
1373 TagEntry = &SystemInformation->TagInfo[0];
1374 SystemInformation->Count = 0;
1395 Context.PoolTrackTableSizeExpansion = 0;
1401 for (TrackerEntry =
Buffer; TrackerEntry < (
Buffer + EntryCount); TrackerEntry++)
1406 if (!TrackerEntry->
Key)
continue;
1412 SystemInformation->Count++;
1413 CurrentLength +=
sizeof(*TagEntry);
1414 if (SystemInformationLength < CurrentLength)
1459 ExpReallocateBigPageTable(
1498 DPRINT1(
"Overflow expanding big page table. Size=%lu\n", OldSize);
1510 DPRINT1(
"Overflow while calculating big page table size. Size=%lu\n", OldSize);
1516 if (NewTable ==
NULL)
1518 DPRINT(
"Could not allocate %lu bytes for new big page table\n", NewSizeInBytes);
1523 DPRINT(
"%s big pool tracker table to %lu entries\n", Shrink ?
"Shrinking" :
"Expanding",
NewSize);
1535 for (
i = 0;
i < OldSize;
i++)
1557 NewTable[
Hash] = OldTable[
i];
1625 Entry->NumberOfPages = NumberOfPages;
1639 DPRINT(
"Attempting expansion since we now have %lu entries\n",
1661 }
while (
Entry != EntryStart);
1673 DPRINT1(
"Big pool table expansion failed\n");
1738 *BigPages =
Entry->NumberOfPages;
1780 *PagedPoolPages = 0;
1781 *PagedPoolAllocs = 0;
1782 *PagedPoolFrees = 0;
1808 if (ExpNumberOfNonPagedPools > 1)
1810 for (
i = 0;
i < ExpNumberOfNonPagedPools;
i++)
1812 PoolDesc = ExpNonPagedPoolDescriptor[
i];
1829 ListEntry = ListEntry->
Flink)
1837 *NonPagedPoolLookasideHits +=
Lookaside->AllocateHits;
1841 *PagedPoolLookasideHits +=
Lookaside->AllocateHits;
1867 BlockSize =
Entry->BlockSize;
1877 DPRINT1(
"Object %p is not a process. Type %u, pool type 0x%x, block size %u\n",
1937 DPRINT1(
"Driver Verifier is not yet supported\n");
2019 DPRINT1(
"EX: ExAllocatePool (%lu, 0x%x) returning NULL\n",
2116 Entry->PoolType = OriginalType + 1;
2181 if (
Entry->BlockSize !=
i)
2186 if (
Entry->PreviousSize == 0)
2221 FragmentEntry =
Entry;
2288 Entry->PoolType = OriginalType + 1;
2361 DPRINT1(
"EX: ExAllocatePool (%lu, 0x%x) returning NULL\n",
2387 Entry->PoolType = OriginalType + 1;
2397 FragmentEntry->
Ulong1 = 0;
2480 Tag =
Tag >> 8 |
' ' << 24;
2532 DPRINT1(
"Verifier not yet supported\n");
2589 DPRINT1(
"We do not know the size of this allocation. This is not yet supported\n");
2601 if (TagToFree && TagToFree !=
Tag)
2603 DPRINT1(
"Freeing pool - invalid tag specified: %.4s != %.4s\n", (
char*)&TagToFree, (
char*)&
Tag);
2631 DPRINT1(
"Verifier not yet supported\n");
2651 ASSERT(RealPageCount == PageCount);
2653 -(
LONG)RealPageCount);
2669 BlockSize =
Entry->BlockSize;
2687 if (TagToFree && TagToFree !=
Tag)
2689 DPRINT1(
"Freeing pool - invalid tag specified: %.4s != %.4s\n", (
char*)&TagToFree, (
char*)&
Tag);
2700 Entry->PoolType - 1);
2712 DPRINT1(
"Object %p is not a process. Type %u, pool type 0x%x, block size %u\n",
2818 if (
Entry->PreviousSize)
2882 Entry->PoolType = 0;
2883 BlockSize =
Entry->BlockSize;
3084 else if (!(
Buffer) && (Raise))
_IRQL_requires_(DISPATCH_LEVEL)
#define KeGetCurrentIrql()
PVOID NTAPI ExAllocatePoolWithTag(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
static int Hash(const char *)
VOID NTAPI ExpSeedHotTags(VOID)
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
DECLSPEC_NORETURN NTSYSAPI VOID NTAPI RtlRaiseStatus(_In_ NTSTATUS Status)
GENERAL_LOOKASIDE_POOL PPNPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS]
VOID NTAPI ExpCheckPoolLinks(IN PLIST_ENTRY ListHead)
PLIST_ENTRY NTAPI ExpRemovePoolHeadList(IN PLIST_ENTRY ListHead)
BOOLEAN NTAPI ExpIsPoolListEmpty(IN PLIST_ENTRY ListHead)
#define STATUS_INSUFFICIENT_RESOURCES
SIZE_T PoolTrackTableMask
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
VOID NTAPI InitializePool(IN POOL_TYPE PoolType, IN ULONG Threshold)
#define SESSION_POOL_MASK
VOID MiDumpPoolConsumers(BOOLEAN CalledFromDbg, ULONG Tag, ULONG Mask, ULONG Flags)
PVOID NTAPI ExAllocatePoolWithQuotaTag(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
#define STATUS_INFO_LENGTH_MISMATCH
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _In_ _Strict_type_match_ POOL_TYPE _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_opt_ ULONG _Out_ WDFLOOKASIDE * Lookaside
LIST_ENTRY ExPoolLookasideListHead
#define POOL_FLAG_VERIFIER
SIZE_T PoolTrackTableSize
struct _KGUARDED_MUTEX * PKGUARDED_MUTEX
VOID NTAPI ExpCheckPoolAllocation(PVOID P, POOL_TYPE PoolType, ULONG Tag)
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
IN BOOLEAN OUT PSTR Buffer
#define UNREFERENCED_PARAMETER(P)
#define BooleanFlagOn(F, SF)
#define POOL_FLAG_SPECIAL_POOL
struct _LIST_ENTRY * Blink
#define ExReleaseSpinLock(Lock, OldIrql)
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
struct _EPROCESS * PEPROCESS
PLIST_ENTRY NTAPI ExpEncodePoolLink(IN PLIST_ENTRY Link)
SIZE_T PoolTrackTableSize
PLDR_DATA_TABLE_ENTRY NTAPI MiLookupDataTableEntry(IN PVOID Address)
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
#define POOL_FLAG_CRASH_ON_FAILURE
#define POOL_PREV_BLOCK(x)
IN PVOID IN PVOID IN USHORT IN USHORT Size
VOID NTAPI ExpRemovePoolEntryList(IN PLIST_ENTRY Entry)
VOID NTAPI ExReturnPoolQuota(IN PVOID P)
VOID NTAPI ExpInsertPoolHeadList(IN PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry)
#define POOL_FREE_IRQL_INVALID
VOID NTAPI PsReturnPoolQuota(_In_ PEPROCESS Process, _In_ POOL_TYPE PoolType, _In_ SIZE_T Amount)
Returns the pool quota that the process was taking up.
PKGUARDED_MUTEX ExpPagedPoolMutex
VOID NTAPI ExpInitializePoolListHead(IN PLIST_ENTRY ListHead)
LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE]
PVOID NTAPI MmAllocateSpecialPool(IN SIZE_T NumberOfBytes, IN ULONG Tag, IN POOL_TYPE PoolType, IN ULONG SpecialType)
#define ExAcquireSpinLock(Lock, OldIrql)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
static int Link(const char **args)
BOOLEAN NTAPI ExpAddTagForBigPages(IN PVOID Va, IN ULONG Key, IN ULONG NumberOfPages, IN POOL_TYPE PoolType)
NTSTATUS NTAPI ExGetPoolTagInfo(IN PSYSTEM_POOLTAG_INFORMATION SystemInformation, IN ULONG SystemInformationLength, IN OUT PULONG ReturnLength OPTIONAL)
struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE GENERAL_LOOKASIDE
KSPIN_LOCK ExpLargePoolTableLock
FORCEINLINE ULONG KeGetCurrentProcessorNumber(VOID)
#define POOL_FLAG_CHECK_TIMERS
#define POOL_FREE_BLOCK(x)
struct _POOL_DPC_CONTEXT POOL_DPC_CONTEXT
SIZE_T PoolTrackTableSizeExpansion
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
PEPROCESS PsInitialSystemProcess
PPOOL_DESCRIPTOR PoolVector[2]
VOID NTAPI DbgBreakPoint(VOID)
#define POOL_NEXT_BLOCK(x)
struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE * PGENERAL_LOOKASIDE
enum _EX_POOL_PRIORITY EX_POOL_PRIORITY
VOID NTAPI ExInitializePoolDescriptor(IN PPOOL_DESCRIPTOR PoolDescriptor, IN POOL_TYPE PoolType, IN ULONG PoolIndex, IN ULONG Threshold, IN PVOID PoolLock)
SIZE_T PoolBigPageTableSize
#define InterlockedCompareExchangePointer
#define PsGetCurrentProcess
PPOOL_TRACKER_TABLE PoolTrackTableExpansion
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
struct _POOL_DPC_CONTEXT * PPOOL_DPC_CONTEXT
VOID NTAPI ExpCheckPoolHeader(IN PPOOL_HEADER Entry)
ULONG ExpNumberOfPagedPools
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFKEY * Key
ULONG ExpPoolBigEntriesInUse
ULONG NTAPI ExpFindAndRemoveTagBigPages(IN PVOID Va, OUT PULONG_PTR BigPages, IN POOL_TYPE PoolType)
#define BASE_POOL_TYPE_MASK
struct _POOL_TRACKER_TABLE POOL_TRACKER_TABLE
struct _POOL_HEADER * PPOOL_HEADER
#define InterlockedExchangeAdd
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define POOL_ALLOC_IRQL_INVALID
PVOID NTAPI ExAllocatePool(POOL_TYPE PoolType, SIZE_T NumberOfBytes)
VOID NTAPI ExpCheckPoolBlocks(IN PVOID Block)
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
PLIST_ENTRY NTAPI ExpDecodePoolLink(IN PLIST_ENTRY Link)
struct _LIST_ENTRY * Flink
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
POOL_TYPE NTAPI MmDeterminePoolType(IN PVOID VirtualAddress)
_Must_inspect_result_ _In_ ULONG Flags
VOID NTAPI ExpRemovePoolTracker(IN ULONG Key, IN SIZE_T NumberOfBytes, IN POOL_TYPE PoolType)
_Out_ PBOOLEAN QuotaCharged
PPOOL_TRACKER_TABLE PoolTrackTable
#define NT_SUCCESS(StatCode)
PPOOL_DESCRIPTOR ExpPagedPoolDescriptor[16+1]
_In_ WDFCOLLECTION _In_ ULONG Index
VOID NTAPI ExpGetPoolTagInfoTarget(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
#define ObDereferenceObject
POOL_DESCRIPTOR NonPagedPoolDescriptor
VOID KdbpPrint(IN PCHAR Format, IN ... OPTIONAL)
Prints the given string with printf-like formatting.
ULONG ExpBigTableExpansionFailed
VOID FASTCALL KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, IN KIRQL OldIrql)
FORCEINLINE USHORT ExQueryDepthSList(_In_ PSLIST_HEADER SListHead)
PPOOL_TRACKER_TABLE PoolTrackTable
#define MUST_SUCCEED_POOL_MASK
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG PoolTag
PVOID NTAPI MiAllocatePoolPages(IN POOL_TYPE PoolType, IN SIZE_T SizeInBytes)
#define BYTES_TO_PAGES(Size)
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
ULONG NTAPI MiFreePoolPages(IN PVOID StartingAddress)
VOID NTAPI ExpInsertPoolTailList(IN PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry)
#define InterlockedExchangeAddSizeT(a, b)
FORCEINLINE KIRQL ExLockPool(IN PPOOL_DESCRIPTOR Descriptor)
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
FORCEINLINE VOID ExpCheckPoolIrqlLevel(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN PVOID Entry)
#define InterlockedPushEntrySList(SListHead, SListEntry)
_Must_inspect_result_ _In_ USHORT NewSize
KIRQL FASTCALL KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
PVOID NTAPI ExAllocatePoolWithQuota(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes)
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
#define POOL_BIG_TABLE_USE_RATE
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
#define ALIGN_DOWN_BY(size, align)
#define POOL_FLAG_CHECK_DEADLOCK
VOID FASTCALL KeInitializeGuardedMutex(OUT PKGUARDED_MUTEX GuardedMutex)
#define InterlockedIncrement
VOID NTAPI KeSignalCallDpcDone(IN PVOID SystemArgument1)
#define NUMBER_POOL_LOOKASIDE_LISTS
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define ROUND_TO_PAGES(Size)
VOID NTAPI KeGenericCallDpc(IN PKDEFERRED_ROUTINE Routine, IN PVOID Context)
SIZE_T NTAPI ExQueryPoolBlockSize(IN PVOID PoolBlock, OUT PBOOLEAN QuotaCharged)
#define POOL_FLAG_CHECK_WORKERS
UNICODE_STRING BaseDllName
#define FIELD_OFFSET(t, f)
PVOID NTAPI ExAllocatePoolWithTagPriority(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag, IN EX_POOL_PRIORITY Priority)
VOID NTAPI ExpInsertPoolTracker(IN ULONG Key, IN SIZE_T NumberOfBytes, IN POOL_TYPE PoolType)
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
#define KeReleaseSpinLock(sl, irql)
FORCEINLINE ULONG ExpComputeHashForTag(IN ULONG Tag, IN SIZE_T BucketMask)
#define POOL_FLAG_DBGPRINT_ON_FAILURE
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
FORCEINLINE ULONG ExpComputePartialHashForAddress(IN PVOID BaseAddress)
_Must_inspect_result_ typedef _In_ ULONG TableEntry
#define POOL_LISTS_PER_PAGE
PPOOL_TRACKER_BIG_PAGES PoolBigPageTable
SIZE_T PoolBigPageTableHash
#define POOL_BIG_TABLE_ENTRY_FREE
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
void * _ReturnAddress(void)
struct tagContext Context
#define ObReferenceObject
_Must_inspect_result_ typedef _Out_ PULONG TableSize
FORCEINLINE VOID ExUnlockPool(IN PPOOL_DESCRIPTOR Descriptor, IN KIRQL OldIrql)
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
VOID NTAPI ExFreePool(PVOID P)
#define RtlZeroMemory(Destination, Length)
VOID NTAPI MmFreeSpecialPool(IN PVOID P)
#define ALIGN_UP_BY(size, align)
#define RtlCopyMemory(Destination, Source, Length)
BOOLEAN NTAPI MmUseSpecialPool(IN SIZE_T NumberOfBytes, IN ULONG Tag)
#define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
NTSTATUS NTAPI PsChargeProcessPoolQuota(_In_ PEPROCESS Process, _In_ POOL_TYPE PoolType, _In_ SIZE_T Amount)
Charges the process' quota pool. The type of quota to be charged depends upon the PoolType parameter.
#define POOL_RAISE_IF_ALLOCATION_FAILURE
ULONG MmSizeOfNonPagedPoolInBytes
PLIST_ENTRY NTAPI ExpRemovePoolTailList(IN PLIST_ENTRY ListHead)
#define InterlockedPopEntrySList(SListHead)
VOID NTAPI ExFreePoolWithTag(IN PVOID P, IN ULONG TagToFree)
BOOLEAN NTAPI MmIsSpecialPoolAddress(IN PVOID P)
ULONGLONG NTAPI KeQueryInterruptTime(VOID)
base of all file and directory entries
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
ULONGLONG MiLastPoolDumpTime
VOID NTAPI ExQueryPoolUsage(OUT PULONG PagedPoolPages, OUT PULONG NonPagedPoolPages, OUT PULONG PagedPoolAllocs, OUT PULONG PagedPoolFrees, OUT PULONG PagedPoolLookasideHits, OUT PULONG NonPagedPoolAllocs, OUT PULONG NonPagedPoolFrees, OUT PULONG NonPagedPoolLookasideHits)
#define POOL_BILLED_PROCESS_INVALID
_Must_inspect_result_ _In_ LPCGUID _In_ ULONG _In_ FSRTL_ALLOCATE_ECP_FLAGS _In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK _Inout_ PVOID LookasideList
BOOLEAN NTAPI KeSignalCallDpcSynchronize(IN PVOID SystemArgument2)
#define POOL_FLAG_CHECK_RESOURCES
GENERAL_LOOKASIDE_POOL PPPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS]
KSPIN_LOCK ExpTaggedPoolLock
PULONG MinorVersion OPTIONAL
_In_opt_ PVOID DeferredContext