1. implemented shared sections used for (shared) desktop heaps
2. map the gdi handle table to userland
Modified: trunk/reactos/include/win32k/gdiobj.h
Modified: trunk/reactos/include/win32k/ntuser.h
Modified: trunk/reactos/lib/gdi32/include/precomp.h
Modified: trunk/reactos/lib/gdi32/main/dllmain.c
Modified: trunk/reactos/ntoskrnl/include/internal/ex.h
Added: trunk/reactos/subsys/win32k/include/ssec.h
Modified: trunk/reactos/subsys/win32k/include/tags.h
Modified: trunk/reactos/subsys/win32k/main/dllmain.c
Modified: trunk/reactos/subsys/win32k/makefile
Added: trunk/reactos/subsys/win32k/misc/ssec.c
Modified: trunk/reactos/subsys/win32k/ntuser/misc.c
Modified: trunk/reactos/subsys/win32k/objects/gdiobj.c
Modified: trunk/reactos/subsys/win32k/w32k.h

Modified: trunk/reactos/include/win32k/gdiobj.h
--- trunk/reactos/include/win32k/gdiobj.h	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/include/win32k/gdiobj.h	2005-02-18 01:57:32 UTC (rev 13624)
@@ -118,6 +118,6 @@
 #define GDIOBJFLAG_IGNOREPID 	(0x1)
 #define GDIOBJFLAG_IGNORELOCK 	(0x2)
 
-PVOID   INTERNAL_CALL GDI_MapHandleTable(HANDLE hProcess);
+PVOID   INTERNAL_CALL GDI_MapHandleTable(PEPROCESS Process);
 
 #endif

Modified: trunk/reactos/include/win32k/ntuser.h
--- trunk/reactos/include/win32k/ntuser.h	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/include/win32k/ntuser.h	2005-02-18 01:57:32 UTC (rev 13624)
@@ -164,7 +164,6 @@
 #define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO   0xffff0005
 #define NOPARAM_ROUTINE_ANYPOPUP              0xffff0006
 #define NOPARAM_ROUTINE_CSRSS_INITIALIZED     0xffff0007
-#define NOPARAM_ROUTINE_GDI_QUERY_TABLE       0xffff0008
 DWORD
 STDCALL
 NtUserCallNoParam(

Modified: trunk/reactos/lib/gdi32/include/precomp.h
--- trunk/reactos/lib/gdi32/include/precomp.h	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/lib/gdi32/include/precomp.h	2005-02-18 01:57:32 UTC (rev 13624)
@@ -9,9 +9,6 @@
 #define NTOS_MODE_USER
 #include <ntos.h>
 
-#define NtGdiQueryTable() \
-  (PGDI_TABLE_ENTRY)NtUserCallNoParam(NOPARAM_ROUTINE_GDI_QUERY_TABLE)
-
 #define NtUserGetDCBrushColor(hbr) \
   (COLORREF)NtUserCallTwoParam((DWORD)(hbr), OBJ_BRUSH, TWOPARAM_ROUTINE_GETDCCOLOR)
 

Modified: trunk/reactos/lib/gdi32/main/dllmain.c
--- trunk/reactos/lib/gdi32/main/dllmain.c	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/lib/gdi32/main/dllmain.c	2005-02-18 01:57:32 UTC (rev 13624)
@@ -32,7 +32,7 @@
 	hProcessHeap = GetProcessHeap();
 
         /* map the gdi handle table to user space */
-	GdiHandleTable = NtGdiQueryTable();
+	GdiHandleTable = NtCurrentTeb()->Peb->GdiSharedHandleTable;
 }
 
 

