33 8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
34 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
35 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
36 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
37 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
38 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
39 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
40 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
41 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
42 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
43 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
44 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
45 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
46 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
47 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
48 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
64 if ((Bits >> 16) & 0xFF)
116 SIZE_T DeCommitFreeBlockThreshold;
156 Heap->Entry.SmallTagIndex =
LOBYTE(Heap->Entry.Size) ^
HIBYTE(Heap->Entry.Size) ^ Heap->Entry.Flags;
157 Heap->Entry.PreviousSize = 0;
158 Heap->Entry.SegmentOffset = 0;
159 Heap->Entry.UnusedBytes = 0;
176 Heap->SegmentReserve =
Parameters->SegmentReserve;
177 Heap->SegmentCommit =
Parameters->SegmentCommit;
178 Heap->DeCommitFreeBlockThreshold = DeCommitFreeBlockThreshold;
180 Heap->MaximumAllocationSize =
Parameters->MaximumAllocationSize;
181 Heap->CommitRoutine =
Parameters->CommitRoutine;
184 Heap->HeaderValidateCopy =
NULL;
185 Heap->HeaderValidateLength = (
USHORT)HeaderSize;
194 Heap->LockVariable =
Lock;
199 Heap->AlignMask = (
ULONG) ~15;
205 Heap->AlignRound = 2 *
sizeof(
HEAP_ENTRY) - 1;
218 (
PULONG)&Heap->FreeHints[DeCommitFreeBlockThreshold],
219 DeCommitFreeBlockThreshold);
221 RtlZeroMemory(&Heap->FreeHints[0],
sizeof(Heap->FreeHints[0]) * DeCommitFreeBlockThreshold);
245 ASSERT(FreeEntry->Size == BlockSize);
275 if (ListEntry ==
NULL)
291 if (PreviousEntry->Size >= BlockSize)
293 DPRINT(
"Inserting size %lu before %lu.\n", BlockSize, PreviousEntry->Size);
297 ListEntry = ListEntry->
Flink;
335 ASSERT(NextHintIndex != 0xFFFFFFFF);
336 if ((NextHintIndex == 0) || (NextHintIndex >
HintIndex))
365 DPRINT(
"RtlpInsertFreeBlock(%p %p %x)\n", Heap, FreeEntry, BlockSize);
371 Flags = FreeEntry->Flags;
372 PreviousSize = FreeEntry->PreviousSize;
373 SegmentOffset = FreeEntry->SegmentOffset;
388 FreeEntry->Flags = 0;
393 FreeEntry->Flags =
Flags;
397 FreeEntry->Size =
Size;
398 FreeEntry->PreviousSize = PreviousSize;
399 FreeEntry->SegmentOffset = SegmentOffset;
417 FreeEntry->PreviousSize = PreviousSize;
450 if ((
HintIndex != 0) && (NewHintEntry->Size != FreeEntry->Size))
453 ASSERT(NewHintEntry->Size > FreeEntry->Size);
459 if (NewHintEntry !=
NULL)
492 DPRINT1(
"Free heap block %p modified at %p after it was freed\n",
509 return VirtualEntry->
CommitSize - HeapEntry->Size;
538 (
PVOID *)&UcrSegment,
548 (
PVOID *)&UcrSegment,
558 (
PVOID *)&UcrSegment,
579 (
PVOID *)&UcrDescriptor,
604 return UcrDescriptor;
613 UcrDescriptor->
Size = 0;
631 Current =
Segment->UCRSegmentList.Flink;
632 while (Current != &
Segment->UCRSegmentList)
657 Current = Current->
Flink;
663 Segment->NumberOfUnCommittedRanges--;
668 Current = Current->
Flink;
674 if (!UcrDescriptor)
return;
685 Segment->NumberOfUnCommittedRanges++;
693 PVOID AddressRequested)
698 DPRINT(
"RtlpFindAndCommitPages(%p %p %Ix %p)\n", Heap,
Segment, *
Size, AddressRequested);
701 Current =
Segment->UCRSegmentList.Flink;
702 while (Current != &
Segment->UCRSegmentList)
708 (UcrDescriptor->
Address == AddressRequested || !AddressRequested))
733 DPRINT1(
"Committing page failed with status 0x%08X\n",
Status);
748 ASSERT(GuardEntry->Size == 1);
751 if (GuardEntry->PreviousSize == 1)
758 ASSERT(GuardEntry->Size == 1);
768 FreeEntry = GuardEntry;
773 DPRINT(
"Updating UcrDescriptor %p, new Address %p, size %lu\n",
774 UcrDescriptor, UcrDescriptor->
Address, UcrDescriptor->
Size);
777 if (UcrDescriptor->
Size == 0)
783 ASSERT((FreeEntry + FreeEntry->Size) == UcrDescriptor->
Address);
798 ASSERT(NextEntry->PreviousSize == 0);
799 ASSERT(NextEntry == FreeEntry + FreeEntry->Size);
800 NextEntry->PreviousSize = FreeEntry->Size;
807 Segment->NumberOfUnCommittedRanges--;
813 ASSERT(GuardEntry == FreeEntry + FreeEntry->Size);
815 GuardEntry->Size = 1;
816 GuardEntry->PreviousSize = FreeEntry->Size;
817 GuardEntry->SegmentOffset = FreeEntry->SegmentOffset;
818 DPRINT(
"Setting %p as UCR guard entry.\n", GuardEntry);
826 Current = Current->
Flink;
841 SIZE_T PrecedingSize, DecommitSize;
845 DPRINT(
"Decommitting %p %p %x\n", Heap, FreeEntry,
Size);
862 if (PrecedingSize == 0)
891 if (DecommitEnd <= DecommitBase)
898 DecommitSize = DecommitEnd - DecommitBase;
904 DPRINT1(
"HEAP: Failed to create UCR descriptor\n");
911 (
PVOID *)&DecommitBase,
914 ASSERT((DecommitBase + DecommitSize) == DecommitEnd);
931 GuardEntry->Size = 1;
933 GuardEntry->SegmentOffset = FreeEntry->SegmentOffset;
934 DPRINT(
"Setting %p as UCR guard entry.\n", GuardEntry);
938 switch (PrecedingSize)
942 GuardEntry->PreviousSize = 1;
944 GuardEntry->Size = 1;
946 GuardEntry->SegmentOffset = FreeEntry->SegmentOffset;
951 GuardEntry->PreviousSize = FreeEntry->PreviousSize;
955 GuardEntry->PreviousSize = PrecedingSize;
956 FreeEntry->Size = PrecedingSize;
957 FreeEntry->Flags &= ~HEAP_ENTRY_LAST_ENTRY;
978 NextFreeEntry->Flags = 0;
979 NextFreeEntry->PreviousSize = 0;
980 NextFreeEntry->SegmentOffset =
Segment->Entry.SegmentOffset;
981 NextFreeEntry->Size = (
USHORT)NextSize;
983 NextEntry->PreviousSize = NextSize;
995 NextEntry->PreviousSize = 0;
1014 ASSERT(SegmentReserve >= SegmentCommit);
1017 DPRINT(
"RtlpInitializeHeapSegment(%p %p %x %x %lx %lx)\n", Heap,
Segment, SegmentIndex, SegmentFlags, SegmentReserve, SegmentCommit);
1025 Segment->Entry.PreviousSize = 0;
1026 Segment->Entry.SegmentOffset = SegmentIndex;
1027 Segment->Entry.UnusedBytes = 0;
1035 Segment->SegmentFlags = SegmentFlags;
1037 Heap->Segments[SegmentIndex] =
Segment;
1049 Segment->NumberOfUnCommittedRanges = 0;
1059 if (
Segment->NumberOfUnCommittedPages != 0)
1065 GuardEntry->Size = 1;
1067 GuardEntry->SegmentOffset = SegmentIndex;
1068 GuardEntry->PreviousSize = GuardEntry -
Segment->FirstEntry;
1071 switch (GuardEntry->PreviousSize)
1076 GuardEntry->Size = 1;
1078 GuardEntry->SegmentOffset = SegmentIndex;
1079 DPRINT1(
"Setting %p as UCR guard entry.\n", GuardEntry);
1083 GuardEntry->PreviousSize =
Segment->Entry.Size;
1087 FreeEntry =
Segment->FirstEntry;
1088 FreeEntry->PreviousSize =
Segment->Entry.Size;
1089 FreeEntry->SegmentOffset = SegmentIndex;
1090 FreeEntry->Size = GuardEntry->PreviousSize;
1091 FreeEntry->Flags = 0;
1098 FreeEntry =
Segment->FirstEntry;
1099 FreeEntry->PreviousSize =
Segment->Entry.Size;
1100 FreeEntry->SegmentOffset = SegmentIndex;
1111 if (
Segment->NumberOfUnCommittedPages != 0)
1138 DPRINT1(
"HEAP: Failed to release segment's memory with status 0x%08X\n",
Status);
1156 UCHAR SegmentOffset;
1162 if (CurrentEntry != FreeEntry &&
1166 ASSERT(FreeEntry->PreviousSize == CurrentEntry->Size);
1185 FreeEntry = CurrentEntry;
1186 *FreeSize = *FreeSize + CurrentEntry->Size;
1188 FreeEntry->Size = (
USHORT)(*FreeSize);
1197 SegmentOffset = FreeEntry->SegmentOffset;
1210 ASSERT(*FreeSize == NextEntry->PreviousSize);
1226 *FreeSize = *FreeSize + NextEntry->Size;
1228 FreeEntry->Size = (
USHORT)(*FreeSize);
1237 SegmentOffset = FreeEntry->SegmentOffset;
1257 DPRINT(
"RtlpExtendHeap(%p %x)\n", Heap,
Size);
1262 DPRINT(
"Pages %x, FreeSize %x. Going through segments...\n", Pages, FreeSize);
1274 Pages <= Segment->NumberOfUnCommittedPages)
1276 DPRINT(
"This segment is suitable\n");
1384 FreeEntry->Size >=
Size)
1417 ULONG HeapSegmentFlags = 0;
1425 if (Heap)
return Heap;
1431 DPRINT1(
"Enabling page heap failed\n");
1488 sizeof(SystemInformation),
1493 DPRINT1(
"Getting max usermode address failed with status 0x%08x\n",
Status);
1506 Parameters->VirtualMemoryThreshold > MaxBlockSize)
1508 Parameters->VirtualMemoryThreshold = MaxBlockSize;
1513 DPRINT1(
"WARNING: Ignoring DeCommitFreeBlockThreshold %lx, setting it to PAGE_SIZE.\n",
1562 CommittedAddress = Addr;
1581 DPRINT1(
"Querying amount of user supplied memory failed with status 0x%08X\n",
Status);
1593 CommittedAddress = Addr;
1625 UncommittedAddress = Addr;
1648 DPRINT1(
"Failed to reserve memory with status 0x%08x\n",
Status);
1653 CommittedAddress = Heap;
1654 UncommittedAddress = Heap;
1658 if (CommittedAddress == UncommittedAddress)
1699 DPRINT1(
"Failed to initialize heap segment (%x)\n",
Status);
1703 DPRINT(
"Created heap %p, CommitSize %x, ReserveSize %x\n", Heap,
CommitSize, TotalSize);
1740 if (!HeapPtr)
return NULL;
1761 Current = Current->
Flink;
1794 Current = Current->
Flink;
1828 UCHAR SegmentOffset;
1846 FreeFlags = FreeBlock->Flags;
1851 InUseEntry->Flags = EntryFlags;
1852 InUseEntry->SmallTagIndex = 0;
1855 FreeSize = InUseEntry->Size -
Index;
1870 InUseEntry->UnusedBytes +=
sizeof(
HEAP_ENTRY);
1878 SplitBlock->Flags = FreeFlags;
1879 SplitBlock->SegmentOffset = InUseEntry->SegmentOffset;
1880 SplitBlock->Size = (
USHORT)FreeSize;
1897 SplitBlock2->PreviousSize = (
USHORT)FreeSize;
1904 SplitBlock->Flags = SplitBlock2->Flags;
1910 FreeSize += SplitBlock2->Size;
1916 SplitBlock->Size = (
USHORT)FreeSize;
1942 SegmentOffset = SplitBlock->SegmentOffset;
2013 return InUseEntry + 1;
2035 DPRINT1(
"HEAP: Allocation failed!\n");
2070 if (
Size >= 0x80000000)
2073 DPRINT1(
"HEAP: Allocation failed!\n");
2079 DPRINT1(
"HEAP: RtlAllocateHeap is called with unsupported flags %x, ignoring\n",
Flags);
2118 if (Index <= Heap->VirtualMemoryThreshold)
2129 if (FreeEntry->Size <
Index)
2142 while (FreeEntry->Size <
Index)
2195 return InUseEntry + 1;
2204 (
PVOID *)&VirtualBlock,
2215 DPRINT1(
"HEAP: Allocation failed!\n");
2233 return VirtualBlock + 1;
2254 DPRINT1(
"HEAP: Allocation failed!\n");
2285 Heap = (
PHEAP)HeapPtr;
2304 DPRINT1(
"HEAP: Trying to free an invalid address %p!\n",
Ptr);
2312 DPRINT1(
"HEAP: Trying to free an invalid address %p!\n",
Ptr);
2337 (
PVOID *)&VirtualEntry,
2343 DPRINT1(
"HEAP: Failed releasing memory with Status 0x%08X. Heap %p, ptr %p, base address %p\n",
2351 BlockSize = HeapEntry->Size;
2398 UCHAR EntryFlags, RememberFlags;
2400 SIZE_T FreeSize, PrevSize, TailPart, AddedSize = 0;
2402 UCHAR SegmentOffset;
2405 if (
Index > Heap->VirtualMemoryThreshold)
2409 EntryFlags = InUseEntry->Flags;
2419 Heap->Segments[InUseEntry->SegmentOffset],
2424 if (!FreeEntry)
return FALSE;
2431 if (FreeSize + InUseEntry->Size <
Index)
2435 Heap->TotalFreeSize += FreeSize;
2440 RememberFlags = FreeEntry->Flags;
2443 FreeSize += InUseEntry->Size;
2453 FreeSize = InUseEntry->Size + FreeEntry->Size;
2457 RememberFlags = FreeEntry->Flags;
2461 Heap->TotalFreeSize -= FreeEntry->Size;
2464 PrevSize = (InUseEntry->Size <<
HEAP_ENTRY_SHIFT) - InUseEntry->UnusedBytes;
2482 *NewExtra = *OldExtra;
2501 (InUseEntry + InUseEntry->Size)->PreviousSize = InUseEntry->Size;
2505 SegmentOffset = InUseEntry->SegmentOffset;
2515 UnusedEntry->SegmentOffset = InUseEntry->SegmentOffset;
2520 SegmentOffset = UnusedEntry->SegmentOffset;
2524 UnusedEntry->Flags = RememberFlags;
2525 UnusedEntry->Size = (
USHORT)FreeSize;
2529 Heap->TotalFreeSize += FreeSize;
2539 UnusedEntry->Flags = RememberFlags & (~HEAP_ENTRY_LAST_ENTRY);
2540 UnusedEntry->Size = (
USHORT)FreeSize;
2543 FollowingEntry->PreviousSize = (
USHORT)FreeSize;
2547 Heap->TotalFreeSize += FreeSize;
2552 RememberFlags = FollowingEntry->Flags;
2556 Heap->TotalFreeSize -= FollowingEntry->Size;
2559 FreeSize += FollowingEntry->Size;
2560 UnusedEntry->Flags = RememberFlags;
2566 UnusedEntry->Size = (
USHORT)FreeSize;
2574 SegmentOffset = UnusedEntry->SegmentOffset;
2580 Heap->TotalFreeSize += FreeSize;
2599 TailPart = PrevSize & (
sizeof(
ULONG) - 1);
2602 if (TailPart) TailPart = 4 - TailPart;
2604 if (
Size > (PrevSize + TailPart))
2605 AddedSize = (
Size - (PrevSize + TailPart)) & ~(
sizeof(
ULONG) - 1);
2624 InUseEntry->Flags &= ~HEAP_ENTRY_SETTABLE_FLAGS;
2677 PVOID NewBaseAddress;
2683 SIZE_T RemainderBytes, ExtraSize;
2686 UCHAR SegmentOffset;
2703 if (
Size >= 0x80000000)
2762 OldIndex = InUseEntry->Size;
2771 if (
Index <= OldIndex)
2774 if (
Index + 1 == OldIndex)
2792 *NewExtra = *OldExtra;
2816 RemainderBytes = OldSize & (
sizeof(
ULONG) - 1);
2819 RemainderBytes = 4 - RemainderBytes;
2821 if (
Size > (OldSize + RemainderBytes))
2824 ExtraSize = (
Size - (OldSize + RemainderBytes)) & ~(
sizeof(
ULONG) - 1);
2846 if (
Index != OldIndex)
2849 FreeFlags = InUseEntry->Flags & ~HEAP_ENTRY_BUSY;
2863 (
PVOID *)&DecommitBase,
2869 DPRINT1(
"HEAP: Unable to release memory (pointer %p, size 0x%x), Status %08x\n", DecommitBase, DecommitSize,
Status);
2874 VirtualAllocBlock->
CommitSize -= DecommitSize;
2883 SplitBlock->Flags = FreeFlags;
2885 SplitBlock->SegmentOffset = InUseEntry->SegmentOffset;
2888 FreeSize = InUseEntry->Size -
Index;
2892 InUseEntry->Flags &= ~HEAP_ENTRY_LAST_ENTRY;
2897 SegmentOffset = SplitBlock->SegmentOffset;
2901 SplitBlock->Size = (
USHORT)FreeSize;
2915 SplitBlock->Size = (
USHORT)FreeSize;
2929 SplitBlock->Flags = SplitBlock2->Flags;
2936 FreeSize += SplitBlock2->Size;
2940 SplitBlock->Size = (
USHORT)FreeSize;
2949 SegmentOffset = SplitBlock->SegmentOffset;
2976 DPRINT1(
"Realloc in place failed, but it was the only option\n");
2982 Flags &= ~HEAP_TAG_MASK;
2988 Flags &= ~HEAP_SETTABLE_USER_FLAGS;
3002 else if (InUseEntry->SmallTagIndex)
3042 if (
Size > OldSize &&
3052 Ptr = NewBaseAddress;
3242 TailPart = (
PCHAR)(HeapEntry + 1) +
Size;
3251 DPRINT1(
"HEAP: Heap entry (size %x) %p tail is modified at %p\n",
Size, HeapEntry, TailPart +
Result);
3275 ULONG SegmentOffset;
3278 if (!HeapEntry)
goto invalid_entry;
3285 if (BigAllocation &&
3289 if (!BigAllocation && (HeapEntry->SegmentOffset >=
HEAP_SEGMENTS ||
3291 HeapEntry < Segment->FirstEntry ||
3292 HeapEntry >=
Segment->LastValidEntry))
3303 for (SegmentOffset = 0; SegmentOffset <
HEAP_SEGMENTS; SegmentOffset++)
3308 if ((HeapEntry >=
Segment->FirstEntry) &&
3309 (HeapEntry < Segment->LastValidEntry))
3321 DPRINT1(
"HEAP: Invalid heap entry %p in heap %p\n", HeapEntry, Heap);
3329 UCHAR SegmentOffset,
3339 ULONG UnCommittedPages;
3340 ULONG UnCommittedRanges;
3343 UnCommittedPages = 0;
3344 UnCommittedRanges = 0;
3349 UcrDescriptor =
NULL;
3353 UcrEntry =
Segment->UCRSegmentList.Flink;
3357 if (
Segment->BaseAddress == Heap)
3358 CurrentEntry = &Heap->Entry;
3360 CurrentEntry = &
Segment->Entry;
3362 while (CurrentEntry < Segment->LastValidEntry)
3364 if (UcrDescriptor &&
3367 DPRINT1(
"HEAP: Entry %p is not inside uncommited range [%p .. %p)\n",
3368 CurrentEntry, UcrDescriptor->
Address,
3376 while (CurrentEntry < Segment->LastValidEntry)
3378 if (PreviousSize != CurrentEntry->PreviousSize)
3380 DPRINT1(
"HEAP: Entry %p has incorrect PreviousSize %x instead of %x\n",
3381 CurrentEntry, CurrentEntry->PreviousSize, PreviousSize);
3386 PreviousSize = CurrentEntry->Size;
3406 *FreeEntriesCount = *FreeEntriesCount + 1;
3407 *TotalFreeSize += CurrentEntry->Size;
3426 DPRINT1(
"HEAP: Free heap block %p modified at %p after it was freed\n",
3435 if (CurrentEntry->SegmentOffset != SegmentOffset)
3437 DPRINT1(
"HEAP: Heap entry %p SegmentOffset is incorrect %x (should be %x)\n",
3438 CurrentEntry, SegmentOffset, CurrentEntry->SegmentOffset);
3450 if (CurrentEntry !=
Segment->LastValidEntry)
3452 DPRINT1(
"HEAP: Heap entry %p is not last block in segment (%p)\n",
3453 CurrentEntry,
Segment->LastValidEntry);
3457 else if (CurrentEntry != UcrDescriptor->
Address)
3459 DPRINT1(
"HEAP: Heap entry %p does not match next uncommitted address (%p)\n",
3460 CurrentEntry, UcrDescriptor->
Address);
3467 UnCommittedRanges++;
3472 UcrEntry = UcrEntry->
Flink;
3473 if (UcrEntry == &
Segment->UCRSegmentList)
3476 UcrDescriptor =
NULL;
3493 if (
Segment->NumberOfUnCommittedPages != UnCommittedPages)
3495 DPRINT1(
"HEAP: Segment %p NumberOfUnCommittedPages is invalid (%x != %x)\n",
3501 if (
Segment->NumberOfUnCommittedRanges != UnCommittedRanges)
3503 DPRINT1(
"HEAP: Segment %p NumberOfUnCommittedRanges is invalid (%x != %x)\n",
3516 UCHAR SegmentOffset;
3519 ULONG FreeBlocksCount, FreeListEntriesCount;
3531 FreeListEntriesCount = 0;
3533 NextEntry = ListHead->
Flink;
3535 while (NextEntry != ListHead)
3539 NextEntry = NextEntry->
Flink;
3541 if (NextEntry != ListHead)
3545 if (FreeEntry->Size > NextFreeEntry->Size)
3547 DPRINT1(
"Dedicated free entry %p of size %ld is not put in order.\n", FreeEntry, FreeEntry->Size);
3556 DPRINT1(
"No hint pointing to the non-dedicated list although there is a free entry %p of size %ld.\n",
3557 FreeEntry, FreeEntry->Size);
3561 DPRINT1(
"Hint bit 0 is not set although there is a free entry %p of size %ld.\n",
3562 FreeEntry, FreeEntry->Size);
3569 DPRINT1(
"No hint pointing to the dedicated list although there is a free entry %p of size %ld.\n",
3570 FreeEntry, FreeEntry->Size);
3574 DPRINT1(
"Hint bit 0 is not set although there is a free entry %p of size %ld.\n",
3575 FreeEntry, FreeEntry->Size);
3582 DPRINT1(
"HEAP: Free element %p is marked in-use\n", FreeEntry);
3587 FreeListEntriesCount++;
3599 DPRINT1(
"Hint bitmap bit at %u is not set, but there is a hint entry.\n",
HintIndex);
3606 DPRINT1(
"There is an entry %p of size %lu, smaller than the decommit threshold %lu in the non-dedicated free list hint.\n",
3614 DPRINT1(
"There is an entry %p of size %lu at the position %u in the free entry hint array.\n",
3624 if (PreviousFreeEntry->Size >= FreeEntry->Size)
3626 DPRINT1(
"Free entry hint %p of size %lu is larger than the entry before it %p, which is of size %lu.\n",
3627 FreeEntry, FreeEntry->Size, PreviousFreeEntry, PreviousFreeEntry->Size);
3634 DPRINT1(
"Hint bitmap bit at %u is set, but there is no hint entry.\n",
HintIndex);
3640 NextEntry = ListHead->
Flink;
3642 while (ListHead != NextEntry)
3653 NextEntry = NextEntry->
Flink;
3657 FreeBlocksCount = 0;
3660 for (SegmentOffset = 0; SegmentOffset <
HEAP_SEGMENTS; SegmentOffset++)
3679 if (FreeListEntriesCount != FreeBlocksCount)
3681 DPRINT1(
"HEAP: Free blocks count in arena (%lu) does not match free blocks number in the free lists (%lu)\n", FreeBlocksCount, FreeListEntriesCount);
3687 DPRINT1(
"HEAP: Total size of free blocks in arena (%Iu) does not equal to the one in heap header (%Iu)\n", TotalFreeSize, Heap->
TotalFreeSize);
3729 DPRINT1(
"HEAP: Signature %lx is invalid for heap %p\n", Heap->
Signature, Heap);
3913 HeapEntry->Flags &= ~(UserFlagsReset >> 4);
3914 HeapEntry->Flags |= (UserFlagsSet >> 4);
4070 if (HeapInformationLength <
sizeof(
ULONG))
4077 if (*(
PULONG)HeapInformation != 2)
4082 DPRINT1(
"RtlSetHeapInformation() needs to enable LFH\n");
4093 PVOID HeapInformation,
4094 SIZE_T HeapInformationLength,
4107 if (HeapInformationLength <
sizeof(
ULONG))
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI RtlInitializeHeapLock(IN OUT PHEAP_LOCK *Lock)
NTSTATUS NTAPI RtlEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
KPROCESSOR_MODE NTAPI RtlpGetMode(VOID)
VOID NTAPI RtlpSetHeapParameters(IN PRTL_HEAP_PARAMETERS Parameters)
NTSTATUS NTAPI RtlDeleteHeapLock(IN OUT PHEAP_LOCK Lock)
NTSTATUS NTAPI RtlLeaveHeapLock(IN OUT PHEAP_LOCK Lock)
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define RtlCompareMemory(s1, s2, l)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define ROUND_UP(n, align)
#define ROUND_DOWN(n, align)
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
GLuint GLuint GLsizei count
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
_Must_inspect_result_ _In_ USAGE _In_ USHORT _In_ USAGE Usage
#define EXCEPTION_EXECUTE_HANDLER
#define FLG_HEAP_DISABLE_COALESCING
#define FLG_USER_STACK_TRACE_DB
#define FLG_HEAP_ENABLE_FREE_CHECK
#define FLG_HEAP_VALIDATE_PARAMETERS
#define FLG_HEAP_ENABLE_TAIL_CHECK
#define FLG_HEAP_VALIDATE_ALL
#define RtlFillMemory(Dest, Length, Fill)
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
NTSYSAPI void WINAPI RtlSetLastWin32ErrorAndNtStatusFromNtStatus(NTSTATUS)
NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP)
NTSYSAPI ULONG WINAPI RtlFindSetBits(PCRTL_BITMAP, ULONG, ULONG)
NTSYSAPI ULONG WINAPI RtlGetNtGlobalFlags(void)
#define ARENA_FREE_FILLER
#define RtlFillMemoryUlong(dst, len, val)
NTSYSAPI NTSTATUS NTAPI ZwQueryVirtualMemory(_In_ HANDLE ProcessHandle, _In_ PVOID Address, _In_ MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass, _Out_ PVOID VirtualMemoryInformation, _In_ SIZE_T Length, _Out_opt_ PSIZE_T ResultLength)
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T CommitSize
#define PAGE_ROUND_DOWN(x)
NTSYSAPI VOID NTAPI RtlRaiseException(_In_ PEXCEPTION_RECORD ExceptionRecord)
@ HeapCompatibilityInformation
#define HEAP_SKIP_VALIDATION_CHECKS
NTSTATUS(NTAPI * PHEAP_ENUMERATION_ROUTINE)(_In_ PVOID HeapHandle, _In_ PVOID UserParam)
#define HEAP_LOCK_USER_ALLOCATED
struct _HEAP_LOCK * PHEAP_LOCK
#define HEAP_VALIDATE_ALL_ENABLED
#define HEAP_CAPTURE_STACK_BACKTRACES
#define HEAP_VALIDATE_PARAMETERS_ENABLED
struct _HEAP_LOCK HEAP_LOCK
#define HEAP_FLAG_PAGE_ALLOCS
enum _HEAP_INFORMATION_CLASS HEAP_INFORMATION_CLASS
_In_ PMEMORY_AREA _In_ PVOID _In_ BOOLEAN Locked
#define HEAP_FREE_CHECKING_ENABLED
#define HEAP_DISABLE_COALESCE_ON_FREE
#define HEAP_GENERATE_EXCEPTIONS
#define HEAP_TAIL_CHECKING_ENABLED
#define NtCurrentProcess()
#define HEAP_SETTABLE_USER_VALUE
#define HEAP_SETTABLE_USER_FLAGS
#define HEAP_CREATE_ALIGN_16
#define HEAP_PSEUDO_TAG_FLAG
#define HEAP_CREATE_VALID_MASK
#define HEAP_REALLOC_IN_PLACE_ONLY
#define HEAP_CREATE_ENABLE_TRACING
#define HEAP_NO_SERIALIZE
#define RTL_BITS_OF(sizeOfArg)
BOOLEAN RtlpPageHeapEnabled
VOID NTAPI RtlpAddHeapToProcessList(struct _HEAP *Heap)
VOID NTAPI RtlpRemoveHeapFromProcessList(struct _HEAP *Heap)
#define STATUS_INVALID_HANDLE
#define STATUS_NOT_IMPLEMENTED
#define ARENA_INUSE_FILLER
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
VOID NTAPI RtlClearBit(_In_ PRTL_BITMAP BitMapHeader, _In_ BITMAP_INDEX BitNumber)
HANDLE NTAPI RtlDestroyHeap(HANDLE HeapPtr)
PHEAP_FREE_ENTRY NTAPI RtlpCoalesceFreeBlocks(PHEAP Heap, PHEAP_FREE_ENTRY FreeEntry, PSIZE_T FreeSize, BOOLEAN Remove)
UCHAR FillPattern[HEAP_ENTRY_SIZE]
FORCEINLINE UCHAR RtlpFindLeastSetBit(ULONG Bits)
NTSTATUS NTAPI RtlpInitializeHeapSegment(IN OUT PHEAP Heap, OUT PHEAP_SEGMENT Segment, IN UCHAR SegmentIndex, IN ULONG SegmentFlags, IN SIZE_T SegmentReserve, IN SIZE_T SegmentCommit)
PHEAP_ENTRY NTAPI RtlpSplitEntry(PHEAP Heap, ULONG Flags, PHEAP_FREE_ENTRY FreeBlock, SIZE_T AllocationSize, SIZE_T Index, SIZE_T Size)
NTSTATUS NTAPI RtlSetHeapInformation(IN HANDLE HeapHandle OPTIONAL, IN HEAP_INFORMATION_CLASS HeapInformationClass, IN PVOID HeapInformation, IN SIZE_T HeapInformationLength)
NTSTATUS NTAPI RtlpInitializeHeap(OUT PHEAP Heap, IN ULONG Flags, IN PHEAP_LOCK Lock OPTIONAL, IN PRTL_HEAP_PARAMETERS Parameters)
static BOOLEAN RtlpIsLastCommittedEntry(PHEAP_ENTRY Entry)
BOOLEAN NTAPI RtlpValidateHeap(PHEAP Heap, BOOLEAN ForceValidation)
BOOLEAN NTAPI RtlGetUserInfoHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, OUT PVOID *UserValue, OUT PULONG UserFlags)
NTSTATUS NTAPI RtlUsageHeap(IN HANDLE Heap, IN ULONG Flags, OUT PRTL_HEAP_USAGE Usage)
static PVOID RtlpAllocateNonDedicated(PHEAP Heap, ULONG Flags, SIZE_T Size, SIZE_T AllocationSize, SIZE_T Index, BOOLEAN HeapLocked)
ULONG NTAPI RtlMultipleFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN ULONG Count, OUT PVOID *Array)
BOOLEAN NTAPI RtlValidateHeap(HANDLE HeapPtr, ULONG Flags, PVOID Block)
PVOID NTAPI RtlReAllocateHeap(HANDLE HeapPtr, ULONG Flags, PVOID Ptr, SIZE_T Size)
NTSTATUS NTAPI RtlWalkHeap(IN HANDLE HeapHandle, IN PVOID HeapEntry)
BOOLEAN NTAPI RtlSetUserFlagsHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, IN ULONG UserFlagsReset, IN ULONG UserFlagsSet)
static PHEAP_FREE_ENTRY RtlpExtendHeap(PHEAP Heap, SIZE_T Size)
BOOLEAN NTAPI RtlpCheckInUsePattern(PHEAP_ENTRY HeapEntry)
VOID NTAPI RtlpInsertUnCommittedPages(PHEAP_SEGMENT Segment, ULONG_PTR Address, SIZE_T Size)
PWSTR NTAPI RtlQueryTagHeap(IN PVOID HeapHandle, IN ULONG Flags, IN USHORT TagIndex, IN BOOLEAN ResetCounters, OUT PRTL_HEAP_TAG_INFO HeapTagInfo)
ULONG NTAPI RtlCreateTagHeap(_In_ HANDLE HeapHandle, _In_ ULONG Flags, _In_opt_ PWSTR TagName, _In_ PWSTR TagSubName)
static VOID RtlpDeCommitFreeBlock(PHEAP Heap, PHEAP_FREE_ENTRY FreeEntry, SIZE_T Size)
BOOLEAN NTAPI RtlpGrowBlockInPlace(IN PHEAP Heap, IN ULONG Flags, IN PHEAP_ENTRY InUseEntry, IN SIZE_T Size, IN SIZE_T Index)
HANDLE NTAPI RtlCreateHeap(ULONG Flags, PVOID Addr, SIZE_T TotalSize, SIZE_T CommitSize, PVOID Lock, PRTL_HEAP_PARAMETERS Parameters)
SIZE_T NTAPI RtlSizeHeap(HANDLE HeapPtr, ULONG Flags, PVOID Ptr)
VOID NTAPI RtlpInsertFreeBlock(PHEAP Heap, PHEAP_FREE_ENTRY FreeEntry, SIZE_T BlockSize)
BOOLEAN NTAPI RtlpValidateHeapHeaders(PHEAP Heap, BOOLEAN Recalculate)
PVOID NTAPI RtlProtectHeap(IN PVOID HeapHandle, IN BOOLEAN ReadOnly)
BOOLEAN NTAPI RtlValidateProcessHeaps(VOID)
VOID NTAPI RtlpInsertFreeBlockHelper(PHEAP Heap, PHEAP_FREE_ENTRY FreeEntry, SIZE_T BlockSize, BOOLEAN NoFill)
VOID NTAPI RtlpDestroyUnCommittedRange(PHEAP_SEGMENT Segment, PHEAP_UCR_DESCRIPTOR UcrDescriptor)
BOOLEAN NTAPI RtlSetUserValueHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, IN PVOID UserValue)
BOOLEAN NTAPI RtlUnlockHeap(HANDLE HeapPtr)
PHEAP_UCR_DESCRIPTOR NTAPI RtlpCreateUnCommittedRange(PHEAP_SEGMENT Segment)
SIZE_T NTAPI RtlpGetSizeOfBigBlock(PHEAP_ENTRY HeapEntry)
ULONG NTAPI RtlExtendHeap(IN HANDLE Heap, IN ULONG Flags, IN PVOID P, IN SIZE_T Size)
PHEAP_FREE_ENTRY NTAPI RtlpCoalesceHeap(PHEAP Heap)
ULONG NTAPI RtlGetProcessHeaps(ULONG count, HANDLE *heaps)
BOOLEAN NTAPI RtlpValidateHeapEntry(PHEAP Heap, PHEAP_ENTRY HeapEntry)
ULONG NTAPI RtlMultipleAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size, IN ULONG Count, OUT PVOID *Array)
NTSTATUS NTAPI RtlQueryProcessHeapInformation(IN struct _DEBUG_BUFFER *DebugBuffer)
PHEAP_ENTRY_EXTRA NTAPI RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry)
NTSTATUS NTAPI RtlQueryHeapInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, SIZE_T HeapInformationLength, PSIZE_T ReturnLength OPTIONAL)
VOID NTAPI RtlpDestroyHeapSegment(PHEAP_SEGMENT Segment)
NTSTATUS NTAPI RtlEnumProcessHeaps(PHEAP_ENUMERATION_ROUTINE HeapEnumerationRoutine, PVOID lParam)
BOOLEAN NTAPI RtlpValidateHeapSegment(PHEAP Heap, PHEAP_SEGMENT Segment, UCHAR SegmentOffset, PULONG FreeEntriesCount, PSIZE_T TotalFreeSize, PSIZE_T TagEntries, PSIZE_T PseudoTagEntries)
BOOLEAN NTAPI RtlLockHeap(IN HANDLE HeapPtr)
static PHEAP_FREE_ENTRY RtlpFindAndCommitPages(PHEAP Heap, PHEAP_SEGMENT Segment, PSIZE_T Size, PVOID AddressRequested)
ULONG NTAPI RtlCompactHeap(HANDLE Heap, ULONG Flags)
static VOID RtlpRemoveFreeBlock(PHEAP Heap, PHEAP_FREE_ENTRY FreeEntry, BOOLEAN NoFill)
BOOLEAN NTAPI RtlZeroHeap(IN PVOID HeapHandle, IN ULONG Flags)
struct _HEAP_ENTRY_EXTRA HEAP_ENTRY_EXTRA
SIZE_T NTAPI RtlDebugSizeHeap(HANDLE HeapPtr, ULONG Flags, PVOID Ptr)
PVOID NTAPI RtlDebugAllocateHeap(PVOID HeapPtr, ULONG Flags, SIZE_T Size)
BOOLEAN NTAPI RtlDebugSetUserValueHeap(PVOID HeapHandle, ULONG Flags, PVOID BaseAddress, PVOID UserValue)
struct _HEAP_UCR_DESCRIPTOR HEAP_UCR_DESCRIPTOR
struct _HEAP_ENTRY * PHEAP_ENTRY
PVOID NTAPI RtlpPageHeapDestroy(HANDLE HeapPtr)
#define HEAP_ENTRY_EXTRA_PRESENT
#define HEAP_EXTRA_FLAGS_MASK
BOOLEAN NTAPI RtlpPageHeapLock(HANDLE HeapPtr)
HANDLE NTAPI RtlDebugCreateHeap(ULONG Flags, PVOID Addr, SIZE_T TotalSize, SIZE_T CommitSize, PVOID Lock, PRTL_HEAP_PARAMETERS Parameters)
struct _HEAP_VIRTUAL_ALLOC_ENTRY HEAP_VIRTUAL_ALLOC_ENTRY
struct _HEAP_FREE_ENTRY HEAP_FREE_ENTRY
struct _HEAP_ENTRY_EXTRA * PHEAP_ENTRY_EXTRA
FORCEINLINE BOOLEAN RtlpHeapIsSpecial(ULONG Flags)
BOOLEAN NTAPI RtlDebugFreeHeap(HANDLE HeapPtr, ULONG Flags, PVOID Ptr)
BOOLEAN NTAPI RtlDebugDestroyHeap(HANDLE HeapPtr)
HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA
BOOLEAN NTAPI RtlDebugSetUserFlagsHeap(PVOID HeapHandle, ULONG Flags, PVOID BaseAddress, ULONG UserFlagsReset, ULONG UserFlagsSet)
#define HEAP_SEGMENT_SIGNATURE
PVOID NTAPI RtlDebugReAllocateHeap(HANDLE HeapPtr, ULONG Flags, PVOID Ptr, SIZE_T Size)
#define HEAP_MAX_BLOCK_SIZE
#define HEAP_USER_ALLOCATED
#define HEAP_ENTRY_SETTABLE_FLAGS
struct _HEAP_UCR_DESCRIPTOR * PHEAP_UCR_DESCRIPTOR
struct _HEAP_FREE_ENTRY * PHEAP_FREE_ENTRY
BOOLEAN NTAPI RtlDebugGetUserInfoHeap(PVOID HeapHandle, ULONG Flags, PVOID BaseAddress, PVOID *UserValue, PULONG UserFlags)
struct _HEAP_ENTRY HEAP_ENTRY
#define HEAP_ENTRY_LAST_ENTRY
BOOLEAN NTAPI RtlpPageHeapUnlock(HANDLE HeapPtr)
BOOLEAN NTAPI RtlpDebugPageHeapValidate(PVOID HeapPtr, ULONG Flags, PVOID Block)
#define HEAP_ENTRY_FILL_PATTERN
#define HEAP_ENTRY_VIRTUAL_ALLOC
HANDLE NTAPI RtlpPageHeapCreate(ULONG Flags, PVOID Addr, SIZE_T TotalSize, SIZE_T CommitSize, PVOID Lock, PRTL_HEAP_PARAMETERS Parameters)
#define STATUS_BUFFER_TOO_SMALL
PULONG MinorVersion OPTIONAL
base of all file and directory entries
struct _EXCEPTION_RECORD * ExceptionRecord
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
HEAP_ENTRY_EXTRA ExtraStuff
PRTL_HEAP_COMMIT_ROUTINE CommitRoutine
PLIST_ENTRY FreeHints[ANYSIZE_ARRAY]
RTL_BITMAP FreeHintBitmap
LIST_ENTRY VirtualAllocdBlocks
PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries
SIZE_T DeCommitFreeBlockThreshold
SIZE_T DeCommitTotalFreeThreshold
struct _HEAP_SEGMENT * Segments[HEAP_SEGMENTS]
struct _LIST_ENTRY * Blink
struct _LIST_ENTRY * Flink
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define RtlMoveMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
_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
_In_ ULONG _In_ ULONG HintIndex
_In_opt_ PVOID _In_opt_ SIZE_T ReserveSize
NTSYSAPI VOID NTAPI RtlSetBit(_In_ PRTL_BITMAP BitMapHeader, _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber)
_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlTestBit(_In_ PRTL_BITMAP BitMapHeader, _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber)
_Must_inspect_result_ NTSYSAPI SIZE_T NTAPI RtlCompareMemoryUlong(_In_reads_bytes_(Length) PVOID Source, _In_ SIZE_T Length, _In_ ULONG Pattern)
_IRQL_requires_same_ _In_ CLONG ByteSize