/* GLOBALS *****************************************************************/
-PVOID EXPORTED MmUserProbeAddress = NULL;
+PVOID EXPORTED MmUserProbeAddress = NULL;
PVOID EXPORTED MmHighestUserAddress = NULL;
-MM_STATS MmStats;
+
+PVOID MmSystemRangeStart = NULL;
+MM_STATS MmStats;
/* FUNCTIONS ****************************************************************/
break;
case MEMORY_AREA_SHARED_DATA:
+ case MEMORY_AREA_NO_ACCESS:
Status = MmFreeMemoryArea(&Process->AddressSpace,
Marea->BaseAddress,
0,
NULL,
NULL);
break;
-
default:
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
return(STATUS_SUCCESS);
MmLockAddressSpace(&Process->AddressSpace);
- CurrentEntry = Process->AddressSpace.MAreaListHead.Flink;
- while (CurrentEntry != &Process->AddressSpace.MAreaListHead)
+ while(!IsListEmpty(&Process->AddressSpace.MAreaListHead))
{
- Current = CONTAINING_RECORD(CurrentEntry, MEMORY_AREA, Entry);
- CurrentEntry = CurrentEntry->Flink;
-
- MmReleaseMemoryArea(Process, Current);
+ CurrentEntry = Process->AddressSpace.MAreaListHead.Flink;
+ Current = CONTAINING_RECORD(CurrentEntry, MEMORY_AREA, Entry);
+ MmReleaseMemoryArea(Process, Current);
}
Mmi386ReleaseMmInfo(Process);
return(STATUS_SUCCESS);
}
+/*
+ * @unimplemented
+ */
BOOLEAN STDCALL MmIsNonPagedSystemAddressValid(PVOID VirtualAddress)
{
UNIMPLEMENTED;
+ return FALSE;
}
+/*
+ * @implemented
+ */
BOOLEAN STDCALL MmIsAddressValid(PVOID VirtualAddress)
/*
* FUNCTION: Checks whether the given address is valid for a read or write
MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace,
VirtualAddress);
- if (MemoryArea == NULL)
+ if (MemoryArea == NULL || MemoryArea->DeleteInProgress)
{
MmUnlockAddressSpace(AddressSpace);
return(FALSE);
{
MmLockAddressSpace(AddressSpace);
}
- MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, (PVOID)Address);
- if (MemoryArea == NULL)
+ do
{
- DbgPrint("%s:%d\n",__FILE__,__LINE__);
- if (!FromMdl)
- {
- MmUnlockAddressSpace(AddressSpace);
- }
- return(STATUS_UNSUCCESSFUL);
- }
+ MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, (PVOID)Address);
+ if (MemoryArea == NULL || MemoryArea->DeleteInProgress)
+ {
+ if (!FromMdl)
+ {
+ MmUnlockAddressSpace(AddressSpace);
+ }
+ return (STATUS_UNSUCCESSFUL);
+ }
- switch (MemoryArea->Type)
- {
- case MEMORY_AREA_SYSTEM:
- Status = STATUS_UNSUCCESSFUL;
- break;
-
- case MEMORY_AREA_PAGED_POOL:
- Status = STATUS_SUCCESS;
- break;
-
- case MEMORY_AREA_SECTION_VIEW:
- Status = MmAccessFaultSectionView(AddressSpace,
- MemoryArea,
- (PVOID)Address,
- Locked);
- break;
-
- case MEMORY_AREA_VIRTUAL_MEMORY:
- Status = STATUS_UNSUCCESSFUL;
- break;
-
- case MEMORY_AREA_SHARED_DATA:
- Status = STATUS_UNSUCCESSFUL;
- break;
-
- default:
- Status = STATUS_UNSUCCESSFUL;
- break;
+ switch (MemoryArea->Type)
+ {
+ case MEMORY_AREA_SYSTEM:
+ Status = STATUS_UNSUCCESSFUL;
+ break;
+
+ case MEMORY_AREA_PAGED_POOL:
+ Status = STATUS_SUCCESS;
+ break;
+
+ case MEMORY_AREA_SECTION_VIEW:
+ Status = MmAccessFaultSectionView(AddressSpace,
+ MemoryArea,
+ (PVOID)Address,
+ Locked);
+ break;
+
+ case MEMORY_AREA_VIRTUAL_MEMORY:
+ Status = STATUS_UNSUCCESSFUL;
+ break;
+
+ case MEMORY_AREA_SHARED_DATA:
+ Status = STATUS_UNSUCCESSFUL;
+ break;
+
+ default:
+ Status = STATUS_UNSUCCESSFUL;
+ break;
+ }
}
+ while (Status == STATUS_MM_RESTART_OPERATION);
+
DPRINT("Completed page fault handling\n");
if (!FromMdl)
{
do
{
MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, (PVOID)Address);
- if (MemoryArea == NULL)
+ if (MemoryArea == NULL || MemoryArea->DeleteInProgress)
{
if (!FromMdl)
{
/* Miscellanea functions: they may fit somewhere else */
+/*
+ * @unimplemented
+ */
DWORD STDCALL
MmAdjustWorkingSetSize (DWORD Unknown0,
DWORD Unknown1,
}
+/*
+ * @unimplemented
+ */
NTSTATUS
STDCALL
MmGrowKernelStack (
}
+/*
+ * @unimplemented
+ */
BOOLEAN
STDCALL
MmSetAddressRangeModified (