Modified: trunk/reactos/ntoskrnl/include/internal/ex.h
--- trunk/reactos/ntoskrnl/include/internal/ex.h	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/ntoskrnl/include/internal/ex.h	2005-02-18 01:57:32 UTC (rev 13624)
@@ -17,6 +17,8 @@
 
 typedef struct _WINSTATION_OBJECT
 {
+  PVOID SharedHeap; /* points to kmode memory! */
+
   CSHORT Type;
   CSHORT Size;
   KSPIN_LOCK Lock;
@@ -44,6 +46,8 @@
 
 typedef struct _DESKTOP_OBJECT
 {
+  PVOID DesktopHeap; /* points to kmode memory! */
+
   CSHORT Type;
   CSHORT Size;
   LIST_ENTRY ListEntry;

Added: trunk/reactos/subsys/win32k/include/ssec.h
--- trunk/reactos/subsys/win32k/include/ssec.h	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/subsys/win32k/include/ssec.h	2005-02-18 01:57:32 UTC (rev 13624)
@@ -0,0 +1,73 @@
+/* $Id$
+ *
+ * COPYRIGHT:        See COPYING in the top level directory
+ * PROJECT:          ReactOS Win32k subsystem
+ * PURPOSE:          shared sections
+ * FILE:             include/ssec.h
+ * PROGRAMMER:       Thomas Weidenmueller <w3seek@reactos.com>
+ *
+ */
+
+#ifndef _WIN32K_SSEC_H
+#define _WIN32K_SSEC_H
+
+typedef struct _SHARED_SECTION
+{
+  PSECTION_OBJECT SectionObject;
+  PVOID SystemMappedBase;
+  ULONG ViewSize;
+} SHARED_SECTION, *PSHARED_SECTION;
+
+typedef struct _SHARED_SECTIONS_ARRAY
+{
+  struct _SHARED_SECTIONS_ARRAY *Next;
+  ULONG nEntries;
+  SHARED_SECTION SharedSection[0];
+} SHARED_SECTIONS_ARRAY, *PSHARED_SECTIONS_ARRAY;
+
+typedef struct _SHARED_SECTION_POOL
+{
+  FAST_MUTEX Lock;
+  ULONG PoolSize;
+  ULONG PoolFree;
+  ULONG SharedSectionCount;
+  SHARED_SECTIONS_ARRAY SectionsArray;
+} SHARED_SECTION_POOL, *PSHARED_SECTION_POOL;
+
+NTSTATUS INTERNAL_CALL
+IntUserCreateSharedSectionPool(IN ULONG MaximumPoolSize,
+                               IN PSHARED_SECTION_POOL *SharedSectionPool);
+
+VOID INTERNAL_CALL
+IntUserFreeSharedSectionPool(IN PSHARED_SECTION_POOL SharedSectionPool);
+
+NTSTATUS INTERNAL_CALL
+InUserDeleteSharedSection(IN PSHARED_SECTION_POOL SharedSectionPool,
+                          IN PVOID SystemMappedBase);
+
+NTSTATUS INTERNAL_CALL
+IntUserCreateSharedSection(IN PSHARED_SECTION_POOL SharedSectionPool,
+                           IN OUT PVOID *SystemMappedBase,
+                           IN OUT ULONG *SharedSectionSize);
+
+NTSTATUS INTERNAL_CALL
+IntUserMapSharedSection(IN PSHARED_SECTION_POOL SharedSectionPool,
+                        IN PEPROCESS Process,
+                        IN PVOID SystemMappedBase,
+                        IN PLARGE_INTEGER SectionOffset  OPTIONAL,
+                        IN OUT PVOID *UserMappedBase,
+                        IN PULONG ViewSize  OPTIONAL,
+                        IN BOOLEAN ReadOnly);
+
+NTSTATUS INTERNAL_CALL
+IntUserUnMapSharedSection(IN PSHARED_SECTION_POOL SharedSectionPool,
+                          IN PEPROCESS Process,
+                          IN PVOID SystemMappedBase,
+                          IN PVOID UserMappedBase);
+
+extern PSHARED_SECTION_POOL SessionSharedSectionPool;
+
+#endif /* ! defined(_WIN32K_SSEC_H) */
+
+/* EOF */
+
Property changes on: trunk/reactos/subsys/win32k/include/ssec.h
___________________________________________________________________
Name: svn:keywords
   + author date id revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/subsys/win32k/include/tags.h
--- trunk/reactos/subsys/win32k/include/tags.h	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/subsys/win32k/include/tags.h	2005-02-18 01:57:32 UTC (rev 13624)
@@ -54,5 +54,6 @@
 /* misc */
 #define TAG_DRIVER	TAG('G', 'D', 'R', 'V') /* video drivers */
 #define TAG_FNTFILE	TAG('F', 'N', 'T', 'F') /* font file */
+#define TAG_SSECTPOOL   TAG('S', 'S', 'C', 'P') /* shared section pool */
 
 #endif /* _WIN32K_TAGS_H */

Modified: trunk/reactos/subsys/win32k/main/dllmain.c
--- trunk/reactos/subsys/win32k/main/dllmain.c	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/subsys/win32k/main/dllmain.c	2005-02-18 01:57:32 UTC (rev 13624)
@@ -51,6 +51,8 @@
 extern SSPT Win32kSSPT[];
 extern ULONG Win32kNumberOfSysCalls;
 
+PSHARED_SECTION_POOL SessionSharedSectionPool = NULL;
+
 NTSTATUS STDCALL
 Win32kProcessCallback (struct _EPROCESS *Process,
 		     BOOLEAN Create)
@@ -76,6 +78,12 @@
 
       Win32Process->KeyboardLayout = W32kGetDefaultKeyLayout();
       
+      if(Process->Peb != NULL)
+      {
+        /* map the gdi handle table to user land */
+        Process->Peb->GdiSharedHandleTable = GDI_MapHandleTable(Process);
+      }
+      
       /* setup process flags */
       Win32Process->Flags = 0;
     }
@@ -237,6 +245,13 @@
 			    sizeof(W32THREAD),
 			    sizeof(W32PROCESS));
   
