Implemented /Device/PhysicalMemory
authorDavid Welch <welch@cwcom.net>
Thu, 28 Dec 2000 03:38:08 +0000 (03:38 +0000)
committerDavid Welch <welch@cwcom.net>
Thu, 28 Dec 2000 03:38:08 +0000 (03:38 +0000)
Corrected an LPC bug when terminating a process with threads waiting for
LPC messages

svn path=/trunk/; revision=1479

18 files changed:
reactos/Makefile
reactos/drivers/fs/vfat/fat.c
reactos/install.sh
reactos/ntoskrnl/include/internal/asm.inc [deleted file]
reactos/ntoskrnl/include/internal/cc.h
reactos/ntoskrnl/include/internal/dbg.h
reactos/ntoskrnl/include/internal/ex.h
reactos/ntoskrnl/include/internal/i386/segment.h
reactos/ntoskrnl/include/internal/io.h
reactos/ntoskrnl/include/internal/kd.h
reactos/ntoskrnl/include/internal/ke.h
reactos/ntoskrnl/include/internal/mm.h
reactos/ntoskrnl/ke/gdt.c
reactos/ntoskrnl/ke/multiboot.S
reactos/ntoskrnl/lpc/queue.c
reactos/ntoskrnl/lpc/reply.c
reactos/ntoskrnl/mm/mminit.c
reactos/ntoskrnl/mm/section.c

index 6651af4..1613ba3 100644 (file)
@@ -54,7 +54,7 @@ NET_DEVICE_DRIVERS = ne2000
 SYS_APPS = shell winlogon services
 
 APPS = args hello test cat bench apc shm lpc thread event file gditest \
-       pteb consume dump_shared_data vmtest regtest
+       pteb consume dump_shared_data vmtest regtest ptest
 
 #       objdir
 
index 6a35b7a..4707eff 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: fat.c,v 1.7 2000/12/07 16:58:42 jean Exp $
+ * $Id: fat.c,v 1.8 2000/12/28 03:38:08 dwelch Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -22,7 +22,8 @@
 
 /* FUNCTIONS ****************************************************************/
 
-ULONG Fat32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
+ULONG 
+Fat32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 /*
  * FUNCTION: Retrieve the next FAT32 cluster from the FAT table via a physical
  *           disk read
@@ -44,7 +45,8 @@ ULONG Fat32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
    return(CurrentCluster);
 }
 
-ULONG Fat16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
+ULONG 
+Fat16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 /*
  * FUNCTION: Retrieve the next FAT16 cluster from the FAT table from the
  *           in-memory FAT
@@ -59,7 +61,8 @@ ULONG Fat16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
    return(CurrentCluster);
 }
 
-ULONG Fat12GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
+ULONG 
+Fat12GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 /*
  * FUNCTION: Retrieve the next FAT12 cluster from the FAT table from the
  *           in-memory FAT
@@ -68,26 +71,27 @@ ULONG Fat12GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
  unsigned char* CBlock;
  ULONG FATOffset;
  ULONG Entry;
  CBlock = DeviceExt->FAT;
  FATOffset = (CurrentCluster * 12)/ 8;//first byte containing value
  if ((CurrentCluster % 2) == 0)
+ CBlock = DeviceExt->FAT;
+ FATOffset = (CurrentCluster * 12)/ 8;//first byte containing value
+ if ((CurrentCluster % 2) == 0)
    {
-    Entry = CBlock[FATOffset];
-    Entry |= ((CBlock[FATOffset+1] & 0xf)<<8);
+     Entry = CBlock[FATOffset];
+     Entry |= ((CBlock[FATOffset+1] & 0xf)<<8);
    }
  else
+ else
    {
-    Entry = (CBlock[FATOffset] >> 4);
-    Entry |= (CBlock[FATOffset+1] << 4);
+     Entry = (CBlock[FATOffset] >> 4);
+     Entry |= (CBlock[FATOffset+1] << 4);
    }
  DPRINT("Entry %x\n",Entry);
  if (Entry >= 0xff8 && Entry <= 0xfff)
+ DPRINT("Entry %x\n",Entry);
+ if (Entry >= 0xff8 && Entry <= 0xfff)
     Entry = 0xffffffff;
  DPRINT("Returning %x\n",Entry);
  return(Entry);
+ DPRINT("Returning %x\n",Entry);
+ return(Entry);
 }
 
-ULONG GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
+ULONG 
+GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 /*
  * FUNCTION: Retrieve the next cluster depending on the FAT type
  */
@@ -95,21 +99,21 @@ ULONG GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
    ULONG NextCluster;
    
    DPRINT("GetNextCluster(DeviceExt %x, CurrentCluster %x)\n",
-           DeviceExt,CurrentCluster);
+         DeviceExt,CurrentCluster);
    
    ExAcquireResourceSharedLite(&DeviceExt->FatResource, TRUE);
    
    if (DeviceExt->FatType == FAT16)
      {
-       NextCluster = Fat16GetNextCluster(DeviceExt, CurrentCluster);
+       NextCluster = Fat16GetNextCluster(DeviceExt, CurrentCluster);
      }
    else if (DeviceExt->FatType == FAT32)
      {
-       NextCluster = Fat32GetNextCluster(DeviceExt, CurrentCluster);
+       NextCluster = Fat32GetNextCluster(DeviceExt, CurrentCluster);
      }
    else
      {
-       NextCluster = Fat12GetNextCluster(DeviceExt, CurrentCluster);
+       NextCluster = Fat12GetNextCluster(DeviceExt, CurrentCluster);
      }
    
    ExReleaseResourceLite(&DeviceExt->FatResource);
@@ -117,7 +121,8 @@ ULONG GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
    return(NextCluster);
 }
 
-ULONG FAT16FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
+ULONG 
+FAT16FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
 /*
  * FUNCTION: Finds the first available cluster in a FAT16 table
  */
@@ -132,7 +137,8 @@ ULONG FAT16FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
    return 0;
 }
 
-ULONG FAT12FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
+ULONG 
+FAT12FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
 /*
  * FUNCTION: Finds the first available cluster in a FAT12 table
  */
@@ -162,7 +168,8 @@ ULONG FAT12FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
    return 0;
 }
 
-ULONG FAT32FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
+ULONG 
+FAT32FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
 /*
  * FUNCTION: Finds the first available cluster in a FAT32 table
  */
@@ -192,7 +199,8 @@ ULONG FAT32FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
    return 0;
 }
 
-ULONG FAT12CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
+ULONG 
+FAT12CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
 /*
  * FUNCTION: Counts free cluster in a FAT12 table
  */
@@ -227,7 +235,8 @@ ULONG FAT12CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
    return ulCount;
 }
 
-ULONG FAT16CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
+ULONG 
+FAT16CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
 /*
  * FUNCTION: Counts free clusters in a FAT16 table
  */
@@ -250,7 +259,8 @@ ULONG FAT16CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
    return ulCount;
 }
 
-ULONG FAT32CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
+ULONG 
+FAT32CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
 /*
  * FUNCTION: Counts free clusters in a FAT32 table
  */
@@ -282,8 +292,9 @@ ULONG FAT32CountAvailableClusters(PDEVICE_EXTENSION DeviceExt)
    return ulCount;
 }
 
