mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
[NTOS]: Delete anonmem.c and move the ARM3-compatible code to ARM3/virtual.c. Whatever remained is for sections only, so move it to mm/section.c
[NTOS]: Fix some broken assertions in NtFreeVirtualMemory. Lesson: Do not try to "optimize" Microsoft's ASSERTs. svn path=/trunk/; revision=55982
This commit is contained in:
parent
2d534ce868
commit
9732b09bc6
6 changed files with 1737 additions and 2070 deletions
|
@ -223,7 +223,6 @@ list(APPEND SOURCE
|
||||||
mm/ARM3/vadnode.c
|
mm/ARM3/vadnode.c
|
||||||
mm/ARM3/virtual.c
|
mm/ARM3/virtual.c
|
||||||
mm/ARM3/zeropage.c
|
mm/ARM3/zeropage.c
|
||||||
mm/anonmem.c
|
|
||||||
mm/balance.c
|
mm/balance.c
|
||||||
mm/freelist.c
|
mm/freelist.c
|
||||||
mm/marea.c
|
mm/marea.c
|
||||||
|
|
|
@ -1126,6 +1126,16 @@ MiSyncARM3WithROS(
|
||||||
IN PVOID AddressEnd
|
IN PVOID AddressEnd
|
||||||
);
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
MiRosProtectVirtualMemory(
|
||||||
|
IN PEPROCESS Process,
|
||||||
|
IN OUT PVOID *BaseAddress,
|
||||||
|
IN OUT PSIZE_T NumberOfBytesToProtect,
|
||||||
|
IN ULONG NewAccessProtection,
|
||||||
|
OUT PULONG OldAccessProtection OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
MmArmAccessFault(
|
MmArmAccessFault(
|
||||||
|
@ -1484,6 +1494,30 @@ MiLocateSubsection(
|
||||||
IN ULONG_PTR Vpn
|
IN ULONG_PTR Vpn
|
||||||
);
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
MiQueryMemorySectionName(
|
||||||
|
IN HANDLE ProcessHandle,
|
||||||
|
IN PVOID BaseAddress,
|
||||||
|
OUT PVOID MemoryInformation,
|
||||||
|
IN SIZE_T MemoryInformationLength,
|
||||||
|
OUT PSIZE_T ReturnLength
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
MiRosAllocateVirtualMemory(
|
||||||
|
IN HANDLE ProcessHandle,
|
||||||
|
IN PEPROCESS Process,
|
||||||
|
IN PMEMORY_AREA MemoryArea,
|
||||||
|
IN PMMSUPPORT AddressSpace,
|
||||||
|
IN OUT PVOID* UBaseAddress,
|
||||||
|
IN BOOLEAN Attached,
|
||||||
|
IN OUT PSIZE_T URegionSize,
|
||||||
|
IN ULONG AllocationType,
|
||||||
|
IN ULONG Protect
|
||||||
|
);
|
||||||
|
|
||||||
POOL_TYPE
|
POOL_TYPE
|
||||||
NTAPI
|
NTAPI
|
||||||
MmDeterminePoolType(
|
MmDeterminePoolType(
|
||||||
|
|
|
@ -1130,6 +1130,71 @@ NotSection:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
MiQueryMemorySectionName(IN HANDLE ProcessHandle,
|
||||||
|
IN PVOID BaseAddress,
|
||||||
|
OUT PVOID MemoryInformation,
|
||||||
|
IN SIZE_T MemoryInformationLength,
|
||||||
|
OUT PSIZE_T ReturnLength)
|
||||||
|
{
|
||||||
|
PEPROCESS Process;
|
||||||
|
NTSTATUS Status;
|
||||||
|
WCHAR ModuleFileNameBuffer[MAX_PATH] = {0};
|
||||||
|
UNICODE_STRING ModuleFileName;
|
||||||
|
PMEMORY_SECTION_NAME SectionName = NULL;
|
||||||
|
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
|
||||||
|
|
||||||
|
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||||
|
PROCESS_QUERY_INFORMATION,
|
||||||
|
NULL,
|
||||||
|
PreviousMode,
|
||||||
|
(PVOID*)(&Process),
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT("MiQueryMemorySectionName: ObReferenceObjectByHandle returned %x\n",Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlInitEmptyUnicodeString(&ModuleFileName, ModuleFileNameBuffer, sizeof(ModuleFileNameBuffer));
|
||||||
|
Status = MmGetFileNameForAddress(BaseAddress, &ModuleFileName);
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SectionName = MemoryInformation;
|
||||||
|
if (PreviousMode != KernelMode)
|
||||||
|
{
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
RtlInitUnicodeString(&SectionName->SectionFileName, SectionName->NameBuffer);
|
||||||
|
SectionName->SectionFileName.MaximumLength = (USHORT)MemoryInformationLength;
|
||||||
|
RtlCopyUnicodeString(&SectionName->SectionFileName, &ModuleFileName);
|
||||||
|
|
||||||
|
if (ReturnLength) *ReturnLength = ModuleFileName.Length;
|
||||||
|
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RtlInitUnicodeString(&SectionName->SectionFileName, SectionName->NameBuffer);
|
||||||
|
SectionName->SectionFileName.MaximumLength = (USHORT)MemoryInformationLength;
|
||||||
|
RtlCopyUnicodeString(&SectionName->SectionFileName, &ModuleFileName);
|
||||||
|
|
||||||
|
if (ReturnLength) *ReturnLength = ModuleFileName.Length;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ObDereferenceObject(Process);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1376,6 +1441,53 @@ MmMapViewOfArm3Section(IN PVOID SectionObject,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
MmDisableModifiedWriteOfSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
MmForceSectionClosed(IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
||||||
|
IN BOOLEAN DelayClose)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
MmMapViewInSessionSpace(IN PVOID Section,
|
||||||
|
OUT PVOID *MappedBase,
|
||||||
|
IN OUT PSIZE_T ViewSize)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
MmUnmapViewInSessionSpace(IN PVOID MappedBase)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
/* SYSTEM CALLS ***************************************************************/
|
/* SYSTEM CALLS ***************************************************************/
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -1922,53 +2034,4 @@ NtExtendSection(IN HANDLE SectionHandle,
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOLEAN
|
|
||||||
NTAPI
|
|
||||||
MmDisableModifiedWriteOfSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOLEAN
|
|
||||||
NTAPI
|
|
||||||
MmForceSectionClosed(IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
|
||||||
IN BOOLEAN DelayClose)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
MmMapViewInSessionSpace(IN PVOID Section,
|
|
||||||
OUT PVOID *MappedBase,
|
|
||||||
IN OUT PSIZE_T ViewSize)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
MmUnmapViewInSessionSpace(IN PVOID MappedBase)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -5211,4 +5211,133 @@ MmCreateSection (OUT PVOID * Section,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
MmModifyAttributes(IN PMMSUPPORT AddressSpace,
|
||||||
|
IN PVOID BaseAddress,
|
||||||
|
IN SIZE_T RegionSize,
|
||||||
|
IN ULONG OldType,
|
||||||
|
IN ULONG OldProtect,
|
||||||
|
IN ULONG NewType,
|
||||||
|
IN ULONG NewProtect)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// This function is deprecated but remains in order to support VirtualAlloc
|
||||||
|
// calls with MEM_COMMIT on top of MapViewOfFile calls with SEC_RESERVE.
|
||||||
|
//
|
||||||
|
// Win32k's shared user heap, for example, uses that mechanism. The two
|
||||||
|
// conditions when this function needs to do something are ASSERTed for,
|
||||||
|
// because they should not arise.
|
||||||
|
//
|
||||||
|
if (NewType == MEM_RESERVE && OldType == MEM_COMMIT)
|
||||||
|
{
|
||||||
|
ASSERT(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((NewType == MEM_COMMIT) && (OldType == MEM_COMMIT))
|
||||||
|
{
|
||||||
|
ASSERT(OldProtect == NewProtect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
MiRosAllocateVirtualMemory(IN HANDLE ProcessHandle,
|
||||||
|
IN PEPROCESS Process,
|
||||||
|
IN PMEMORY_AREA MemoryArea,
|
||||||
|
IN PMMSUPPORT AddressSpace,
|
||||||
|
IN OUT PVOID* UBaseAddress,
|
||||||
|
IN BOOLEAN Attached,
|
||||||
|
IN OUT PSIZE_T URegionSize,
|
||||||
|
IN ULONG AllocationType,
|
||||||
|
IN ULONG Protect)
|
||||||
|
{
|
||||||
|
ULONG_PTR PRegionSize;
|
||||||
|
ULONG Type, RegionSize;
|
||||||
|
NTSTATUS Status;
|
||||||
|
PVOID PBaseAddress, BaseAddress;
|
||||||
|
KAPC_STATE ApcState;
|
||||||
|
|
||||||
|
PBaseAddress = *UBaseAddress;
|
||||||
|
PRegionSize = *URegionSize;
|
||||||
|
|
||||||
|
BaseAddress = (PVOID)PAGE_ROUND_DOWN(PBaseAddress);
|
||||||
|
RegionSize = PAGE_ROUND_UP((ULONG_PTR)PBaseAddress + PRegionSize) -
|
||||||
|
PAGE_ROUND_DOWN(PBaseAddress);
|
||||||
|
Type = (AllocationType & MEM_COMMIT) ? MEM_COMMIT : MEM_RESERVE;
|
||||||
|
|
||||||
|
ASSERT(PBaseAddress != 0);
|
||||||
|
ASSERT(Type == MEM_COMMIT);
|
||||||
|
ASSERT(MemoryArea->Type == MEMORY_AREA_SECTION_VIEW);
|
||||||
|
ASSERT(((ULONG_PTR)BaseAddress + RegionSize) <= (ULONG_PTR)MemoryArea->EndingAddress);
|
||||||
|
ASSERT(((ULONG_PTR)MemoryArea->EndingAddress - (ULONG_PTR)MemoryArea->StartingAddress) >= RegionSize);
|
||||||
|
ASSERT(MemoryArea->Data.SectionData.RegionListHead.Flink);
|
||||||
|
|
||||||
|
Status = MmAlterRegion(AddressSpace,
|
||||||
|
MemoryArea->StartingAddress,
|
||||||
|
&MemoryArea->Data.SectionData.RegionListHead,
|
||||||
|
BaseAddress,
|
||||||
|
RegionSize,
|
||||||
|
Type,
|
||||||
|
Protect,
|
||||||
|
MmModifyAttributes);
|
||||||
|
|
||||||
|
MmUnlockAddressSpace(AddressSpace);
|
||||||
|
if (Attached) KeUnstackDetachProcess(&ApcState);
|
||||||
|
if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
*UBaseAddress = BaseAddress;
|
||||||
|
*URegionSize = RegionSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
MiRosProtectVirtualMemory(IN PEPROCESS Process,
|
||||||
|
IN OUT PVOID *BaseAddress,
|
||||||
|
IN OUT PSIZE_T NumberOfBytesToProtect,
|
||||||
|
IN ULONG NewAccessProtection,
|
||||||
|
OUT PULONG OldAccessProtection OPTIONAL)
|
||||||
|
{
|
||||||
|
PMEMORY_AREA MemoryArea;
|
||||||
|
PMMSUPPORT AddressSpace;
|
||||||
|
ULONG OldAccessProtection_;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
*NumberOfBytesToProtect = PAGE_ROUND_UP((ULONG_PTR)(*BaseAddress) + (*NumberOfBytesToProtect)) - PAGE_ROUND_DOWN(*BaseAddress);
|
||||||
|
*BaseAddress = (PVOID)PAGE_ROUND_DOWN(*BaseAddress);
|
||||||
|
|
||||||
|
AddressSpace = &Process->Vm;
|
||||||
|
MmLockAddressSpace(AddressSpace);
|
||||||
|
MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, *BaseAddress);
|
||||||
|
if (MemoryArea == NULL || MemoryArea->DeleteInProgress)
|
||||||
|
{
|
||||||
|
MmUnlockAddressSpace(AddressSpace);
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OldAccessProtection == NULL) OldAccessProtection = &OldAccessProtection_;
|
||||||
|
|
||||||
|
if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW)
|
||||||
|
{
|
||||||
|
Status = MmProtectSectionView(AddressSpace,
|
||||||
|
MemoryArea,
|
||||||
|
*BaseAddress,
|
||||||
|
*NumberOfBytesToProtect,
|
||||||
|
NewAccessProtection,
|
||||||
|
OldAccessProtection);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* FIXME: Should we return failure or success in this case? */
|
||||||
|
Status = STATUS_CONFLICTING_ADDRESSES;
|
||||||
|
}
|
||||||
|
|
||||||
|
MmUnlockAddressSpace(AddressSpace);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
Loading…
Reference in a new issue