16#define MODULE_INVOLVED_IN_ARM3
104#define ASSERT_LOCKED_FOR_READ(Table) MiDbgAssertIsLockedForRead(Table)
105#define ASSERT_LOCKED_FOR_WRITE(Table) MiDbgAssertIsLockedForWrite(Table)
109#define ASSERT_LOCKED_FOR_READ(Table)
110#define ASSERT_LOCKED_FOR_WRITE(Table)
126 if (!FoundVad)
return NULL;
136 if (SearchResult != TableFoundNode)
return NULL;
143 Table->NodeHint = FoundVad;
167 if (
Table->NumberGenericTableElements == 0)
return TableEmptyTree;
174 ParentNode = CurrentNode;
182 else if (EndVpn < CurrentNode->StartingVpn)
190 *NodeOrParent = ParentNode;
191 return TableFoundNode;
196 *NodeOrParent = ParentNode;
199 return TableInsertAsRight;
203 return TableInsertAsLeft;
231 ASSERT(Vad->EndingVpn >= Vad->StartingVpn);
232 VadRoot->NodeHint = Vad;
253 ULONG_PTR StartingAddress, EndingAddress;
270 DPRINT1(
"The process is dying\n");
302 EndingAddress = StartingAddress +
ViewSize - 1;
305 if ((
Result == TableFoundNode) || (EndingAddress > HighestAddress))
307 DPRINT1(
"Not enough free space to insert this VAD node!\n");
312 ASSERT(StartingAddress != 0);
314 ASSERT(EndingAddress > StartingAddress);
320 EndingAddress = StartingAddress +
ViewSize - 1;
327 if (
Result == TableFoundNode)
329 DPRINT(
"Given address conflicts with existing node\n");
336 Vad->StartingVpn = StartingAddress >>
PAGE_SHIFT;
340 if ((Vad->u.VadFlags.PrivateMemory && Vad->u.VadFlags.MemCommit) ||
341 (!Vad->u.VadFlags.PrivateMemory &&
349 if (Vad->u2.VadFlags2.OneSecured)
352 ASSERT(Vad->u2.VadFlags2.LongVad);
355 ((
PMMVAD_LONG)Vad)->u3.Secured.StartVpn = StartingAddress;
356 ((
PMMVAD_LONG)Vad)->u3.Secured.EndVpn = EndingAddress;
390 ASSERT(Section->Address.EndingVpn >= Section->Address.StartingVpn);
412 Table->NumberGenericTableElements--;
419 else Table->NodeHint =
Table->BalancedRoot.RightChild;
503 ULONG_PTR PageCount, AlignmentVpn, LowVpn, HighestVpn;
514 if (
Table->Unused == 1)
520 if (
Table->NumberGenericTableElements == 0)
524 return TableEmptyTree;
536 if (
Node->StartingVpn >= LowVpn + PageCount)
546 return TableInsertAsLeft;
556 *PreviousVad = PreviousNode;
557 return TableInsertAsRight;
562 if (
Node->EndingVpn >= LowVpn)
574 if (
Table->Unused == 1)
579 if (HighestVpn >= LowVpn + PageCount)
582 *PreviousVad = PreviousNode;
584 return TableInsertAsRight;
588 return TableFoundNode;
617 if (
Table->Unused == 1)
627 if ((LowVpn +
Length) > (BoundaryAddress + 1))
629 return TableFoundNode;
633 if (
Table->NumberGenericTableElements == 0)
637 return TableEmptyTree;
641 HighVpn = (BoundaryAddress + 1) >>
PAGE_SHIFT;
646 while ((
Node->EndingVpn < HighVpn) &&
656 if ((HighVpn > LowVpn) && ((HighVpn - LowVpn) >= PageCount))
667 return TableInsertAsRight;
680 return TableInsertAsLeft;
685 if (
Node->StartingVpn < HighVpn) HighVpn =
Node->StartingVpn;
694 if ((HighVpn > LowVpn) && ((HighVpn - LowVpn) >= PageCount))
700 return TableInsertAsLeft;
706 return TableFoundNode;
733 if (
Table->NumberGenericTableElements == 0)
746 if ((LowVpn < BoundaryAddress) && (
Length <= (BoundaryAddress - LowVpn)))
748#if (NTDDI_VERSION >= NTDDI_VISTA)
765 if (!LowestNode)
break;
770 (LowVpn < Node->StartingVpn) &&
774 if (BoundaryAddress < Node->StartingVpn)
797 if (BoundaryAddress < Node->StartingVpn)
824 EndAddress = StartAddress +
Size - 1;
830 if ((Vad->u.VadFlags.NoChange == 1) &&
831 (Vad->u2.VadFlags2.SecNoChange == 1) &&
832 (Vad->u.VadFlags.Protection != ProtectionMask))
835 DPRINT1(
"Trying to mess with a no-change VAD!\n");
846 ASSERT(Vad->u2.VadFlags2.MultipleSecured == 0);
849 if (Vad->u2.VadFlags2.OneSecured)
852 if ((StartAddress <= ((
PMMVAD_LONG)Vad)->
u3.Secured.EndVpn) &&
853 (EndAddress >= ((
PMMVAD_LONG)Vad)->u3.Secured.StartVpn))
858 DPRINT1(
"Not allowed to change protection on guard page!\n");
868 DPRINT1(
"Invalid protection mask for RW access!\n");
#define ALIGN_DOWN_BY(size, align)
#define ALIGN_UP_BY(size, align)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
#define MM_LOWEST_USER_ADDRESS
#define PsGetCurrentThread()
#define ROUND_UP(n, align)
#define ROUND_DOWN(n, align)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
#define KeGetCurrentThread
KGUARDED_MUTEX MmSectionBasedMutex
#define MI_LOWEST_VAD_ADDRESS
#define MM_READ_WRITE_ALLOWED
#define MM_NO_ACCESS_ALLOWED
FORCEINLINE VOID MiUnlockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
#define MM_READ_ONLY_ALLOWED
FORCEINLINE BOOLEAN MI_WS_OWNER(IN PEPROCESS Process)
MM_AVL_TABLE MmSectionBasedRoot
FORCEINLINE VOID MiLockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
#define RtlpFindAvlTableNodeOrParent
#define RtlIsRightChildAvl
#define RtlpInsertAvlTreeNode
#define RtlIsLeftChildAvl
#define RtlpDeleteAvlTreeNode
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG AllocationType
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T ViewSize
struct _MMVAD_LONG * PMMVAD_LONG
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define MM_HIGHEST_VAD_ADDRESS
#define MmSystemRangeStart
#define STATUS_PROCESS_IS_TERMINATING
#define STATUS_CONFLICTING_ADDRESSES
#define STATUS_INVALID_PAGE_PROTECTION
EX_PUSH_LOCK AddressCreationLock
union _MMVAD_LONG::@2715 u2
#define CONTAINING_RECORD(address, type, field)
VOID NTAPI MiInsertBasedSection(IN PSECTION Section)
VOID NTAPI MiRemoveNode(IN PMMADDRESS_NODE Node, IN PMM_AVL_TABLE Table)
PMMVAD NTAPI MiLocateVad(_In_ PMM_AVL_TABLE Table, _In_ PVOID VirtualAddress)
MM_AVL_TABLE MiRosKernelVadRoot
NTSTATUS NTAPI MiFindEmptyAddressRangeDownBasedTree(IN SIZE_T Length, IN ULONG_PTR BoundaryAddress, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PULONG_PTR Base)
VOID NTAPI MiInsertVad(IN PMMVAD Vad, IN PMM_AVL_TABLE VadRoot)
PMMADDRESS_NODE NTAPI MiGetPreviousNode(IN PMMADDRESS_NODE Node)
VOID NTAPI MiInsertNode(IN PMM_AVL_TABLE Table, IN PMMADDRESS_NODE NewNode, IN PMMADDRESS_NODE Parent, IN TABLE_SEARCH_RESULT Result)
#define ASSERT_LOCKED_FOR_READ(Table)
NTSTATUS NTAPI MiInsertVadEx(_Inout_ PMMVAD Vad, _In_ ULONG_PTR *BaseAddress, _In_ SIZE_T ViewSize, _In_ ULONG_PTR HighestAddress, _In_ ULONG_PTR Alignment, _In_ ULONG AllocationType)
TABLE_SEARCH_RESULT NTAPI MiFindEmptyAddressRangeDownTree(IN SIZE_T Length, IN ULONG_PTR BoundaryAddress, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PULONG_PTR Base, OUT PMMADDRESS_NODE *Parent)
NTSTATUS NTAPI MiCheckSecuredVad(IN PMMVAD Vad, IN PVOID Base, IN SIZE_T Size, IN ULONG ProtectionMask)
TABLE_SEARCH_RESULT NTAPI MiFindEmptyAddressRangeInTree(IN SIZE_T Length, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *PreviousVad, OUT PULONG_PTR Base)
#define ASSERT_LOCKED_FOR_WRITE(Table)
TABLE_SEARCH_RESULT NTAPI MiCheckForConflictingNode(IN ULONG_PTR StartVpn, IN ULONG_PTR EndVpn, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *NodeOrParent)
PMMADDRESS_NODE NTAPI MiGetNextNode(IN PMMADDRESS_NODE Node)
PMMVAD NTAPI MiLocateAddress(_In_ PVOID VirtualAddress)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDMATRANSACTION _In_ PFN_WDF_PROGRAM_DMA _In_ WDF_DMA_DIRECTION _In_ PMDL _In_ PVOID VirtualAddress
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
_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
#define ROUND_TO_PAGES(Size)
#define BYTES_TO_PAGES(Size)
#define PsGetCurrentProcess