-void  FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
-                        ULONG NewValue)
+VOID  
+FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
+                 ULONG NewValue)
 /*
  * FUNCTION: Writes a cluster to the FAT12 physical and in-memory tables
  */
@@ -330,8 +341,9 @@ void  FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
    }
 }
 
-void  FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
-                        ULONG NewValue)
+VOID  
+FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
+                 ULONG NewValue)
 /*
  * FUNCTION: Writes a cluster to the FAT16 physical and in-memory tables
  */
@@ -361,8 +373,9 @@ void  FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
      }
 }
 
-void  FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
-                        ULONG NewValue)
+VOID  
+FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
+                 ULONG NewValue)
 /*
  * FUNCTION: Writes a cluster to the FAT32 physical tables
  */
@@ -397,8 +410,9 @@ DbgPrint("FAT32WriteCluster %u : %u\n",ClusterToWrite,NewValue);
    ExFreePool(Block);
 }
 
-void  WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
-                   ULONG NewValue)
+VOID  
+WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
+            ULONG NewValue)
 /*
  * FUNCTION: Write a changed FAT entry
  */
@@ -417,7 +431,8 @@ void  WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
      }
 }
 
-ULONG GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
+ULONG 
+GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 /*
  * FUNCTION: Determines the next cluster to be written
  */
@@ -474,8 +489,9 @@ ULONG GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
    }
 }
 
-ULONG ClusterToSector(PDEVICE_EXTENSION DeviceExt,
-                             unsigned long Cluster)
+ULONG 
+ClusterToSector(PDEVICE_EXTENSION DeviceExt,
+               unsigned long Cluster)
 /*
  * FUNCTION: Converts the cluster number to a sector number for this physical
  *           device
@@ -484,7 +500,8 @@ ULONG ClusterToSector(PDEVICE_EXTENSION DeviceExt,
   return DeviceExt->dataStart+((Cluster-2)*DeviceExt->Boot->SectorsPerCluster);
 }
 
-void VFATLoadCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster)
+VOID
+VFATLoadCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster)
 /*
  * FUNCTION: Load a cluster from the physical device
  */
@@ -503,7 +520,8 @@ void VFATLoadCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster)
    DPRINT("Finished VFATReadSectors\n");
 }
 
-void VFATWriteCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster)
+VOID 
+VFATWriteCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster)
 /*
  * FUNCTION: Write a cluster to the physical device
  */
index 14dd006..b6c81e5 100644 (file)
@@ -24,7 +24,7 @@ cp apps/cat/cat.exe $1/reactos/bin
 cp subsys/smss/smss.exe $1/reactos/system32
 cp subsys/csrss/csrss.exe $1/reactos/system32
 cp subsys/win32k/win32k.sys $1/reactos/system32/drivers
-#cp apps/system/winlogon/winlogon.exe $1/reactos/system32/
+cp apps/system/winlogon/winlogon.exe $1/reactos/system32/
 cp apps/apc/apc.exe $1/reactos/bin
 cp apps/shm/shmsrv.exe $1/reactos/bin
 cp apps/shm/shmclt.exe $1/reactos/bin
@@ -40,3 +40,4 @@ cp apps/dump_shared_data/dump_shared_data.exe $1/reactos/bin
 cp apps/vmtest/vmtest.exe $1/reactos/bin
 cp apps/uitest/uitest.exe $1/reactos/bin/
 cp apps/gditest/gditest.exe $1/reactos/bin/
+cp apps/ptest/ptest.exe $1/reactos/bin
diff --git a/reactos/ntoskrnl/include/internal/asm.inc b/reactos/ntoskrnl/include/internal/asm.inc
deleted file mode 100644 (file)
index 477a241..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-%macro DECLARE_EXTERNAL_SYMBOL 1
-%ifdef coff
-extern _%1
-%elifdef win32
-extern _%1
-%elifdef elf
-extern %1
-_%1:
-      call %1
-      ret
-%endif
-%endmacro
-
-%macro DECLARE_GLOBAL_SYMBOL 1
-%ifdef coff
-global _%1
-_%1:
-%elifdef win32
-global _%1
-_%1:
-%elifdef elf
-global %1
-%1:
-%endif
-%endmacro
index 8750e29..40d981f 100644 (file)
@@ -1,10 +1,7 @@
 #ifndef __INCLUDE_INTERNAL_CC_H
 #define __INCLUDE_INTERNAL_CCS_H
-/* $Id: cc.h,v 1.1 2000/06/29 23:35:36 dwelch Exp $ */
-VOID
-STDCALL
-CcMdlReadCompleteDev (
-       IN      PMDL            MdlChain,
-       IN      PDEVICE_OBJECT  DeviceObject
-       );
+/* $Id: cc.h,v 1.2 2000/12/28 03:38:07 dwelch Exp $ */
+VOID STDCALL
+CcMdlReadCompleteDev (IN       PMDL            MdlChain,
+                     IN        PDEVICE_OBJECT  DeviceObject);
 #endif
index d6eaae4..3d0706b 100644 (file)
@@ -4,7 +4,8 @@
 #include <napi/dbg.h>
 #include <internal/port.h>
 
-NTSTATUS STDCALL LpcSendDebugMessagePort(PEPORT Port,
-                                        PLPC_DBG_MESSAGE Message);
+NTSTATUS STDCALL 
+LpcSendDebugMessagePort(PEPORT Port,
+                       PLPC_DBG_MESSAGE Message);
 
 #endif /* __INCLUDE_INTERNAL_DBG_H */
index 536738e..525439f 100644 (file)
@@ -2,8 +2,8 @@
  * internal executive prototypes
  */
 
-#ifndef _INCLUDE_INTERNAL_EXECUTIVE_H
-#define _INCLUDE_INTERNAL_EXECUTIVE_H
+#ifndef __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H
+#define __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H
 
 #include <ddk/ntddk.h>
 #include <ntos/time.h>
@@ -14,10 +14,13 @@ TIME_ZONE_INFORMATION SystemTimeZoneInfo;
 
 /* INITIALIZATION FUNCTIONS *************************************************/
 
-VOID ExInit (VOID);
-VOID ExInitTimeZoneInfo (VOID);
-VOID ExInitializeWorkerThreads(VOID);
+VOID 
+ExInit (VOID);
+VOID 
+ExInitTimeZoneInfo (VOID);
+VOID 
+ExInitializeWorkerThreads(VOID);
 
-#endif /* _INCLUDE_INTERNAL_EXECUTIVE_H */
+#endif /* __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H */
 
 
index 279b777..aec3570 100644 (file)
  * FILE:            ntoskrnl/include/internal/i386/segment.h
  * PURPOSE:         Segment selector definitions
  * PROGRAMMER:      David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- *                  Created ??/??/??
  */
 
 /* INCLUDES *****************************************************************/
 
-#ifndef __INCLUDE_INTERNAL_I386_SEGMENT_H
-#define __INCLUDE_INTERNAL_i386_SEGMENT_H
+#ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_SEGMENT_H
+#define __NTOSKRNL_INCLUDE_INTERNAL_i386_SEGMENT_H
 
 #define NULL_SELECTOR        (0x0)
 #define KERNEL_CS            (0x8)
 #define KERNEL_DS            (0x10)
 #define USER_CS              (0x18 + 0x3)
 #define USER_DS              (0x20 + 0x3)
