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 )
487#define MiDumperPrint(dbg, fmt, ...) \
488 if (dbg) KdbpPrint(fmt, ##__VA_ARGS__); \
489 else DPRINT1(fmt, ##__VA_ARGS__)
491#define MiDumperPrint(dbg, fmt, ...) \
492 DPRINT1(fmt, ##__VA_ARGS__)
506 DPRINT1(
"---------------------\n");
507 DPRINT1(
"Out of memory dumper!\n");
527 MiDumperPrint(CalledFromDbg,
"\t\t\t\tNonPaged\t\t\t\t\t\t\tPaged\n");
528 MiDumperPrint(CalledFromDbg,
"Tag\t\tAllocs\t\tFrees\t\tDiff\t\tUsed\t\tAllocs\t\tFrees\t\tDiff\t\tUsed\n");
532 MiDumperPrint(CalledFromDbg,
"\t\tNonPaged\t\t\tPaged\n");
533 MiDumperPrint(CalledFromDbg,
"Tag\t\tAllocs\t\tUsed\t\tAllocs\t\tUsed\n");
570 if (ExpTagAllowPrint(
Tag[0]) && ExpTagAllowPrint(
Tag[1]) && ExpTagAllowPrint(
Tag[2]) && ExpTagAllowPrint(
Tag[3]))
577 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],
585 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],
594 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,
602 MiDumperPrint(CalledFromDbg,
"0x%08x\t%ld\t\t%ld\t\t%ld\t\t%ld\n",
TableEntry->Key,
612 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",
620 MiDumperPrint(CalledFromDbg,
"Anon\t\t%ld\t\t%ld\t\t%ld\t\t%ld\n",
630 DPRINT1(
"---------------------\n");
716 for (
i = 0;
i <
sizeof(TagList) /
sizeof(
ULONG);
i++)
771 Key &= ~PROTECTED_POOL;
828 DPRINT1(
"Empty item reached in tracker table. Hash=0x%lx, TableMask=0x%lx, Tag=0x%08lx, NumberOfBytes=%lu, PoolType=%d\n",
846 DPRINT1(
"Out of pool tag space, ignoring...\n");
863 Key &= ~PROTECTED_POOL;
963 DPRINT1(
"Out of pool tag space, ignoring...\n");
980 PoolDescriptor->PoolType =
PoolType;
981 PoolDescriptor->PoolIndex = PoolIndex;
982 PoolDescriptor->Threshold = Threshold;
983 PoolDescriptor->LockAddress = PoolLock;
988 PoolDescriptor->RunningAllocs = 0;
989 PoolDescriptor->RunningDeAllocs = 0;
990 PoolDescriptor->TotalPages = 0;
991 PoolDescriptor->TotalBytes = 0;
992 PoolDescriptor->TotalBigPages = 0;
997 PoolDescriptor->PendingFrees =
NULL;
998 PoolDescriptor->PendingFreeDepth = 0;
1003 NextEntry = PoolDescriptor->ListHeads;
1005 while (NextEntry < LastEntry)
1041 for (
i = 0;
i < 32;
i++)
1123 for (
i = 0;
i < 32;
i++)
1190 DPRINT(
"EXPOOL: Pool Tracker Table at: 0x%p with 0x%lx bytes\n",
1192 DPRINT(
"EXPOOL: Big Pool Tracker Table at: 0x%p with 0x%lx bytes\n",
1357 IN ULONG SystemInformationLength,
1376 TagEntry = &SystemInformation->TagInfo[0];
1377 SystemInformation->Count = 0;
1398 Context.PoolTrackTableSizeExpansion = 0;
1404 for (TrackerEntry =
Buffer; TrackerEntry < (
Buffer + EntryCount); TrackerEntry++)
1409 if (!TrackerEntry->
Key)
continue;
1415 SystemInformation->Count++;
1416 CurrentLength +=
sizeof(*TagEntry);
1417 if (SystemInformationLength < CurrentLength)
1462ExpReallocateBigPageTable(
1501 DPRINT1(
"Overflow expanding big page table. Size=%lu\n", OldSize);
1513 DPRINT1(
"Overflow while calculating big page table size. Size=%lu\n", OldSize);
1519 if (NewTable ==
NULL)
1521 DPRINT(
"Could not allocate %lu bytes for new big page table\n", NewSizeInBytes);
1526 DPRINT(
"%s big pool tracker table to %lu entries\n", Shrink ?
"Shrinking" :
"Expanding",
NewSize);
1538 for (
i = 0;
i < OldSize;
i++)
1560 NewTable[
Hash] = OldTable[
i];
1628 Entry->NumberOfPages = NumberOfPages;
1642 DPRINT(
"Attempting expansion since we now have %lu entries\n",
1664 }
while (
Entry != EntryStart);
1676 DPRINT1(
"Big pool table expansion failed\n");
1741 *BigPages =
Entry->NumberOfPages;
1783 *PagedPoolPages = 0;
1784 *PagedPoolAllocs = 0;
1785 *PagedPoolFrees = 0;
1811 if (ExpNumberOfNonPagedPools > 1)
1813 for (
i = 0;
i < ExpNumberOfNonPagedPools;
i++)
1815 PoolDesc = ExpNonPagedPoolDescriptor[
i];
1832 ListEntry = ListEntry->
Flink)
1840 *NonPagedPoolLookasideHits +=
Lookaside->AllocateHits;
1844 *PagedPoolLookasideHits +=
Lookaside->AllocateHits;
1870 BlockSize =
Entry->BlockSize;
1880 DPRINT1(
"Object %p is not a process. Type %u, pool type 0x%x, block size %u\n",
1940 DPRINT1(
"Driver Verifier is not yet supported\n");
2022 DPRINT1(
"EX: ExAllocatePool (%lu, 0x%x) returning NULL\n",
2119 Entry->PoolType = OriginalType + 1;
2184 if (
Entry->BlockSize !=
i)
2189 if (
Entry->PreviousSize == 0)
2224 FragmentEntry =
Entry;
2291 Entry->PoolType = OriginalType + 1;
2364 DPRINT1(
"EX: ExAllocatePool (%lu, 0x%x) returning NULL\n",
2390 Entry->PoolType = OriginalType + 1;
2400 FragmentEntry->
Ulong1 = 0;
2483 Tag =
Tag >> 8 |
' ' << 24;
2535 DPRINT1(
"Verifier not yet supported\n");
2592 DPRINT1(
"We do not know the size of this allocation. This is not yet supported\n");
2598 Tag &= ~PROTECTED_POOL;
2604 if (TagToFree && TagToFree !=
Tag)
2606 DPRINT1(
"Freeing pool - invalid tag specified: %.4s != %.4s\n", (
char*)&TagToFree, (
char*)&
Tag);
2634 DPRINT1(
"Verifier not yet supported\n");
2654 ASSERT(RealPageCount == PageCount);
2656 -(
LONG)RealPageCount);
2672 BlockSize =
Entry->BlockSize;
2690 if (TagToFree && TagToFree !=
Tag)
2692 DPRINT1(
"Freeing pool - invalid tag specified: %.4s != %.4s\n", (
char*)&TagToFree, (
char*)&
Tag);
2703 Entry->PoolType - 1);
2715 DPRINT1(
"Object %p is not a process. Type %u, pool type 0x%x, block size %u\n",
2821 if (
Entry->PreviousSize)
2885 Entry->PoolType = 0;
2886 BlockSize =
Entry->BlockSize;
3003 PoolType &= ~POOL_QUOTA_FAIL_INSTEAD_OF_RAISE;
3087 else if (!(
Buffer) && (Raise))
#define BASE_POOL_TYPE_MASK
#define ALIGN_DOWN_BY(size, align)
#define ALIGN_UP_BY(size, align)
#define InterlockedIncrement
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
#define NT_SUCCESS(StatCode)
static int Hash(const char *)
VOID NTAPI KeGenericCallDpc(IN PKDEFERRED_ROUTINE Routine, IN PVOID Context)
BOOLEAN NTAPI KeSignalCallDpcSynchronize(IN PVOID SystemArgument2)
VOID NTAPI KeSignalCallDpcDone(IN PVOID SystemArgument1)
#define _IRQL_requires_(irql)
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
#define KeGetCurrentIrql()
#define KeInitializeSpinLock(sl)
ULONG ExpPoolBigEntriesInUse
VOID NTAPI ExpInitializePoolListHead(IN PLIST_ENTRY ListHead)
VOID NTAPI ExpCheckPoolAllocation(PVOID P, POOL_TYPE PoolType, ULONG Tag)
ULONG ExpBigTableExpansionFailed
#define POOL_FREE_BLOCK(x)
VOID NTAPI ExpCheckPoolBlocks(IN PVOID Block)
FORCEINLINE ULONG ExpComputeHashForTag(IN ULONG Tag, IN SIZE_T BucketMask)
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_BIG_TABLE_USE_RATE
VOID NTAPI ExpRemovePoolTracker(IN ULONG Key, IN SIZE_T NumberOfBytes, IN POOL_TYPE PoolType)
VOID NTAPI ExReturnPoolQuota(IN PVOID P)
VOID NTAPI ExInitializePoolDescriptor(IN PPOOL_DESCRIPTOR PoolDescriptor, IN POOL_TYPE PoolType, IN ULONG PoolIndex, IN ULONG Threshold, IN PVOID PoolLock)
struct _POOL_DPC_CONTEXT POOL_DPC_CONTEXT
PPOOL_DESCRIPTOR PoolVector[2]
#define POOL_PREV_BLOCK(x)
NTSTATUS NTAPI ExGetPoolTagInfo(IN PSYSTEM_POOLTAG_INFORMATION SystemInformation, IN ULONG SystemInformationLength, IN OUT PULONG ReturnLength OPTIONAL)
SIZE_T PoolTrackTableMask
VOID NTAPI InitializePool(IN POOL_TYPE PoolType, IN ULONG Threshold)
VOID NTAPI ExpInsertPoolTailList(IN PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry)
VOID NTAPI ExpCheckPoolHeader(IN PPOOL_HEADER Entry)
SIZE_T PoolBigPageTableSize
struct _POOL_DPC_CONTEXT * PPOOL_DPC_CONTEXT
FORCEINLINE ULONG ExpComputePartialHashForAddress(IN PVOID BaseAddress)
VOID NTAPI ExpGetPoolTagInfoTarget(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
ULONG ExpNumberOfPagedPools
VOID NTAPI ExpCheckPoolLinks(IN PLIST_ENTRY ListHead)
SIZE_T NTAPI ExQueryPoolBlockSize(IN PVOID PoolBlock, OUT PBOOLEAN QuotaCharged)
PPOOL_TRACKER_BIG_PAGES PoolBigPageTable
PKGUARDED_MUTEX ExpPagedPoolMutex
FORCEINLINE VOID ExpCheckPoolIrqlLevel(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN PVOID Entry)
PLIST_ENTRY NTAPI ExpRemovePoolHeadList(IN PLIST_ENTRY ListHead)
PVOID NTAPI ExAllocatePoolWithTagPriority(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag, IN EX_POOL_PRIORITY Priority)
PLIST_ENTRY NTAPI ExpDecodePoolLink(IN PLIST_ENTRY Link)
KSPIN_LOCK ExpTaggedPoolLock
VOID NTAPI ExpRemovePoolEntryList(IN PLIST_ENTRY Entry)
VOID NTAPI ExpInsertPoolHeadList(IN PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry)
FORCEINLINE VOID ExUnlockPool(IN PPOOL_DESCRIPTOR Descriptor, IN KIRQL OldIrql)
#define POOL_NEXT_BLOCK(x)
POOL_DESCRIPTOR NonPagedPoolDescriptor
PPOOL_TRACKER_TABLE PoolTrackTable
PPOOL_DESCRIPTOR ExpPagedPoolDescriptor[16+1]
BOOLEAN NTAPI ExpAddTagForBigPages(IN PVOID Va, IN ULONG Key, IN ULONG NumberOfPages, IN POOL_TYPE PoolType)
#define POOL_BIG_TABLE_ENTRY_FREE
FORCEINLINE KIRQL ExLockPool(IN PPOOL_DESCRIPTOR Descriptor)
VOID NTAPI ExpSeedHotTags(VOID)
SIZE_T PoolTrackTableSize
KSPIN_LOCK ExpLargePoolTableLock
PVOID NTAPI ExAllocatePoolWithQuota(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes)
PLIST_ENTRY NTAPI ExpRemovePoolTailList(IN PLIST_ENTRY ListHead)
VOID NTAPI ExpInsertPoolTracker(IN ULONG Key, IN SIZE_T NumberOfBytes, IN POOL_TYPE PoolType)
ULONGLONG MiLastPoolDumpTime
ULONG NTAPI ExpFindAndRemoveTagBigPages(IN PVOID Va, OUT PULONG_PTR BigPages, IN POOL_TYPE PoolType)
SIZE_T PoolBigPageTableHash
PLIST_ENTRY NTAPI ExpEncodePoolLink(IN PLIST_ENTRY Link)
BOOLEAN NTAPI ExpIsPoolListEmpty(IN PLIST_ENTRY ListHead)
#define BooleanFlagOn(F, SF)
#define ExAllocatePool(type, size)
_Must_inspect_result_ _In_ LPCGUID _In_ ULONG _In_ FSRTL_ALLOCATE_ECP_FLAGS _In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK _Inout_ PVOID LookasideList
_Must_inspect_result_ _In_ USHORT NewSize
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
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
VOID FASTCALL KeInitializeGuardedMutex(OUT PKGUARDED_MUTEX GuardedMutex)
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
VOID FASTCALL KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, IN KIRQL OldIrql)
KIRQL FASTCALL KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
NTSYSAPI void WINAPI DbgBreakPoint(void)
#define InterlockedExchangeAdd
#define InterlockedCompareExchangePointer
#define InterlockedExchangeAddSizeT(a, b)
VOID KdbpPrint(_In_ PSTR Format, _In_ ...)
Prints the given string with printf-like formatting.
struct _POOL_HEADER * PPOOL_HEADER
LIST_ENTRY ExPoolLookasideListHead
struct _POOL_TRACKER_TABLE POOL_TRACKER_TABLE
#define POOL_FREE_IRQL_INVALID
#define POOL_LISTS_PER_PAGE
#define POOL_BILLED_PROCESS_INVALID
#define POOL_FLAG_CHECK_WORKERS
#define POOL_FLAG_DBGPRINT_ON_FAILURE
#define POOL_FLAG_CRASH_ON_FAILURE
#define POOL_FLAG_CHECK_RESOURCES
#define POOL_FLAG_CHECK_TIMERS
#define POOL_FLAG_SPECIAL_POOL
#define POOL_FLAG_VERIFIER
#define POOL_FLAG_CHECK_DEADLOCK
#define POOL_ALLOC_IRQL_INVALID
PLDR_DATA_TABLE_ENTRY NTAPI MiLookupDataTableEntry(IN PVOID Address)
#define ExFreePoolWithTag(_P, _T)
#define NUMBER_POOL_LOOKASIDE_LISTS
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
DECLSPEC_NORETURN NTSYSAPI VOID NTAPI RtlRaiseStatus(_In_ NTSTATUS Status)
struct _EPROCESS * PEPROCESS
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
#define UNREFERENCED_PARAMETER(P)
POOL_TYPE NTAPI MmDeterminePoolType(IN PVOID VirtualAddress)
PVOID NTAPI MiAllocatePoolPages(IN POOL_TYPE PoolType, IN SIZE_T SizeInBytes)
#define MUST_SUCCEED_POOL_MASK
#define SESSION_POOL_MASK
BOOLEAN NTAPI MmIsSpecialPoolAddress(IN PVOID P)
BOOLEAN NTAPI MmUseSpecialPool(IN SIZE_T NumberOfBytes, IN ULONG Tag)
PVOID NTAPI MmAllocateSpecialPool(IN SIZE_T NumberOfBytes, IN ULONG Tag, IN POOL_TYPE PoolType, IN ULONG SpecialType)
VOID NTAPI MmFreeSpecialPool(IN PVOID P)
ULONG NTAPI MiFreePoolPages(IN PVOID StartingAddress)
ULONG MmSizeOfNonPagedPoolInBytes
VOID MiDumpPoolConsumers(BOOLEAN CalledFromDbg, ULONG Tag, ULONG Mask, ULONG Flags)
PEPROCESS PsInitialSystemProcess
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.
VOID NTAPI PsReturnPoolQuota(_In_ PEPROCESS Process, _In_ POOL_TYPE PoolType, _In_ SIZE_T Amount)
Returns the pool quota that the process was taking up.
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
#define KeQueryInterruptTime()
PULONG MinorVersion OPTIONAL
base of all file and directory entries
GENERAL_LOOKASIDE_POOL PPPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS]
GENERAL_LOOKASIDE_POOL PPNPagedLookasideList[NUMBER_POOL_LOOKASIDE_LISTS]
UNICODE_STRING BaseDllName
struct _LIST_ENTRY * Blink
struct _LIST_ENTRY * Flink
LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE]
SIZE_T PoolTrackTableSize
PPOOL_TRACKER_TABLE PoolTrackTableExpansion
PPOOL_TRACKER_TABLE PoolTrackTable
SIZE_T PoolTrackTableSizeExpansion
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INFO_LENGTH_MISMATCH
#define STATUS_INSUFFICIENT_RESOURCES
static int Link(const char **args)
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
_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
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG PoolTag
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
_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_ ULONG Flags
FORCEINLINE USHORT ExQueryDepthSList(_In_ PSLIST_HEADER SListHead)
#define ExReleaseSpinLock(Lock, OldIrql)
#define ExAllocatePoolWithQuotaTag(a, b, c)
#define ExAcquireSpinLock(Lock, OldIrql)
_Out_ PBOOLEAN QuotaCharged
struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE GENERAL_LOOKASIDE
struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE * PGENERAL_LOOKASIDE
enum _EX_POOL_PRIORITY EX_POOL_PRIORITY
_Must_inspect_result_ typedef _Out_ PULONG TableSize
#define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
_Must_inspect_result_ typedef _In_ ULONG TableEntry
#define POOL_RAISE_IF_ALLOCATION_FAILURE
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
struct _KGUARDED_MUTEX * PKGUARDED_MUTEX
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
_In_opt_ PVOID DeferredContext
@ LockQueueNonPagedPoolLock
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
#define ROUND_TO_PAGES(Size)
#define BYTES_TO_PAGES(Size)
#define ObDereferenceObject
#define ObReferenceObject
#define PsGetCurrentProcess
#define InterlockedPushEntrySList(SListHead, SListEntry)
#define InterlockedPopEntrySList(SListHead)