mirror of
https://github.com/reactos/reactos.git
synced 2025-05-06 18:31:26 +00:00
[NTOS:MM] section.c: some trivial cleanup (#5651)
* [NTOS:MM] section.c: Remove unused functions MiSetControlAreaSymbolsLoaded(), MiLoadUserSymbols(): Added on436edb2
(r60802). Never used. MiSubsectionConsistent(): Added oncda03c0
(r57209). Never used. MiGetFileObjectForSectionAddress(): Added on635d9ca
(r67810). Calls removed on0dfd233
(r68123). MiSetProtectionOnSection(): Added on9f28638
(r56317). Never used. Plus, MmCreateArm3Section(): Add an UNIMPLEMENTED on a specific case. * [NTOS:MM] section.c: Use static instead of NTAPI for local functions
This commit is contained in:
parent
2198247bdf
commit
a6298b5c7a
2 changed files with 15 additions and 397 deletions
|
@ -2242,14 +2242,6 @@ MiInsertBasedSection(
|
||||||
IN PSECTION Section
|
IN PSECTION Section
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
MiUnmapViewOfSection(
|
|
||||||
IN PEPROCESS Process,
|
|
||||||
IN PVOID BaseAddress,
|
|
||||||
IN ULONG Flags
|
|
||||||
);
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
MiRosUnmapViewOfSection(
|
MiRosUnmapViewOfSection(
|
||||||
|
@ -2310,13 +2302,6 @@ MiSessionAddProcess(
|
||||||
IN PEPROCESS NewProcess
|
IN PEPROCESS NewProcess
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
MiSessionCommitPageTables(
|
|
||||||
IN PVOID StartVa,
|
|
||||||
IN PVOID EndVa
|
|
||||||
);
|
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
NTAPI
|
NTAPI
|
||||||
MiMakeProtectionMask(
|
MiMakeProtectionMask(
|
||||||
|
|
|
@ -112,8 +112,8 @@ PVOID MmHighSectionBase;
|
||||||
|
|
||||||
/* PRIVATE FUNCTIONS **********************************************************/
|
/* PRIVATE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
|
static
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
NTAPI
|
|
||||||
MiIsProtectionCompatible(IN ULONG SectionPageProtection,
|
MiIsProtectionCompatible(IN ULONG SectionPageProtection,
|
||||||
IN ULONG NewSectionPageProtection)
|
IN ULONG NewSectionPageProtection)
|
||||||
{
|
{
|
||||||
|
@ -283,8 +283,8 @@ MiInitializeSystemSpaceMap(IN PMMSESSION InputSession OPTIONAL)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
PVOID
|
PVOID
|
||||||
NTAPI
|
|
||||||
MiInsertInSystemSpace(IN PMMSESSION Session,
|
MiInsertInSystemSpace(IN PMMSESSION Session,
|
||||||
IN ULONG Buckets,
|
IN ULONG Buckets,
|
||||||
IN PCONTROL_AREA ControlArea)
|
IN PCONTROL_AREA ControlArea)
|
||||||
|
@ -525,8 +525,8 @@ MiFillSystemPageDirectory(IN PVOID Base,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
|
||||||
MiCheckPurgeAndUpMapCount(IN PCONTROL_AREA ControlArea,
|
MiCheckPurgeAndUpMapCount(IN PCONTROL_AREA ControlArea,
|
||||||
IN BOOLEAN FailIfSystemViews)
|
IN BOOLEAN FailIfSystemViews)
|
||||||
{
|
{
|
||||||
|
@ -586,8 +586,8 @@ MiLocateSubsection(IN PMMVAD Vad,
|
||||||
return Subsection;
|
return Subsection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
|
||||||
MiSegmentDelete(IN PSEGMENT Segment)
|
MiSegmentDelete(IN PSEGMENT Segment)
|
||||||
{
|
{
|
||||||
PCONTROL_AREA ControlArea;
|
PCONTROL_AREA ControlArea;
|
||||||
|
@ -709,8 +709,8 @@ MiSegmentDelete(IN PSEGMENT Segment)
|
||||||
ExFreePool(Segment);
|
ExFreePool(Segment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
|
||||||
MiCheckControlArea(IN PCONTROL_AREA ControlArea,
|
MiCheckControlArea(IN PCONTROL_AREA ControlArea,
|
||||||
IN KIRQL OldIrql)
|
IN KIRQL OldIrql)
|
||||||
{
|
{
|
||||||
|
@ -744,8 +744,8 @@ MiCheckControlArea(IN PCONTROL_AREA ControlArea,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
|
||||||
MiDereferenceControlArea(IN PCONTROL_AREA ControlArea)
|
MiDereferenceControlArea(IN PCONTROL_AREA ControlArea)
|
||||||
{
|
{
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
@ -798,8 +798,8 @@ MiRemoveMappedView(IN PEPROCESS CurrentProcess,
|
||||||
MiCheckControlArea(ControlArea, OldIrql);
|
MiCheckControlArea(ControlArea, OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
|
||||||
MiUnmapViewOfSection(IN PEPROCESS Process,
|
MiUnmapViewOfSection(IN PEPROCESS Process,
|
||||||
IN PVOID BaseAddress,
|
IN PVOID BaseAddress,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
|
@ -919,8 +919,8 @@ Quickie:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
|
||||||
MiSessionCommitPageTables(IN PVOID StartVa,
|
MiSessionCommitPageTables(IN PVOID StartVa,
|
||||||
IN PVOID EndVa)
|
IN PVOID EndVa)
|
||||||
{
|
{
|
||||||
|
@ -1147,120 +1147,8 @@ MiMapViewInSystemSpace(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
static
|
||||||
NTAPI
|
|
||||||
MiSetControlAreaSymbolsLoaded(IN PCONTROL_AREA ControlArea)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql;
|
|
||||||
|
|
||||||
ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
|
|
||||||
|
|
||||||
OldIrql = MiAcquirePfnLock();
|
|
||||||
ControlArea->u.Flags.DebugSymbolsLoaded |= 1;
|
|
||||||
|
|
||||||
ASSERT(OldIrql <= APC_LEVEL);
|
|
||||||
MiReleasePfnLock(OldIrql);
|
|
||||||
ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
MiLoadUserSymbols(IN PCONTROL_AREA ControlArea,
|
|
||||||
IN PVOID BaseAddress,
|
|
||||||
IN PEPROCESS Process)
|
|
||||||
{
|
|
||||||
NTSTATUS Status;
|
|
||||||
ANSI_STRING FileNameA;
|
|
||||||
PLIST_ENTRY NextEntry;
|
|
||||||
PUNICODE_STRING FileName;
|
|
||||||
PIMAGE_NT_HEADERS NtHeaders;
|
|
||||||
PLDR_DATA_TABLE_ENTRY LdrEntry;
|
|
||||||
|
|
||||||
FileName = &ControlArea->FilePointer->FileName;
|
|
||||||
if (FileName->Length == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Acquire module list lock */
|
|
||||||
KeEnterCriticalRegion();
|
|
||||||
ExAcquireResourceExclusiveLite(&PsLoadedModuleResource, TRUE);
|
|
||||||
|
|
||||||
/* Browse list to try to find current module */
|
|
||||||
for (NextEntry = MmLoadedUserImageList.Flink;
|
|
||||||
NextEntry != &MmLoadedUserImageList;
|
|
||||||
NextEntry = NextEntry->Flink)
|
|
||||||
{
|
|
||||||
/* Get the entry */
|
|
||||||
LdrEntry = CONTAINING_RECORD(NextEntry,
|
|
||||||
LDR_DATA_TABLE_ENTRY,
|
|
||||||
InLoadOrderLinks);
|
|
||||||
|
|
||||||
/* If already in the list, increase load count */
|
|
||||||
if (LdrEntry->DllBase == BaseAddress)
|
|
||||||
{
|
|
||||||
++LdrEntry->LoadCount;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Not in the list, we'll add it */
|
|
||||||
if (NextEntry == &MmLoadedUserImageList)
|
|
||||||
{
|
|
||||||
/* Allocate our element, taking to the name string and its null char */
|
|
||||||
LdrEntry = ExAllocatePoolWithTag(NonPagedPool, FileName->Length + sizeof(UNICODE_NULL) + sizeof(*LdrEntry), 'bDmM');
|
|
||||||
if (LdrEntry)
|
|
||||||
{
|
|
||||||
memset(LdrEntry, 0, FileName->Length + sizeof(UNICODE_NULL) + sizeof(*LdrEntry));
|
|
||||||
|
|
||||||
_SEH2_TRY
|
|
||||||
{
|
|
||||||
/* Get image checksum and size */
|
|
||||||
NtHeaders = RtlImageNtHeader(BaseAddress);
|
|
||||||
if (NtHeaders)
|
|
||||||
{
|
|
||||||
LdrEntry->SizeOfImage = NtHeaders->OptionalHeader.SizeOfImage;
|
|
||||||
LdrEntry->CheckSum = NtHeaders->OptionalHeader.CheckSum;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
|
||||||
{
|
|
||||||
ExFreePoolWithTag(LdrEntry, 'bDmM');
|
|
||||||
ExReleaseResourceLite(&PsLoadedModuleResource);
|
|
||||||
KeLeaveCriticalRegion();
|
|
||||||
_SEH2_YIELD(return);
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
|
|
||||||
/* Fill all the details */
|
|
||||||
LdrEntry->DllBase = BaseAddress;
|
|
||||||
LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry + sizeof(*LdrEntry));
|
|
||||||
LdrEntry->FullDllName.Length = FileName->Length;
|
|
||||||
LdrEntry->FullDllName.MaximumLength = FileName->Length + sizeof(UNICODE_NULL);
|
|
||||||
memcpy(LdrEntry->FullDllName.Buffer, FileName->Buffer, FileName->Length);
|
|
||||||
LdrEntry->FullDllName.Buffer[LdrEntry->FullDllName.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
|
||||||
LdrEntry->LoadCount = 1;
|
|
||||||
|
|
||||||
/* Insert! */
|
|
||||||
InsertHeadList(&MmLoadedUserImageList, &LdrEntry->InLoadOrderLinks);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release locks */
|
|
||||||
ExReleaseResourceLite(&PsLoadedModuleResource);
|
|
||||||
KeLeaveCriticalRegion();
|
|
||||||
|
|
||||||
/* Load symbols */
|
|
||||||
Status = RtlUnicodeStringToAnsiString(&FileNameA, FileName, TRUE);
|
|
||||||
if (NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DbgLoadImageSymbols(&FileNameA, BaseAddress, (ULONG_PTR)Process->UniqueProcessId);
|
|
||||||
RtlFreeAnsiString(&FileNameA);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
|
||||||
MiMapViewOfDataSection(IN PCONTROL_AREA ControlArea,
|
MiMapViewOfDataSection(IN PCONTROL_AREA ControlArea,
|
||||||
IN PEPROCESS Process,
|
IN PEPROCESS Process,
|
||||||
IN PVOID *BaseAddress,
|
IN PVOID *BaseAddress,
|
||||||
|
@ -1514,25 +1402,8 @@ MiMapViewOfDataSection(IN PCONTROL_AREA ControlArea,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
static
|
||||||
NTAPI
|
|
||||||
MiSubsectionConsistent(IN PSUBSECTION Subsection)
|
|
||||||
{
|
|
||||||
/* ReactOS only supports systems with 4K pages and 4K sectors */
|
|
||||||
ASSERT(Subsection->u.SubsectionFlags.SectorEndOffset == 0);
|
|
||||||
|
|
||||||
/* Therefore, then number of PTEs should be equal to the number of sectors */
|
|
||||||
if (Subsection->NumberOfFullSectors != Subsection->PtesInSubsection)
|
|
||||||
{
|
|
||||||
/* Break and warn if this is inconsistent */
|
|
||||||
DPRINT1("Mm: Subsection inconsistent (%x vs %x)\n",
|
|
||||||
Subsection->NumberOfFullSectors, Subsection->PtesInSubsection);
|
|
||||||
DbgBreakPoint();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
|
||||||
MiCreateDataFileMap(IN PFILE_OBJECT File,
|
MiCreateDataFileMap(IN PFILE_OBJECT File,
|
||||||
OUT PSEGMENT *Segment,
|
OUT PSEGMENT *Segment,
|
||||||
IN PSIZE_T MaximumSize,
|
IN PSIZE_T MaximumSize,
|
||||||
|
@ -1548,7 +1419,6 @@ MiCreateDataFileMap(IN PFILE_OBJECT File,
|
||||||
|
|
||||||
static
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
|
||||||
MiCreatePagingFileMap(OUT PSEGMENT *Segment,
|
MiCreatePagingFileMap(OUT PSEGMENT *Segment,
|
||||||
IN PLARGE_INTEGER MaximumSize,
|
IN PLARGE_INTEGER MaximumSize,
|
||||||
IN ULONG ProtectionMask,
|
IN ULONG ProtectionMask,
|
||||||
|
@ -1666,72 +1536,6 @@ MiCreatePagingFileMap(OUT PSEGMENT *Segment,
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
MiGetFileObjectForSectionAddress(
|
|
||||||
IN PVOID Address,
|
|
||||||
OUT PFILE_OBJECT *FileObject)
|
|
||||||
{
|
|
||||||
PMMVAD Vad;
|
|
||||||
PCONTROL_AREA ControlArea;
|
|
||||||
|
|
||||||
/* Get the VAD */
|
|
||||||
Vad = MiLocateAddress(Address);
|
|
||||||
if (Vad == NULL)
|
|
||||||
{
|
|
||||||
/* Fail, the address does not exist */
|
|
||||||
DPRINT1("Invalid address\n");
|
|
||||||
return STATUS_INVALID_ADDRESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if this is a RosMm memory area */
|
|
||||||
if (Vad->u.VadFlags.Spare != 0)
|
|
||||||
{
|
|
||||||
PMEMORY_AREA MemoryArea = (PMEMORY_AREA)Vad;
|
|
||||||
|
|
||||||
/* Check if it's a section view (RosMm section) */
|
|
||||||
if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW)
|
|
||||||
{
|
|
||||||
/* Get the section pointer to the SECTION_OBJECT */
|
|
||||||
*FileObject = MemoryArea->SectionData.Segment->FileObject;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef NEWCC
|
|
||||||
ASSERT(MemoryArea->Type == MEMORY_AREA_CACHE);
|
|
||||||
DPRINT1("Address is a cache section!\n");
|
|
||||||
return STATUS_SECTION_NOT_IMAGE;
|
|
||||||
#else
|
|
||||||
ASSERT(FALSE);
|
|
||||||
return STATUS_SECTION_NOT_IMAGE;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Make sure it's not a VM VAD */
|
|
||||||
if (Vad->u.VadFlags.PrivateMemory == 1)
|
|
||||||
{
|
|
||||||
DPRINT1("Address is not a section\n");
|
|
||||||
return STATUS_SECTION_NOT_IMAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the control area */
|
|
||||||
ControlArea = Vad->ControlArea;
|
|
||||||
if (!(ControlArea) || !(ControlArea->u.Flags.Image))
|
|
||||||
{
|
|
||||||
DPRINT1("Address is not a section\n");
|
|
||||||
return STATUS_SECTION_NOT_IMAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the file object */
|
|
||||||
*FileObject = ControlArea->FilePointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return success */
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
PFILE_OBJECT
|
PFILE_OBJECT
|
||||||
NTAPI
|
NTAPI
|
||||||
MmGetFileObjectForSection(IN PVOID SectionObject)
|
MmGetFileObjectForSection(IN PVOID SectionObject)
|
||||||
|
@ -1827,8 +1631,8 @@ MmGetImageInformation (OUT PSECTION_IMAGE_INFORMATION ImageInformation)
|
||||||
*ImageInformation = ((PMM_IMAGE_SECTION_OBJECT)SectionObject->Segment)->ImageInformation;
|
*ImageInformation = ((PMM_IMAGE_SECTION_OBJECT)SectionObject->Segment)->ImageInformation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
|
||||||
MmGetFileNameForFileObject(IN PFILE_OBJECT FileObject,
|
MmGetFileNameForFileObject(IN PFILE_OBJECT FileObject,
|
||||||
OUT POBJECT_NAME_INFORMATION *ModuleName)
|
OUT POBJECT_NAME_INFORMATION *ModuleName)
|
||||||
{
|
{
|
||||||
|
@ -2111,180 +1915,8 @@ MiFlushTbAndCapture(IN PMMVAD FoundVad,
|
||||||
MiReleasePfnLock(OldIrql);
|
MiReleasePfnLock(OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
static
|
||||||
// NOTE: This function gets a lot more complicated if we want Copy-on-Write support
|
|
||||||
//
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
MiSetProtectionOnSection(IN PEPROCESS Process,
|
|
||||||
IN PMMVAD FoundVad,
|
|
||||||
IN PVOID StartingAddress,
|
|
||||||
IN PVOID EndingAddress,
|
|
||||||
IN ULONG NewProtect,
|
|
||||||
OUT PULONG CapturedOldProtect,
|
|
||||||
IN ULONG DontCharge,
|
|
||||||
OUT PULONG Locked)
|
|
||||||
{
|
|
||||||
PMMPTE PointerPte, LastPte;
|
|
||||||
MMPTE TempPte, PteContents;
|
|
||||||
PMMPDE PointerPde;
|
|
||||||
PMMPFN Pfn1;
|
|
||||||
ULONG ProtectionMask, QuotaCharge = 0;
|
|
||||||
PETHREAD Thread = PsGetCurrentThread();
|
|
||||||
PAGED_CODE();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Tell caller nothing is being locked
|
|
||||||
//
|
|
||||||
*Locked = FALSE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// This function should only be used for section VADs. Windows ASSERT */
|
|
||||||
//
|
|
||||||
ASSERT(FoundVad->u.VadFlags.PrivateMemory == 0);
|
|
||||||
|
|
||||||
//
|
|
||||||
// We don't support these features in ARM3
|
|
||||||
//
|
|
||||||
ASSERT(FoundVad->u.VadFlags.VadType != VadImageMap);
|
|
||||||
ASSERT(FoundVad->u2.VadFlags2.CopyOnWrite == 0);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Convert and validate the protection mask
|
|
||||||
//
|
|
||||||
ProtectionMask = MiMakeProtectionMask(NewProtect);
|
|
||||||
if (ProtectionMask == MM_INVALID_PROTECTION)
|
|
||||||
{
|
|
||||||
DPRINT1("Invalid section protect\n");
|
|
||||||
return STATUS_INVALID_PAGE_PROTECTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get the PTE and PDE for the address, as well as the final PTE
|
|
||||||
//
|
|
||||||
MiLockProcessWorkingSetUnsafe(Process, Thread);
|
|
||||||
PointerPde = MiAddressToPde(StartingAddress);
|
|
||||||
PointerPte = MiAddressToPte(StartingAddress);
|
|
||||||
LastPte = MiAddressToPte(EndingAddress);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Make the PDE valid, and check the status of the first PTE
|
|
||||||
//
|
|
||||||
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
|
|
||||||
if (PointerPte->u.Long)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Not supported in ARM3
|
|
||||||
//
|
|
||||||
ASSERT(FoundVad->u.VadFlags.VadType != VadRotatePhysical);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Capture the page protection and make the PDE valid
|
|
||||||
//
|
|
||||||
*CapturedOldProtect = MiGetPageProtection(PointerPte);
|
|
||||||
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Only pagefile-backed section VADs are supported for now
|
|
||||||
//
|
|
||||||
ASSERT(FoundVad->u.VadFlags.VadType != VadImageMap);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Grab the old protection from the VAD itself
|
|
||||||
//
|
|
||||||
*CapturedOldProtect = MmProtectToValue[FoundVad->u.VadFlags.Protection];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Loop all the PTEs now
|
|
||||||
//
|
|
||||||
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
|
|
||||||
while (PointerPte <= LastPte)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Check if we've crossed a PDE boundary and make the new PDE valid too
|
|
||||||
//
|
|
||||||
if (MiIsPteOnPdeBoundary(PointerPte))
|
|
||||||
{
|
|
||||||
PointerPde = MiPteToPde(PointerPte);
|
|
||||||
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Capture the PTE and see what we're dealing with
|
|
||||||
//
|
|
||||||
PteContents = *PointerPte;
|
|
||||||
if (PteContents.u.Long == 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// This used to be a zero PTE and it no longer is, so we must add a
|
|
||||||
// reference to the pagetable.
|
|
||||||
//
|
|
||||||
MiIncrementPageTableReferences(MiPteToAddress(PointerPte));
|
|
||||||
|
|
||||||
//
|
|
||||||
// Create the demand-zero prototype PTE
|
|
||||||
//
|
|
||||||
TempPte = PrototypePte;
|
|
||||||
TempPte.u.Soft.Protection = ProtectionMask;
|
|
||||||
MI_WRITE_INVALID_PTE(PointerPte, TempPte);
|
|
||||||
}
|
|
||||||
else if (PteContents.u.Hard.Valid == 1)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Get the PFN entry
|
|
||||||
//
|
|
||||||
Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(&PteContents));
|
|
||||||
|
|
||||||
//
|
|
||||||
// We don't support these yet
|
|
||||||
//
|
|
||||||
ASSERT((NewProtect & (PAGE_NOACCESS | PAGE_GUARD)) == 0);
|
|
||||||
ASSERT(Pfn1->u3.e1.PrototypePte == 0);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Write the protection mask and write it with a TLB flush
|
|
||||||
//
|
|
||||||
Pfn1->OriginalPte.u.Soft.Protection = ProtectionMask;
|
|
||||||
MiFlushTbAndCapture(FoundVad,
|
|
||||||
PointerPte,
|
|
||||||
ProtectionMask,
|
|
||||||
Pfn1,
|
|
||||||
TRUE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// We don't support these cases yet
|
|
||||||
//
|
|
||||||
ASSERT(PteContents.u.Soft.Prototype == 0);
|
|
||||||
ASSERT(PteContents.u.Soft.Transition == 0);
|
|
||||||
|
|
||||||
//
|
|
||||||
// The PTE is already demand-zero, just update the protection mask
|
|
||||||
//
|
|
||||||
PointerPte->u.Soft.Protection = ProtectionMask;
|
|
||||||
}
|
|
||||||
|
|
||||||
PointerPte++;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Unlock the working set and update quota charges if needed, then return
|
|
||||||
//
|
|
||||||
MiUnlockProcessWorkingSetUnsafe(Process, Thread);
|
|
||||||
if ((QuotaCharge > 0) && (!DontCharge))
|
|
||||||
{
|
|
||||||
FoundVad->u.VadFlags.CommitCharge -= QuotaCharge;
|
|
||||||
Process->CommitCharge -= QuotaCharge;
|
|
||||||
}
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
|
||||||
MiRemoveMappedPtes(IN PVOID BaseAddress,
|
MiRemoveMappedPtes(IN PVOID BaseAddress,
|
||||||
IN ULONG NumberOfPtes,
|
IN ULONG NumberOfPtes,
|
||||||
IN PCONTROL_AREA ControlArea,
|
IN PCONTROL_AREA ControlArea,
|
||||||
|
@ -2385,8 +2017,8 @@ MiRemoveMappedPtes(IN PVOID BaseAddress,
|
||||||
MiCheckControlArea(ControlArea, OldIrql);
|
MiCheckControlArea(ControlArea, OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
ULONG
|
ULONG
|
||||||
NTAPI
|
|
||||||
MiRemoveFromSystemSpace(IN PMMSESSION Session,
|
MiRemoveFromSystemSpace(IN PMMSESSION Session,
|
||||||
IN PVOID Base,
|
IN PVOID Base,
|
||||||
OUT PCONTROL_AREA *ControlArea)
|
OUT PCONTROL_AREA *ControlArea)
|
||||||
|
@ -2429,8 +2061,8 @@ MiRemoveFromSystemSpace(IN PMMSESSION Session,
|
||||||
return Size;
|
return Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
|
||||||
MiUnmapViewInSystemSpace(IN PMMSESSION Session,
|
MiUnmapViewInSystemSpace(IN PMMSESSION Session,
|
||||||
IN PVOID MappedBase)
|
IN PVOID MappedBase)
|
||||||
{
|
{
|
||||||
|
@ -2569,6 +2201,7 @@ MmCreateArm3Section(OUT PVOID *SectionObject,
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* ReactOS doesn't support this API yet, so do nothing */
|
/* ReactOS doesn't support this API yet, so do nothing */
|
||||||
|
UNIMPLEMENTED;
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
#endif
|
#endif
|
||||||
/* Update the top-level IRP so that drivers know what's happening */
|
/* Update the top-level IRP so that drivers know what's happening */
|
||||||
|
|
Loading…
Reference in a new issue