-/*
- * FIXME: We actually have one TSS per thread
- */
+/* Task State Segment */
 #define TSS_SELECTOR         (0x28)
+/* Processor Control Region */
 #define PCR_SELECTOR         (0x30)
+/* Thread Environment Block */
 #define TEB_SELECTOR         (0x38 + 0x3)
-#define RESERVED1_SELECTOR   (0x40)
+#define RESERVED_SELECTOR   (0x40)
+/* Local Descriptor Table */
 #define LDT_SELECTOR         (0x48)
 
-#endif /* __INCLUDE_INTERNAL_I386_SEGMENT_H */
+#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_SEGMENT_H */
index fa0b803..fb64d16 100644 (file)
@@ -1,4 +1,22 @@
-/* $Id: io.h,v 1.6 2000/10/05 19:12:55 ekohl Exp $
+/*
+ *  ReactOS kernel
+ *  Copyright (C) 2000 David Welch <welch@cwcom.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/* $Id: io.h,v 1.7 2000/12/28 03:38:07 dwelch Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -9,8 +27,8 @@
  *               28/05/97: Created
  */
 
-#ifndef __INCLUDE_INTERNAL_IO_H
-#define __INCLUDE_INTERNAL_IO_H
+#ifndef __NTOSKRNL_INCLUDE_INTERNAL_IO_H
+#define __NTOSKRNL_INCLUDE_INTERNAL_IO_H
 
 #include <ddk/ntddk.h>
 #include <internal/ob.h>
@@ -23,14 +41,17 @@ extern POBJECT_TYPE         IoSymbolicLinkType;
  *          entry = pointer to the driver initialization routine
  * RETURNS: Success or failure
  */
-NTSTATUS IoInitializeDriver(PDRIVER_INITIALIZE DriverEntry);
-
-
+NTSTATUS 
+IoInitializeDriver(PDRIVER_INITIALIZE DriverEntry);
 
-VOID IoInitCancelHandling(VOID);
-VOID IoInitSymbolicLinkImplementation(VOID);
-VOID IoInitFileSystemImplementation(VOID);
-VOID IoInitVpbImplementation (VOID);
+VOID 
+IoInitCancelHandling(VOID);
+VOID 
+IoInitSymbolicLinkImplementation(VOID);
+VOID 
+IoInitFileSystemImplementation(VOID);
+VOID 
+IoInitVpbImplementation (VOID);
 
 NTSTATUS IoTryToMountStorageDevice(PDEVICE_OBJECT DeviceObject);
 POBJECT IoOpenSymlink(POBJECT SymbolicLink);
index 6226f29..f71831d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: kd.h,v 1.1 2000/06/29 23:35:36 dwelch Exp $
+/* $Id: kd.h,v 1.2 2000/12/28 03:38:07 dwelch Exp $
  *
  * kernel debugger prototypes
  */
@@ -6,8 +6,7 @@
 #ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
 #define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
 
-
-ULONG KdpPrintString (PANSI_STRING String);
-
+ULONG 
+KdpPrintString (PANSI_STRING String);
 
 #endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */
index f694d20..f1e6406 100644 (file)
@@ -1,9 +1,24 @@
 /*
- * Various useful prototypes
+ *  ReactOS kernel
+ *  Copyright (C) 2000 David Welch <welch@cwcom.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#ifndef __INCLUDE_INTERNAL_KERNEL_H
-#define __INCLUDE_INTERNAL_KERNEL_H
+#ifndef __NTOSKRNL_INCLUDE_INTERNAL_KERNEL_H
+#define __NTOSKRNL_INCLUDE_INTERNAL_KERNEL_H
 
 /* INCLUDES *****************************************************************/
 
index 82e3152..0e81b6d 100644 (file)
@@ -42,6 +42,8 @@ enum
 #define SPE_DIRTY                               (0x8)
 #define SPE_IN_PAGEFILE                         (0x10)
 
