update for HEAD-2003091401
[reactos.git] / ntoskrnl / mm / mm.c
index 8ace089..77acc8d 100644 (file)
 
 /* GLOBALS *****************************************************************/
 
-PVOID EXPORTED MmUserProbeAddress = NULL; 
+PVOID EXPORTED MmUserProbeAddress = NULL;
 PVOID EXPORTED MmHighestUserAddress = NULL;
-MM_STATS MmStats; 
+
+PVOID MmSystemRangeStart = NULL;
+MM_STATS MmStats;
 
 /* FUNCTIONS ****************************************************************/
 
@@ -69,15 +71,15 @@ NTSTATUS MmReleaseMemoryArea(PEPROCESS Process, PMEMORY_AREA Marea)
        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);
@@ -93,13 +95,11 @@ NTSTATUS MmReleaseMmInfo(PEPROCESS Process)
    
    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);
@@ -111,11 +111,18 @@ NTSTATUS MmReleaseMmInfo(PEPROCESS 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
@@ -137,7 +144,7 @@ BOOLEAN STDCALL MmIsAddressValid(PVOID VirtualAddress)
    MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace,
                                          VirtualAddress);
 
-   if (MemoryArea == NULL)
+   if (MemoryArea == NULL || MemoryArea->DeleteInProgress)
      {
        MmUnlockAddressSpace(AddressSpace);
        return(FALSE);
@@ -192,46 +199,50 @@ NTSTATUS MmAccessFault(KPROCESSOR_MODE Mode,
      {
        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)
      {
@@ -324,7 +335,7 @@ NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode,
    do
      {
        MemoryArea = MmOpenMemoryAreaByAddress(AddressSpace, (PVOID)Address);
-       if (MemoryArea == NULL)
+       if (MemoryArea == NULL || MemoryArea->DeleteInProgress)
         {
           if (!FromMdl)
             {
@@ -396,6 +407,9 @@ NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode,
 
 /* Miscellanea functions: they may fit somewhere else */
 
+/*
+ * @unimplemented
+ */
 DWORD STDCALL
 MmAdjustWorkingSetSize (DWORD  Unknown0,
                        DWORD   Unknown1,
@@ -418,6 +432,9 @@ MmDbgTranslatePhysicalAddress (
 }
 
 
+/*
+ * @unimplemented
+ */
 NTSTATUS
 STDCALL
 MmGrowKernelStack (
@@ -429,6 +446,9 @@ MmGrowKernelStack (
 }
 
 
+/*
+ * @unimplemented
+ */
 BOOLEAN
 STDCALL
 MmSetAddressRangeModified (