+  Status = IntUserCreateSharedSectionPool(48 * 1024 * 1024, /* 48 MB by default */
+                                          &SessionSharedSectionPool);
+  if (!NT_SUCCESS(Status))
+  {
+    DPRINT1("Failed to initialize the shared section pool: Status 0x%x\n", Status);
+  }
+  
   Status = InitWindowStationImpl();
   if (!NT_SUCCESS(Status))
   {

Modified: trunk/reactos/subsys/win32k/makefile
--- trunk/reactos/subsys/win32k/makefile	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/subsys/win32k/makefile	2005-02-18 01:57:32 UTC (rev 13624)
@@ -53,7 +53,7 @@
 
 MAIN_OBJECTS = main/dllmain.o main/svctabm.o
 
-MISC_OBJECTS = misc/driver.o misc/error.o misc/math.o misc/object.o
+MISC_OBJECTS = misc/driver.o misc/error.o misc/math.o misc/object.o misc/ssec.o
 
 LDR_OBJECTS = ldr/loader.o
 

Added: trunk/reactos/subsys/win32k/misc/ssec.c
--- trunk/reactos/subsys/win32k/misc/ssec.c	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/subsys/win32k/misc/ssec.c	2005-02-18 01:57:32 UTC (rev 13624)
@@ -0,0 +1,420 @@
+/*
+ *  ReactOS W32 Subsystem
+ *  Copyright (C) 1998 - 2005 ReactOS Team
+ *
+ *  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.
+ */
+/*
+ * COPYRIGHT:        See COPYING in the top level directory
+ * PROJECT:          ReactOS kernel
+ * PURPOSE:          shared sections support
+ * FILE:             subsys/win32k/misc/ssec.c
+ * PROGRAMER:        Thomas Weidenmueller <w3seek@reactos.com>
+ */
+
+#include <w32k.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/*
+ * FIXME - instead of mapping the memory into system space using
+ *         MmMapViewInSystemSpace() we should rather use
+ *         MmMapViewInSessionSpace() to map it into session space!
+ */
+
+NTSTATUS INTERNAL_CALL
+IntUserCreateSharedSectionPool(IN ULONG MaximumPoolSize,
+                               IN PSHARED_SECTION_POOL *SharedSectionPool)
+{
+  PSHARED_SECTION_POOL Pool;
+  ULONG PoolStructSize;
+
+  ASSERT(SharedSectionPool);
+
+  PoolStructSize = ROUND_UP(sizeof(SHARED_SECTION_POOL), PAGE_SIZE);
+  Pool = ExAllocatePoolWithTag(NonPagedPool,
+                               PoolStructSize,
+                               TAG_SSECTPOOL);
+  if(Pool != NULL)
+  {
+    RtlZeroMemory(Pool, PoolStructSize);
+
+    /* initialize the session heap */
+    ExInitializeFastMutex(&Pool->Lock);
+    Pool->PoolSize = ROUND_UP(MaximumPoolSize, PAGE_SIZE);
+    Pool->PoolFree = Pool->PoolSize;
+    Pool->SharedSectionCount = 0;
+    Pool->SectionsArray.Next = NULL;
+    Pool->SectionsArray.nEntries = ((PoolStructSize - sizeof(SHARED_SECTION_POOL)) /
+                                    sizeof(SHARED_SECTION)) - 1;
+
+    ASSERT(Pool->SectionsArray.nEntries > 0);
+
+    *SharedSectionPool = Pool;
+
+    return STATUS_SUCCESS;
+  }
+
+  return STATUS_INSUFFICIENT_RESOURCES;
+}
+
+
+VOID INTERNAL_CALL
+IntUserFreeSharedSectionPool(IN PSHARED_SECTION_POOL SharedSectionPool)
+{
+  PSHARED_SECTIONS_ARRAY Array, OldArray;
+  PSHARED_SECTION SharedSection, LastSharedSection;
+
+  ASSERT(SharedSectionPool);
+
+  Array = &SharedSectionPool->SectionsArray;
+
+  ExAcquireFastMutex(&SharedSectionPool->Lock);
+  while(SharedSectionPool->SharedSectionCount > 0 && Array != NULL)
+  {
+    for(SharedSection = Array->SharedSection, LastSharedSection = SharedSection + Array->nEntries;
+        SharedSection != LastSharedSection && SharedSectionPool->SharedSectionCount > 0;
+        SharedSection++)
+    {
+      if(SharedSection->SectionObject != NULL)
+      {
+        ASSERT(SharedSection->SystemMappedBase);
+
+        /* FIXME - use MmUnmapViewInSessionSpace() once implemented! */
+        MmUnmapViewInSystemSpace(SharedSection->SystemMappedBase);
+        /* dereference the keep-alive reference so the section get's deleted */
+        ObDereferenceObject(SharedSection->SectionObject);
+
+        SharedSectionPool->SharedSectionCount--;
+      }
+    }
+
+    OldArray = Array;
+    Array = Array->Next;
+
+    /* all shared sections in this array were freed, link the following array to
+       the main session heap and free this array */
+    SharedSectionPool->SectionsArray.Next = Array;
+    ExFreePool(OldArray);
+  }
+
+  ASSERT(SharedSectionPool->SectionsArray.Next == NULL);
+  ASSERT(SharedSectionPool->SharedSectionCount == 0);
+
+  ExReleaseFastMutex(&SharedSectionPool->Lock);
+}
+
+
+NTSTATUS INTERNAL_CALL
+IntUserCreateSharedSection(IN PSHARED_SECTION_POOL SharedSectionPool,
+                           IN OUT PVOID *SystemMappedBase,
+                           IN OUT ULONG *SharedSectionSize)
+{
+  PSHARED_SECTIONS_ARRAY Array, LastArray;
+  PSHARED_SECTION FreeSharedSection, SharedSection, LastSharedSection;
+  LARGE_INTEGER SectionSize;
+  ULONG Size;
+  NTSTATUS Status;
+  
+  ASSERT(SharedSectionPool && SharedSectionSize && (*SharedSectionSize) > 0 && SystemMappedBase);
+  
+  FreeSharedSection = NULL;
+  
+  Size = ROUND_UP(*SharedSectionSize, PAGE_SIZE);
+
+  ExAcquireFastMutex(&SharedSectionPool->Lock);
+  
+  if(Size > SharedSectionPool->PoolFree)
+  {
+    ExReleaseFastMutex(&SharedSectionPool->Lock);
+    DPRINT1("Shared Section Pool limit (0x%x KB) reached, attempted to allocate a 0x%x KB shared section!\n",
+            SharedSectionPool->PoolSize / 1024, (*SharedSectionSize) / 1024);
+    return STATUS_INSUFFICIENT_RESOURCES;
+  }
+  
+  /* walk the array to find a free entry */
+  for(Array = &SharedSectionPool->SectionsArray, LastArray = Array;
+      Array != NULL && FreeSharedSection == NULL;
+      Array = Array->Next)
+  {
+    LastArray = Array;
+    
+    for(SharedSection = Array->SharedSection, LastSharedSection = SharedSection + Array->nEntries;
+        SharedSection != LastSharedSection;
+        SharedSection++)
+    {
+      if(SharedSection->SectionObject == NULL)
+      {
+        FreeSharedSection = SharedSection;
+        break;
+      }
+    }
+    
+    if(Array->Next != NULL)
+    {
+      LastArray = Array;
+    }
+  }
+  
+  ASSERT(LastArray);
+  
+  if(FreeSharedSection == NULL)
+  {
+    ULONG nNewEntries;
+    PSHARED_SECTIONS_ARRAY NewArray;
+    
+    ASSERT(LastArray->Next == NULL);
+    
+    /* couldn't find a free entry in the array, extend the array */
+
+    nNewEntries = ((PAGE_SIZE - sizeof(SHARED_SECTIONS_ARRAY)) / sizeof(SHARED_SECTION)) + 1;
+    NewArray = ExAllocatePoolWithTag(NonPagedPool,
+                                     sizeof(SHARED_SECTIONS_ARRAY) + ((nNewEntries - 1) *
+                                                                      sizeof(SHARED_SECTION)),
+                                     TAG_SSECTPOOL);
+    if(NewArray == NULL)
+    {
+      ExReleaseFastMutex(&SharedSectionPool->Lock);
+      DPRINT1("Failed to allocate new array for shared sections!\n");
+      return STATUS_INSUFFICIENT_RESOURCES;
+    }
+    
+    NewArray->nEntries = nNewEntries;
+    NewArray->Next = NULL;
+    LastArray->Next = NewArray;
+    
+    Array = NewArray;
+    FreeSharedSection = &Array->SharedSection[0];
+  }
+  
+  ASSERT(FreeSharedSection);
+  
+  /* now allocate a real section */
+  
+  SectionSize.QuadPart = Size;
+  Status = MmCreateSection(&FreeSharedSection->SectionObject,
+                           SECTION_ALL_ACCESS,
+                           NULL,
+                           &SectionSize,
+                           PAGE_EXECUTE_READWRITE,
+                           SEC_COMMIT,
+                           NULL,
+                           NULL);
+  if(NT_SUCCESS(Status))
+  {
+    Status = MmMapViewInSystemSpace(FreeSharedSection->SectionObject,
+                                    &FreeSharedSection->SystemMappedBase,
+                                    &FreeSharedSection->ViewSize);
+    if(NT_SUCCESS(Status))
+    {
+      (*SharedSectionSize) -= Size;
+      SharedSectionPool->SharedSectionCount++;
+      
+      *SystemMappedBase = FreeSharedSection->SystemMappedBase;
+      *SharedSectionSize = FreeSharedSection->ViewSize;
+    }
+    else
+    {
+      ObDereferenceObject(FreeSharedSection->SectionObject);
+      FreeSharedSection->SectionObject = NULL;
+      DPRINT1("Failed to map the shared section into system space! Status 0x%x\n", Status);
+    }
+  }
+  
+  ExReleaseFastMutex(&SharedSectionPool->Lock);
+  
+  return Status;
+}
+
+
+NTSTATUS INTERNAL_CALL
+InUserDeleteSharedSection(PSHARED_SECTION_POOL SharedSectionPool,
+                          PVOID SystemMappedBase)
+{
+  PSHARED_SECTIONS_ARRAY Array;
+  PSECTION_OBJECT SectionObject;
+  PSHARED_SECTION SharedSection, LastSharedSection;
+  NTSTATUS Status;
+
+  ASSERT(SharedSectionPool && SystemMappedBase);
+
+  SectionObject = NULL;
+
+  ExAcquireFastMutex(&SharedSectionPool->Lock);
+
+  for(Array = &SharedSectionPool->SectionsArray;
+      Array != NULL && SectionObject == NULL;
+      Array = Array->Next)
+  {
+    for(SharedSection = Array->SharedSection, LastSharedSection = SharedSection + Array->nEntries;
+        SharedSection != LastSharedSection;
+        SharedSection++)
+    {
+      if(SharedSection->SystemMappedBase == SystemMappedBase)
+      {
+        SectionObject = SharedSection->SectionObject;
+        SharedSection->SectionObject = NULL;
+        SharedSection->SystemMappedBase = NULL;
+
+        ASSERT(SharedSectionPool->SharedSectionCount > 0);
+        SharedSectionPool->SharedSectionCount--;
+        break;
+      }
+    }
+  }
+
+  ExReleaseFastMutex(&SharedSectionPool->Lock);
+
+  if(SectionObject != NULL)
+  {
+    Status = MmUnmapViewInSystemSpace(SystemMappedBase);
+    ObDereferenceObject(SectionObject);
+  }
+  else
+  {
+    DPRINT1("Couldn't find and delete a shared section with SystemMappedBase=0x%x!\n", SystemMappedBase);
+    Status = STATUS_UNSUCCESSFUL;
+  }
+
+  return Status;
+}
+
+
+NTSTATUS INTERNAL_CALL
+IntUserMapSharedSection(IN PSHARED_SECTION_POOL SharedSectionPool,
+                        IN PEPROCESS Process,
+                        IN PVOID SystemMappedBase,
+                        IN PLARGE_INTEGER SectionOffset  OPTIONAL,
+                        IN OUT PVOID *UserMappedBase,
+                        IN PULONG ViewSize  OPTIONAL,
+                        IN BOOLEAN ReadOnly)
+{
+  PSHARED_SECTIONS_ARRAY Array;
+  PSECTION_OBJECT SectionObject;
+  PSHARED_SECTION SharedSection, LastSharedSection;
+  NTSTATUS Status;
+
+  ASSERT(SharedSectionPool && Process && SystemMappedBase && UserMappedBase);
+
+  SectionObject = NULL;
+
+  ExAcquireFastMutex(&SharedSectionPool->Lock);
+
+  for(Array = &SharedSectionPool->SectionsArray;
+      Array != NULL && SectionObject == NULL;
+      Array = Array->Next)
+  {
+    for(SharedSection = Array->SharedSection, LastSharedSection = SharedSection + Array->nEntries;
+        SharedSection != LastSharedSection;
+        SharedSection++)
+    {
+      if(SharedSection->SystemMappedBase == SystemMappedBase)
+      {
+        SectionObject = SharedSection->SectionObject;
+        break;
+      }
+    }
+  }
+
+  if(SectionObject != NULL)
+  {
+    ULONG RealViewSize = (ViewSize ? min(*ViewSize, SharedSection->ViewSize) : SharedSection->ViewSize);
+    
+    ObReferenceObjectByPointer(SectionObject,
+                               (ReadOnly ? SECTION_MAP_READ : SECTION_MAP_READ | SECTION_MAP_WRITE),
+                               NULL,
+                               KernelMode);
+
+    Status = MmMapViewOfSection(SectionObject,
+                                Process,
+                                UserMappedBase,
+                                0,
+                                0,
+                                SectionOffset,
+                                &RealViewSize,
+                                ViewUnmap, /* not sure if we should inherit it... */
+                                MEM_COMMIT,
+                                (ReadOnly ? PAGE_READONLY : PAGE_READWRITE));
+    if(!NT_SUCCESS(Status))
+    {
+      DPRINT1("Failed to map shared section (readonly=%d) into user memory! Status: 0x%x\n", ReadOnly, Status);
+    }
+  }
+  else
+  {
+    DPRINT1("Couldn't find and map a shared section with SystemMappedBase=0x%x!\n", SystemMappedBase);
+    Status = STATUS_UNSUCCESSFUL;
+  }
+  
+  ExReleaseFastMutex(&SharedSectionPool->Lock);
+
+  return Status;
+}
+
+
+NTSTATUS INTERNAL_CALL
+IntUserUnMapSharedSection(IN PSHARED_SECTION_POOL SharedSectionPool,
+                          IN PEPROCESS Process,
+                          IN PVOID SystemMappedBase,
+                          IN PVOID UserMappedBase)
+{
+  PSHARED_SECTIONS_ARRAY Array;
+  PSECTION_OBJECT SectionObject;
+  PSHARED_SECTION SharedSection, LastSharedSection;
+  NTSTATUS Status;
+
+  ASSERT(SharedSectionPool && Process && SystemMappedBase && UserMappedBase);
+
+  SectionObject = NULL;
+
+  ExAcquireFastMutex(&SharedSectionPool->Lock);
+
+  for(Array = &SharedSectionPool->SectionsArray;
+      Array != NULL && SectionObject == NULL;
+      Array = Array->Next)
+  {
+    for(SharedSection = Array->SharedSection, LastSharedSection = SharedSection + Array->nEntries;
+        SharedSection != LastSharedSection;
+        SharedSection++)
+    {
+      if(SharedSection->SystemMappedBase == SystemMappedBase)
+      {
+        SectionObject = SharedSection->SectionObject;
+        break;
+      }
+    }
+  }
+  
+  ExReleaseFastMutex(&SharedSectionPool->Lock);
+
+  if(SectionObject != NULL)
+  {
+    Status = MmUnmapViewOfSection(Process,
+                                  UserMappedBase);
+    ObDereferenceObject(SectionObject);
+    if(!NT_SUCCESS(Status))
+    {
+      DPRINT1("Failed to unmap shared section UserMappedBase=0x%x! Status: 0x%x\n", UserMappedBase, Status);
+    }
+  }
+  else
+  {
+    DPRINT1("Couldn't find and unmap a shared section with SystemMappedBase=0x%x!\n", SystemMappedBase);
+    Status = STATUS_UNSUCCESSFUL;
+  }
+
+  return Status;
+}
Property changes on: trunk/reactos/subsys/win32k/misc/ssec.c
___________________________________________________________________
Name: svn:keywords
   + author date id revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/subsys/win32k/ntuser/misc.c
--- trunk/reactos/subsys/win32k/ntuser/misc.c	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/subsys/win32k/ntuser/misc.c	2005-02-18 01:57:32 UTC (rev 13624)
@@ -131,10 +131,6 @@
       Result = (DWORD)CsrInit();
       break;
     
-    case NOPARAM_ROUTINE_GDI_QUERY_TABLE:
-      Result = (DWORD)GDI_MapHandleTable(NtCurrentProcess());
-      break;
-    
     case NOPARAM_ROUTINE_MSQCLEARWAKEMASK:
       return (DWORD)IntMsqClearWakeMask();
 

Modified: trunk/reactos/subsys/win32k/objects/gdiobj.c
--- trunk/reactos/subsys/win32k/objects/gdiobj.c	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/subsys/win32k/objects/gdiobj.c	2005-02-18 01:57:32 UTC (rev 13624)
@@ -58,13 +58,15 @@
 
 typedef struct _GDI_HANDLE_TABLE
 {
+  /* the table must be located at the beginning of this structure so it can be
+     properly mapped! */
+  GDI_TABLE_ENTRY Entries[GDI_HANDLE_COUNT];
+  
   PPAGED_LOOKASIDE_LIST LookasideLists;
 
   SLIST_HEADER FreeEntriesHead;
   SLIST_ENTRY FreeEntries[((GDI_HANDLE_COUNT * sizeof(GDI_TABLE_ENTRY)) << 3) /
                           (sizeof(SLIST_ENTRY) << 3)];
-
-  GDI_TABLE_ENTRY Entries[GDI_HANDLE_COUNT];
 } GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE;
 
 typedef struct
@@ -125,11 +127,17 @@
 GDIOBJ_iAllocHandleTable(VOID)
 {
   PGDI_HANDLE_TABLE handleTable;
+  ULONG htSize;
   UINT ObjType;
   UINT i;
   PGDI_TABLE_ENTRY Entry;
 
-  handleTable = ExAllocatePoolWithTag(NonPagedPool, sizeof(GDI_HANDLE_TABLE), TAG_GDIHNDTBLE);
+  handleTable = NULL;
+  htSize = sizeof(GDI_HANDLE_TABLE);
+  
+  IntUserCreateSharedSection(SessionSharedSectionPool,
+                             (PVOID*)&handleTable,
+                             &htSize);
   ASSERT( handleTable );
   RtlZeroMemory(handleTable, sizeof(GDI_HANDLE_TABLE));
 
@@ -148,7 +156,8 @@
                                                       TAG_GDIHNDTBLE);
   if(handleTable->LookasideLists == NULL)
   {
-    ExFreePool(handleTable);
+    InUserDeleteSharedSection(SessionSharedSectionPool,
+                              handleTable);
     return NULL;
   }
 
@@ -1479,12 +1488,22 @@
 }
 
 PVOID INTERNAL_CALL