+#define SO_PHYSICAL_MEMORY                      (0x1)
+
 typedef struct
 {
    ULONG Pages[NR_SECTION_PAGE_ENTRIES];
@@ -54,16 +56,17 @@ typedef struct
 
 typedef struct
 {
-   CSHORT Type;
-   CSHORT Size;
-   LARGE_INTEGER MaximumSize;
-   ULONG SectionPageProtection;
-   ULONG AllocateAttributes;
-   PFILE_OBJECT FileObject;
-   LIST_ENTRY ViewListHead;
-   KSPIN_LOCK ViewListLock;
-   KMUTEX Lock;
-   SECTION_PAGE_DIRECTORY PageDirectory;
+  CSHORT Type;
+  CSHORT Size;
+  LARGE_INTEGER MaximumSize;
+  ULONG SectionPageProtection;
+  ULONG AllocateAttributes;
+  PFILE_OBJECT FileObject;
+  LIST_ENTRY ViewListHead;
+  KSPIN_LOCK ViewListLock;
+  KMUTEX Lock;
+  SECTION_PAGE_DIRECTORY PageDirectory;
+  ULONG Flags;
 } SECTION_OBJECT, *PSECTION_OBJECT;
 
 typedef struct
@@ -299,6 +302,8 @@ VOID MmUnlockPage(PVOID PhysicalPage);
 
 NTSTATUS MmSafeCopyFromUser(PVOID Dest, PVOID Src, ULONG Count);
 NTSTATUS MmSafeCopyToUser(PVOID Dest, PVOID Src, ULONG Count);
+NTSTATUS 
+MmCreatePhysicalMemorySection(VOID);
 
 #define MM_PHYSICAL_PAGE_MPW_PENDING     (0x8)
 
index 1548aa6..ce56df6 100644 (file)
@@ -34,9 +34,7 @@
 
 /* GLOBALS *******************************************************************/
 
-#define NR_TASKS 128
-
-USHORT KiGdt[(8 + NR_TASKS) * 4] = 
+USHORT KiGdt[10 * 4] = 
 {
  0x0, 0x0, 0x0, 0x0,              /* Null */
  0xffff, 0x0, 0x9a00, 0xcf,       /* Kernel CS */
@@ -53,8 +51,9 @@ static KSPIN_LOCK GdtLock;
 
 /* FUNCTIONS *****************************************************************/
 
-VOID KeSetBaseGdtSelector(ULONG Entry,
-                         PVOID Base)
+VOID 
+KeSetBaseGdtSelector(ULONG Entry,
+                    PVOID Base)
 {
    KIRQL oldIrql;
    
@@ -84,7 +83,8 @@ VOID KeSetBaseGdtSelector(ULONG Entry,
    KeReleaseSpinLock(&GdtLock, oldIrql);
 }
 
-VOID KeDumpGdtSelector(ULONG Entry)
+VOID 
+KeDumpGdtSelector(ULONG Entry)
 {
    USHORT a, b, c, d;
    ULONG RawLimit;
@@ -143,7 +143,8 @@ VOID KeFreeGdtSelector(ULONG Entry)
 #endif
 
 #if 0
-ULONG KeAllocateGdtSelector(ULONG Desc[2])
+ULONG 
+KeAllocateGdtSelector(ULONG Desc[2])
 /*
  * FUNCTION: Allocate a gdt selector
  * ARGUMENTS:
index 7303f99..98b23e1 100644 (file)
@@ -3,8 +3,6 @@
 
 #define KERNEL_BASE (0xc0000000)
 
-#define NR_TASKS (128)
-
 #define MULTIBOOT_HEADER_MAGIC (0x1BADB002)
 
 #define MULTIBOOT_HEADER_FLAGS (0x00010003)
@@ -708,7 +706,7 @@ lowmem_pagetable:
        .long 0x3f8007,0x3f9007,0x3fa007,0x3fb007,0x3fc007,0x3fd007,0x3fe007,0x3ff007
 
 _gdt_descr:
-       .word ((8+NR_TASKS)*8)-1
+       .word (10*8)-1
        .long _KiGdt
        
 _idt_descr:
index bb40869..1abe36f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: queue.c,v 1.2 2000/10/22 16:36:51 ekohl Exp $
+/* $Id: queue.c,v 1.3 2000/12/28 03:38:07 dwelch Exp $
  * 
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
 #include <internal/debug.h>
 
 
-VOID
-STDCALL
-EiEnqueueMessagePort (
-       IN OUT  PEPORT          Port,
-       IN      PQUEUEDMESSAGE  Message
-       )
+VOID STDCALL
+EiEnqueueMessagePort (IN OUT   PEPORT          Port,
+                     IN        PQUEUEDMESSAGE  Message)
 {
-       InsertTailList (
-               & Port->QueueListHead,
-               & Message->QueueListEntry
-               );
-       Port->QueueLength++;
+  InsertTailList (&Port->QueueListHead,
+                 &Message->QueueListEntry);
+  Port->QueueLength++;
 }
 
 
-PQUEUEDMESSAGE
-STDCALL
-EiDequeueMessagePort (
-       IN OUT  PEPORT  Port
-       )
+PQUEUEDMESSAGE STDCALL
+EiDequeueMessagePort (IN OUT   PEPORT  Port)
 {
-       PQUEUEDMESSAGE  Message;
-       PLIST_ENTRY     entry;
+  PQUEUEDMESSAGE       Message;
+  PLIST_ENTRY  entry;
+  
+  if (IsListEmpty(&Port->QueueListHead))
+    {
+      return(NULL);
+    }
+  entry = RemoveHeadList (&Port->QueueListHead);
+  Message = CONTAINING_RECORD (entry, QUEUEDMESSAGE, QueueListEntry);
+  Port->QueueLength--;
    
-       entry = RemoveHeadList (& Port->QueueListHead);
-       Message = CONTAINING_RECORD (entry, QUEUEDMESSAGE, QueueListEntry);
-       Port->QueueLength--;
-   
-       return (Message);
+  return (Message);
 }
 
 
-VOID
-STDCALL
-EiEnqueueConnectMessagePort (
-       IN OUT  PEPORT          Port,
-       IN      PQUEUEDMESSAGE  Message
-       )
+VOID STDCALL
+EiEnqueueConnectMessagePort (IN OUT    PEPORT          Port,
+                            IN PQUEUEDMESSAGE  Message)
 {
-       InsertTailList (
-               & Port->ConnectQueueListHead,
-               & Message->QueueListEntry
-               );
-       Port->ConnectQueueLength++;
+  InsertTailList (&Port->ConnectQueueListHead,
+                 &Message->QueueListEntry);
+  Port->ConnectQueueLength++;
 }
 
 
-PQUEUEDMESSAGE
-STDCALL
-EiDequeueConnectMessagePort (
-       IN OUT  PEPORT  Port
-       )
+PQUEUEDMESSAGE STDCALL
+EiDequeueConnectMessagePort (IN OUT    PEPORT  Port)
 {
-       PQUEUEDMESSAGE  Message;
-       PLIST_ENTRY     entry;
-   
-       entry = RemoveHeadList (& Port->ConnectQueueListHead);
-       Message = CONTAINING_RECORD (entry, QUEUEDMESSAGE, QueueListEntry);
-       Port->ConnectQueueLength--;
-
-       return (Message);
+  PQUEUEDMESSAGE       Message;
+  PLIST_ENTRY  entry;
+  
+  if (IsListEmpty(&Port->ConnectQueueListHead))
+    {
+      return(NULL);
+    }
+  entry = RemoveHeadList (&Port->ConnectQueueListHead);
+  Message = CONTAINING_RECORD (entry, QUEUEDMESSAGE, QueueListEntry);
+  Port->ConnectQueueLength--;
+  
+  return (Message);
 }
 
 
index 8d002a7..967af7f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: reply.c,v 1.2 2000/10/22 16:36:51 ekohl Exp $
+/* $Id: reply.c,v 1.3 2000/12/28 03:38:07 dwelch Exp $
  * 
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -9,7 +9,7 @@
  *                  Created 22/05/98
  */
 
-/* INCLUDES *****************************************************************/
+/* INCLUDES ******************************************************************/
 
 #include <ddk/ntddk.h>
 #include <internal/ob.h>
@@ -19,7 +19,7 @@
 #define NDEBUG
 #include <internal/debug.h>
 
-
+/* FUNCTIONS *****************************************************************/
 
 /**********************************************************************
  * NAME
  * REVISIONS
  *
  */
-NTSTATUS
-STDCALL
-EiReplyOrRequestPort (
-       IN      PEPORT          Port, 
-       IN      PLPC_MESSAGE    LpcReply, 
-       IN      ULONG           MessageType,
-       IN      PEPORT          Sender
-       )
+NTSTATUS STDCALL
+EiReplyOrRequestPort (IN       PEPORT          Port, 
+                     IN        PLPC_MESSAGE    LpcReply, 
+                     IN        ULONG           MessageType,
+                     IN        PEPORT          Sender)
 {
    KIRQL oldIrql;
    PQUEUEDMESSAGE MessageReply;
@@ -78,12 +75,9 @@ EiReplyOrRequestPort (
  * REVISIONS
  *
  */
-NTSTATUS
-STDCALL
-NtReplyPort (
-       IN      HANDLE          PortHandle,
-       IN      PLPC_MESSAGE    LpcReply
-       )
+NTSTATUS STDCALL
+NtReplyPort (IN        HANDLE          PortHandle,
+            IN PLPC_MESSAGE    LpcReply)
 {
    NTSTATUS Status;
    PEPORT Port;
@@ -126,14 +120,11 @@ NtReplyPort (
  * REVISIONS
  *
  */
-NTSTATUS
-STDCALL
-NtReplyWaitReceivePort (
-       HANDLE          PortHandle,
-       PULONG          PortId,
-       PLPC_MESSAGE    LpcReply,     
-       PLPC_MESSAGE    LpcMessage
-       )
+NTSTATUS STDCALL
+NtReplyWaitReceivePort (HANDLE         PortHandle,
+                       PULONG          PortId,
+                       PLPC_MESSAGE    LpcReply,     
+                       PLPC_MESSAGE    LpcMessage)
 {
    NTSTATUS Status;
    PEPORT Port;
@@ -176,33 +167,49 @@ NtReplyWaitReceivePort (
    /*
     * Want for a message to be received
     */
-   DPRINT("Entering wait for message\n");
-   KeWaitForSingleObject(&Port->Event,
-                        UserRequest,
-                        UserMode,
-                        FALSE,
-                        NULL);
-   DPRINT("Woke from wait for message\n");
+   do
+     {
+       Status = KeWaitForSingleObject(&Port->Event,
+                                     UserRequest,
+                                     UserMode,
+                                     FALSE,
+                                     NULL);
+       if (!NT_SUCCESS(Status))
+        {
+          return(Status);
+        }
+
+       /*
+       * Dequeue the message
+       */
+       KeAcquireSpinLock(&Port->Lock, &oldIrql);
+       Request = EiDequeueMessagePort(Port);
+       
+       /*
+       * There is a race between the event being set and the port being
+       * taken in which another thread may dequeue the same request so
+       * we may need to loop.
+       */
+       if (Request == NULL)
+        {
+          KeReleaseSpinLock(&Port->Lock, oldIrql);
+        }
+     } while(Request == NULL);
    
-   /*
-    * Dequeue the message
-    */
-   KeAcquireSpinLock(&Port->Lock, &oldIrql);
-   Request = EiDequeueMessagePort(Port);
    memcpy(LpcMessage, &Request->Message, Request->Message.MessageSize);
    if (Request->Message.MessageType == LPC_CONNECTION_REQUEST)
      {
-       EiEnqueueConnectMessagePort(Port, Request);
-       KeReleaseSpinLock(&Port->Lock, oldIrql);
+       EiEnqueueConnectMessagePort(Port, Request);
+       KeReleaseSpinLock(&Port->Lock, oldIrql);
      }
    else
      {
-       KeReleaseSpinLock(&Port->Lock, oldIrql);
-       ExFreePool(Request);
+       KeReleaseSpinLock(&Port->Lock, oldIrql);
+       ExFreePool(Request);
      }
    
    /*
-    * 
+    * Dereference the port
     */
    ObDereferenceObject(Port);
    return(STATUS_SUCCESS);
@@ -221,14 +228,11 @@ NtReplyWaitReceivePort (
  * REVISIONS
  *
  */
-NTSTATUS
-STDCALL
-NtReplyWaitReplyPort (
-       HANDLE          PortHandle,
-       PLPC_MESSAGE    ReplyMessage
-       )
+NTSTATUS STDCALL
+NtReplyWaitReplyPort (HANDLE           PortHandle,
+                     PLPC_MESSAGE      ReplyMessage)
 {
-       UNIMPLEMENTED;
+   UNIMPLEMENTED;
 }
 
 
index 903bc45..444c756 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mminit.c,v 1.11 2000/12/20 18:44:20 jean Exp $
+/* $Id: mminit.c,v 1.12 2000/12/28 03:38:07 dwelch Exp $
  *
  * COPYRIGHT:   See COPYING in the top directory
  * PROJECT:     ReactOS kernel 
@@ -273,6 +273,8 @@ VOID MmInit2(VOID)
 VOID MmInit3(VOID)
 {
    MmInitPagerThread();
+   MmCreatePhysicalMemorySection();
+
    /* FIXME: Read parameters from memory */
 }
 
index e720011..0a24c21 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: section.c,v 1.39 2000/10/22 16:36:52 ekohl Exp $
+/* $Id: section.c,v 1.40 2000/12/28 03:38:07 dwelch Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -43,14 +43,16 @@ VOID MmLockSection(PSECTION_OBJECT Section)
                         NULL);
 }
 
-VOID MmUnlockSection(PSECTION_OBJECT Section)
+VOID 
+MmUnlockSection(PSECTION_OBJECT Section)
 {
    KeReleaseMutex(&Section->Lock, FALSE);
 }
 
-VOID MmSetPageEntrySection(PSECTION_OBJECT Section,
-                          ULONG Offset,
-                          ULONG Entry)
+VOID 
+MmSetPageEntrySection(PSECTION_OBJECT Section,
+                     ULONG Offset,
+                     ULONG Entry)
 {
    PSECTION_PAGE_TABLE Table;
    ULONG DirectoryOffset;
@@ -70,8 +72,9 @@ VOID MmSetPageEntrySection(PSECTION_OBJECT Section,
    Table->Pages[TableOffset] = Entry;
 }
 
-ULONG MmGetPageEntrySection(PSECTION_OBJECT Section,
-                           ULONG Offset)
+ULONG 
+MmGetPageEntrySection(PSECTION_OBJECT Section,
+                     ULONG Offset)
 {
    PSECTION_PAGE_TABLE Table;
    ULONG Entry;
@@ -92,9 +95,10 @@ ULONG MmGetPageEntrySection(PSECTION_OBJECT Section,
    return(Entry);
 }
 
-NTSTATUS MmUnalignedLoadPageForSection(PMADDRESS_SPACE AddressSpace,
-                                      MEMORY_AREA* MemoryArea,
-                                      PVOID Address)
+NTSTATUS 
+MmUnalignedLoadPageForSection(PMADDRESS_SPACE AddressSpace,
+                             MEMORY_AREA* MemoryArea,
+                             PVOID Address)
 {
    LARGE_INTEGER Offset;
    IO_STATUS_BLOCK IoStatus;
@@ -128,6 +132,15 @@ NTSTATUS MmUnalignedLoadPageForSection(PMADDRESS_SPACE AddressSpace,
    
    MmLockSection(Section);
    
+   /*
+    * Don't do an unaligned mapping of physical memory
+    */
+   if (Section->Flags & SO_PHYSICAL_MEMORY)
+     {
+       MmUnlockSection(Section);
+       return(STATUS_UNSUCCESSFUL);
+     }
+
    Page = MmAllocPageMaybeSwap(0);
    Mdl = MmCreateMdl(NULL, NULL, PAGESIZE);
    MmBuildMdlFromPages(Mdl, (PULONG)&Page);
@@ -162,12 +175,13 @@ NTSTATUS MmUnalignedLoadPageForSection(PMADDRESS_SPACE AddressSpace,
 
 }
 
-NTSTATUS MmWaitForPendingOperationSection(PMADDRESS_SPACE AddressSpace,
-                                         PMEMORY_AREA MemoryArea,
-                                         PVOID Address,
-                                         PSECTION_OBJECT Section,
-                                         LARGE_INTEGER Offset,
-                                         ULONG Entry)
+NTSTATUS 
+MmWaitForPendingOperationSection(PMADDRESS_SPACE AddressSpace,
+                                PMEMORY_AREA MemoryArea,
+                                PVOID Address,
+                                PSECTION_OBJECT Section,
+                                LARGE_INTEGER Offset,
+                                ULONG Entry)
 {
    PVOID Page;
    NTSTATUS Status;
@@ -264,9 +278,10 @@ NTSTATUS MmWaitForPendingOperationSection(PMADDRESS_SPACE AddressSpace,
    return(STATUS_SUCCESS);
 }
 
-NTSTATUS MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
-                                     MEMORY_AREA* MemoryArea, 
-                                     PVOID Address)
+NTSTATUS 
+MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
+                            MEMORY_AREA* MemoryArea, 
+                            PVOID Address)
 {
    LARGE_INTEGER Offset;
    IO_STATUS_BLOCK IoStatus;
@@ -308,17 +323,25 @@ NTSTATUS MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
                                             Address));
      }
    
-   DPRINT("MemoryArea->BaseAddress %x\n", MemoryArea->BaseAddress);
-   DPRINT("MemoryArea->Data.SectionData.ViewOffset %x\n",
-          MemoryArea->Data.SectionData.ViewOffset);
-   DPRINT("Got offset %x\n", Offset.QuadPart);
-   
    /*
     * Lock the section
     */
    Section = MemoryArea->Data.SectionData.Section;
    MmLockSection(Section);
    
+   if (Section->Flags & SO_PHYSICAL_MEMORY)
+     {
+       /*
+       * Just map the desired physical page 
+       */
+       Status = MmCreateVirtualMapping(NULL,
+                                      Address,
+                                      MemoryArea->Attributes,
+                                      Offset.QuadPart);
+       MmUnlockSection(Section);
+       return(STATUS_SUCCESS);
+     }
+   
    /*
     * Get the entry corresponding to the offset within the section
     */
@@ -496,22 +519,25 @@ NTSTATUS MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
      }
 }
 
-ULONG MmPageOutSectionView(PMADDRESS_SPACE AddressSpace,
-                          MEMORY_AREA* MemoryArea, 
-                          PVOID Address,
-                          PBOOLEAN Ul)
+ULONG 
+MmPageOutSectionView(PMADDRESS_SPACE AddressSpace,
+                    MEMORY_AREA* MemoryArea, 
+                    PVOID Address,
+                    PBOOLEAN Ul)
 {
    (*Ul) = FALSE;
    return(0);
 }
 
-VOID MmpDeleteSection(PVOID ObjectBody)
+VOID 
+MmpDeleteSection(PVOID ObjectBody)
 {
    DPRINT("MmpDeleteSection(ObjectBody %x)\n", ObjectBody);
 }
 
-VOID MmpCloseSection(PVOID ObjectBody,
-                    ULONG HandleCount)
+VOID 
+MmpCloseSection(PVOID ObjectBody,
+               ULONG HandleCount)
 {
    DPRINT("MmpCloseSection(OB %x, HC %d) RC %d\n",
           ObjectBody, HandleCount, ObGetReferenceCount(ObjectBody));
@@ -552,40 +578,91 @@ NTSTATUS MmpCreateSection(PVOID ObjectBody,
    return(STATUS_SUCCESS);
 }
 
-NTSTATUS MmInitSectionImplementation(VOID)
+NTSTATUS 
+MmCreatePhysicalMemorySection(VOID)
 {
-   MmSectionObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
-   
-   RtlInitUnicodeString(&MmSectionObjectType->TypeName, L"Section");
-
-   MmSectionObjectType->TotalObjects = 0;
-   MmSectionObjectType->TotalHandles = 0;
-   MmSectionObjectType->MaxObjects = ULONG_MAX;
-   MmSectionObjectType->MaxHandles = ULONG_MAX;
-   MmSectionObjectType->PagedPoolCharge = 0;
-   MmSectionObjectType->NonpagedPoolCharge = sizeof(SECTION_OBJECT);
-   MmSectionObjectType->Dump = NULL;
-   MmSectionObjectType->Open = NULL;
-   MmSectionObjectType->Close = MmpCloseSection;
-   MmSectionObjectType->Delete = MmpDeleteSection;
-   MmSectionObjectType->Parse = NULL;
-   MmSectionObjectType->Security = NULL;
-   MmSectionObjectType->QueryName = NULL;
-   MmSectionObjectType->OkayToClose = NULL;
-   MmSectionObjectType->Create = MmpCreateSection;
-   
-   return(STATUS_SUCCESS);
+  HANDLE PhysSectionH;
+  PSECTION_OBJECT PhysSection;
+  NTSTATUS Status;
+  OBJECT_ATTRIBUTES Obj;
+  UNICODE_STRING Name;
+  LARGE_INTEGER SectionSize;
+   
+  /*
+   * Create the section mapping physical memory 
+   */
+  SectionSize.QuadPart = 0xFFFFFFFF;
+  RtlInitUnicodeString(&Name, L"\\Device\\PhysicalMemory");
+  InitializeObjectAttributes(&Obj,                     
+                            &Name,
+                            0,
+                            NULL,
+                            NULL);
+  Status = NtCreateSection(&PhysSectionH,
+                          SECTION_ALL_ACCESS,
+                          &Obj,                           
+                          &SectionSize,
+                          PAGE_EXECUTE_READWRITE,
+                          0,
+                          NULL);
+  if (!NT_SUCCESS(Status))
+    {
+      DbgPrint("Failed to create PhysicalMemory section\n");
+      KeBugCheck(0);
+    }
+  Status = ObReferenceObjectByHandle(PhysSectionH,
+                                    SECTION_ALL_ACCESS,
+                                    NULL,
+                                    KernelMode,
+                                    (PVOID*)&PhysSection,
+                                    NULL);
+  if (!NT_SUCCESS(Status))
+    {
+      DbgPrint("Failed to reference PhysicalMemory section\n");
+      KeBugCheck(0);
+    }
+  PhysSection->Flags = PhysSection->Flags | SO_PHYSICAL_MEMORY;
+  ObDereferenceObject((PVOID)PhysSection);
+   
+  return(STATUS_SUCCESS);
+}
+
+NTSTATUS 
+MmInitSectionImplementation(VOID)
+{
+  MmSectionObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
+  
+  RtlInitUnicodeString(&MmSectionObjectType->TypeName, L"Section");
+  
+  MmSectionObjectType->TotalObjects = 0;
+  MmSectionObjectType->TotalHandles = 0;
+  MmSectionObjectType->MaxObjects = ULONG_MAX;
+  MmSectionObjectType->MaxHandles = ULONG_MAX;
+  MmSectionObjectType->PagedPoolCharge = 0;
+  MmSectionObjectType->NonpagedPoolCharge = sizeof(SECTION_OBJECT);
+  MmSectionObjectType->Dump = NULL;
+  MmSectionObjectType->Open = NULL;
+  MmSectionObjectType->Close = MmpCloseSection;
+  MmSectionObjectType->Delete = MmpDeleteSection;
+  MmSectionObjectType->Parse = NULL;
+  MmSectionObjectType->Security = NULL;
+  MmSectionObjectType->QueryName = NULL;
+  MmSectionObjectType->OkayToClose = NULL;
+  MmSectionObjectType->Create = MmpCreateSection;
+   
+  return(STATUS_SUCCESS);
 }
 
 
 /* FIXME: NtCS should call MmCS */
-NTSTATUS STDCALL NtCreateSection (OUT PHANDLE SectionHandle, 
-                                 IN ACCESS_MASK DesiredAccess,
-                                 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
-                                 IN PLARGE_INTEGER MaximumSize OPTIONAL,  
-                                 IN ULONG SectionPageProtection OPTIONAL,
-                                 IN ULONG AllocationAttributes,
-                                 IN HANDLE FileHandle OPTIONAL)
+NTSTATUS STDCALL 
+NtCreateSection (OUT PHANDLE SectionHandle, 
+                IN ACCESS_MASK DesiredAccess,
+                IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
+                IN PLARGE_INTEGER MaximumSize  OPTIONAL,  
+                IN ULONG SectionPageProtection OPTIONAL,
+                IN ULONG AllocationAttributes,
+                IN HANDLE FileHandle OPTIONAL)
 /*
  * FUNCTION: Creates a section object.
  * ARGUMENTS:
@@ -640,8 +717,9 @@ NTSTATUS STDCALL NtCreateSection (OUT PHANDLE SectionHandle,
    KeInitializeSpinLock(&Section->ViewListLock);
    KeInitializeMutex(&Section->Lock, 0);
    memset(&Section->PageDirectory, 0, sizeof(Section->PageDirectory));
-   
-   if (FileHandle != (HANDLE)0xffffffff)
+   Section->Flags = 0;
+
+   if (FileHandle != (HANDLE)0)
      {
        Status = ObReferenceObjectByHandle(FileHandle,
                                           FILE_READ_DATA,
@@ -686,9 +764,10 @@ NTSTATUS STDCALL NtCreateSection (OUT PHANDLE SectionHandle,
  * REVISIONS
  *
  */
-NTSTATUS STDCALL NtOpenSection(PHANDLE                 SectionHandle,
-                              ACCESS_MASK              DesiredAccess,
-                              POBJECT_ATTRIBUTES       ObjectAttributes)
+NTSTATUS STDCALL 
+NtOpenSection(PHANDLE                  SectionHandle,
+             ACCESS_MASK               DesiredAccess,
+             POBJECT_ATTRIBUTES        ObjectAttributes)
 {
    PVOID Object;
    NTSTATUS Status;
@@ -765,16 +844,17 @@ NTSTATUS STDCALL NtOpenSection(PHANDLE                    SectionHandle,
  * RETURN VALUE
  *     Status.
  */
-NTSTATUS STDCALL NtMapViewOfSection(HANDLE SectionHandle,
-                                   HANDLE ProcessHandle,
-                                   PVOID* BaseAddress,
-                                   ULONG ZeroBits,
-                                   ULONG CommitSize,
-                                   PLARGE_INTEGER SectionOffset,
-                                   PULONG ViewSize,
-                                   SECTION_INHERIT InheritDisposition,
-                                   ULONG AllocationType,
-                                   ULONG Protect)
+NTSTATUS STDCALL 
+NtMapViewOfSection(HANDLE SectionHandle,
+                  HANDLE ProcessHandle,
+                  PVOID* BaseAddress,
+                  ULONG ZeroBits,
+                  ULONG CommitSize,
+                  PLARGE_INTEGER SectionOffset,
+                  PULONG ViewSize,
+                  SECTION_INHERIT InheritDisposition,
+                  ULONG AllocationType,
+                  ULONG Protect)
 {
    PSECTION_OBJECT Section;
    PEPROCESS Process;
@@ -803,7 +883,7 @@ NTSTATUS STDCALL NtMapViewOfSection(HANDLE SectionHandle,
    if (!(NT_SUCCESS(Status)))
      {
        DPRINT("ObReference failed rc=%x\n",Status);       
-       return Status;
+       return(Status);
      }
    
    DPRINT("Section %x\n",Section);
@@ -821,7 +901,7 @@ NTSTATUS STDCALL NtMapViewOfSection(HANDLE SectionHandle,
               Status);
        MmUnlockSection(Section);
        ObDereferenceObject(Section);           
-       return Status;
+       return(Status);
      }
    
    AddressSpace = &Process->AddressSpace;
@@ -839,9 +919,9 @@ NTSTATUS STDCALL NtMapViewOfSection(HANDLE SectionHandle,
      }
    
    if (((*ViewSize)+ViewOffset) > Section->MaximumSize.u.LowPart)
-       {
+     {
           (*ViewSize) = Section->MaximumSize.u.LowPart - ViewOffset;
-       }
+     }
    
    DPRINT("Creating memory area\n");
    MmLockAddressSpace(AddressSpace);
@@ -861,7 +941,7 @@ NTSTATUS STDCALL NtMapViewOfSection(HANDLE SectionHandle,
        MmUnlockSection(Section);
        ObDereferenceObject(Section);
        
-       return Status;
+       return(Status);
      }
    
    KeAcquireSpinLock(&Section->ViewListLock, &oldIrql);
@@ -884,8 +964,9 @@ NTSTATUS STDCALL NtMapViewOfSection(HANDLE SectionHandle,
    return(STATUS_SUCCESS);
 }
 
-NTSTATUS STDCALL MmUnmapViewOfSection(PEPROCESS Process,
-                                     PMEMORY_AREA MemoryArea)
+NTSTATUS STDCALL 
+MmUnmapViewOfSection(PEPROCESS Process,
+                    PMEMORY_AREA MemoryArea)
 {
    PSECTION_OBJECT Section;
    KIRQL oldIrql;
@@ -922,8 +1003,9 @@ NTSTATUS STDCALL MmUnmapViewOfSection(PEPROCESS Process,
  * REVISIONS
  *
  */
-NTSTATUS STDCALL NtUnmapViewOfSection (HANDLE  ProcessHandle,
-                                      PVOID    BaseAddress)
+NTSTATUS STDCALL 
+NtUnmapViewOfSection (HANDLE   ProcessHandle,
+                     PVOID     BaseAddress)
 {
    PEPROCESS   Process;
    NTSTATUS    Status;
@@ -964,10 +1046,20 @@ NTSTATUS STDCALL NtUnmapViewOfSection (HANDLE    ProcessHandle,
                                 MemoryArea);
    
    DPRINT("MmFreeMemoryArea()\n");
-   Status = MmFreeMemoryArea(&Process->AddressSpace,
-                            BaseAddress,
-                            0,
-                            TRUE);
+   if (MemoryArea->Data.SectionData.Section->Flags & SO_PHYSICAL_MEMORY)
+     {
+       Status = MmFreeMemoryArea(&Process->AddressSpace,
+                                BaseAddress,
+                                0,
+                                FALSE);
+     }
+   else
+     {
+       Status = MmFreeMemoryArea(&Process->AddressSpace,
+                                BaseAddress,
+                                0,
+                                TRUE);
+     }
    MmUnlockAddressSpace(AddressSpace);
    ObDereferenceObject(Process);
 
@@ -975,11 +1067,12 @@ NTSTATUS STDCALL NtUnmapViewOfSection (HANDLE    ProcessHandle,
 }
 
 
-NTSTATUS STDCALL NtQuerySection (IN    HANDLE  SectionHandle,
-                                IN     CINT    SectionInformationClass,
-                                OUT    PVOID   SectionInformation,
-                                IN     ULONG   Length, 
-                                OUT    PULONG  ResultLength)
+NTSTATUS STDCALL 
+NtQuerySection (IN     HANDLE  SectionHandle,
+               IN      CINT    SectionInformationClass,
+               OUT     PVOID   SectionInformation,
+               IN      ULONG   Length, 
+               OUT     PULONG  ResultLength)
 /*
  * FUNCTION: Queries the information of a section object.
  * ARGUMENTS: 
@@ -997,8 +1090,9 @@ NTSTATUS STDCALL NtQuerySection (IN        HANDLE  SectionHandle,
 }
 
 
-NTSTATUS STDCALL NtExtendSection(IN    HANDLE  SectionHandle,
-                                IN     ULONG   NewMaximumSize)
+NTSTATUS STDCALL 
+NtExtendSection(IN     HANDLE  SectionHandle,
+               IN      ULONG   NewMaximumSize)
 {
    UNIMPLEMENTED;
 }
@@ -1021,7 +1115,8 @@ NTSTATUS STDCALL NtExtendSection(IN       HANDLE  SectionHandle,
  * REVISIONS
  *
  */
-PVOID STDCALL MmAllocateSection (IN ULONG Length)
+PVOID STDCALL 
+MmAllocateSection (IN ULONG Length)
 {
    PVOID Result;
    MEMORY_AREA* marea;
@@ -1077,107 +1172,83 @@ PVOID STDCALL MmAllocateSection (IN ULONG Length)
  *     Status.
  *
  */
-PVOID
-STDCALL
-MmMapViewOfSection (
-       DWORD   Unknown0,
-       DWORD   Unknown1,
-       DWORD   Unknown2,
-       DWORD   Unknown3,
-       DWORD   Unknown4,
-       DWORD   Unknown5,
-       DWORD   Unknown6,
-       DWORD   Unknown7,
-       DWORD   Unknown8,
-       DWORD   Unknown9
-       )
+PVOID STDCALL
+MmMapViewOfSection (DWORD      Unknown0,
+                   DWORD       Unknown1,
+                   DWORD       Unknown2,
+                   DWORD       Unknown3,
+                   DWORD       Unknown4,
+                   DWORD       Unknown5,
+                   DWORD       Unknown6,
+                   DWORD       Unknown7,
+                   DWORD       Unknown8,
+                   DWORD       Unknown9)
 {
        UNIMPLEMENTED;
        return (NULL);
 }
 
 
-BOOLEAN
-STDCALL
-MmCanFileBeTruncated (
-       IN      PSECTION_OBJECT_POINTERS        SectionObjectPointer,
-       IN      PLARGE_INTEGER                  NewFileSize
-       )
+BOOLEAN STDCALL
+MmCanFileBeTruncated (IN PSECTION_OBJECT_POINTERS      SectionObjectPointer,
+                     IN PLARGE_INTEGER                 NewFileSize)
 {
-       UNIMPLEMENTED;
-       return (FALSE);
+  UNIMPLEMENTED;
+  return (FALSE);
 }
 
 
-BOOLEAN
-STDCALL
-MmDisableModifiedWriteOfSection (
-       DWORD   Unknown0
-       )
+BOOLEAN STDCALL
+MmDisableModifiedWriteOfSection (DWORD Unknown0)
 {
-       UNIMPLEMENTED;
-       return (FALSE);
+  UNIMPLEMENTED;
+  return (FALSE);
 }
 
-BOOLEAN
-STDCALL
-MmFlushImageSection (
-       IN      PSECTION_OBJECT_POINTERS        SectionObjectPointer,
-       IN      MMFLUSH_TYPE                    FlushType
-       )
+BOOLEAN STDCALL
+MmFlushImageSection (IN        PSECTION_OBJECT_POINTERS        SectionObjectPointer,
+                    IN MMFLUSH_TYPE                    FlushType)
 {
-       UNIMPLEMENTED;
-       return (FALSE);
+  UNIMPLEMENTED;
+  return (FALSE);
 }
 
-BOOLEAN
-STDCALL
-MmForceSectionClosed (
-       DWORD   Unknown0,
-       DWORD   Unknown1
-       )
+BOOLEAN STDCALL
+MmForceSectionClosed (DWORD    Unknown0,
+                     DWORD     Unknown1)
 {
-       UNIMPLEMENTED;
-       return (FALSE);
+  UNIMPLEMENTED;
+  return (FALSE);
 }
 
 
-NTSTATUS
-STDCALL
-MmMapViewInSystemSpace (
-       IN      PVOID   Section,
-       OUT     PVOID   * MappedBase,
-       IN      PULONG  ViewSize
-       )
+NTSTATUS STDCALL
+MmMapViewInSystemSpace (IN     PVOID   Section,
+                       OUT     PVOID   * MappedBase,
+                       IN      PULONG  ViewSize)
 {
-       UNIMPLEMENTED;
-       return (STATUS_NOT_IMPLEMENTED);
+  UNIMPLEMENTED;
+  return (STATUS_NOT_IMPLEMENTED);
 }
 
-NTSTATUS
-STDCALL
-MmUnmapViewInSystemSpace (
-       DWORD   Unknown0
-       )
+NTSTATUS STDCALL
+MmUnmapViewInSystemSpace (DWORD        Unknown0)
 {
-       UNIMPLEMENTED;
-       return (STATUS_NOT_IMPLEMENTED);
+  UNIMPLEMENTED;
+  return (STATUS_NOT_IMPLEMENTED);
 }
 
 
-NTSTATUS
-STDCALL
-MmSetBankedSection (
-       DWORD   Unknown0,
-       DWORD   Unknown1,
-       DWORD   Unknown2,
-       DWORD   Unknown3,
-       DWORD   Unknown4,
-       DWORD   Unknown5
-       )
+NTSTATUS STDCALL
+MmSetBankedSection (DWORD      Unknown0,
+                   DWORD       Unknown1,
+                   DWORD       Unknown2,
+                   DWORD       Unknown3,
+                   DWORD       Unknown4,
+                   DWORD       Unknown5)
 {
-       UNIMPLEMENTED;
-       return (STATUS_NOT_IMPLEMENTED);
+  UNIMPLEMENTED;
+  return (STATUS_NOT_IMPLEMENTED);
 }
 
 
@@ -1234,20 +1305,23 @@ MmSetBankedSection (
  * RETURN VALUE
  *     Status.
  */
-NTSTATUS
-STDCALL
-MmCreateSection (
-       OUT     PSECTION_OBJECT         * SectionObject,
-       IN      ACCESS_MASK             DesiredAccess,
-       IN      POBJECT_ATTRIBUTES      ObjectAttributes        OPTIONAL,
-       IN      PLARGE_INTEGER          MaximumSize,
-       IN      ULONG                   SectionPageProtection,
-       IN      ULONG                   AllocationAttributes,
-       IN      HANDLE                  FileHandle              OPTIONAL,
-       IN      PFILE_OBJECT            File                    OPTIONAL
-       )
+NTSTATUS STDCALL
+MmCreateSection (OUT   PSECTION_OBJECT         * SectionObject,
+                IN     ACCESS_MASK             DesiredAccess,
+                IN     POBJECT_ATTRIBUTES      ObjectAttributes     OPTIONAL,
+                IN     PLARGE_INTEGER          MaximumSize,
+                IN     ULONG                   SectionPageProtection,
+                IN     ULONG                   AllocationAttributes,
+                IN     HANDLE                  FileHandle        OPTIONAL,
+                IN     PFILE_OBJECT            File                OPTIONAL)
 {
-       return (STATUS_NOT_IMPLEMENTED);
+  return (STATUS_NOT_IMPLEMENTED);
 }
 
 /* EOF */
+
+
+
+
+
+