-GDI_MapHandleTable(HANDLE hProcess)
+GDI_MapHandleTable(PEPROCESS Process)
 {
-  DPRINT("%s:%i: %s(): FIXME - Map handle table into the process memory space!\n",
-         __FILE__, __LINE__, __FUNCTION__);
-  /* FIXME - Map the entire gdi handle table read-only to userland into the
-             scope of hProcess and return the pointer */
+  ULONG TableSize = sizeof(HandleTable->Entries);
+  PVOID MappedGdiTable = NULL; /* FIXME - try preferred GDI_HANDLE_TABLE_BASE_ADDRESS? */
+  NTSTATUS Status = IntUserMapSharedSection(SessionSharedSectionPool,
+                                            Process,
+                                            HandleTable,
+                                            NULL,
+                                            &MappedGdiTable,
+                                            &TableSize,
+                                            TRUE);
+  if(NT_SUCCESS(Status))
+  {
+    return MappedGdiTable;
+  }
+  
   return NULL;
 }
 

Modified: trunk/reactos/subsys/win32k/w32k.h
--- trunk/reactos/subsys/win32k/w32k.h	2005-02-17 16:41:28 UTC (rev 13623)
+++ trunk/reactos/subsys/win32k/w32k.h	2005-02-18 01:57:32 UTC (rev 13624)
@@ -28,6 +28,7 @@
 #include <rosrtl/string.h>
 #include <user32/callback.h>
 
+#include <include/ssec.h>
 #include <include/accelerator.h>
 #include <include/callback.h>
 #include <include/caret.h>