Author: gadamopoulos
Date: Mon Feb 20 13:23:32 2012
New Revision: 55755
URL: 
http://svn.reactos.org/svn/reactos?rev=55755&view=rev
Log:
[win32k]
- Do not store the PDEVOBJ and a fake name in MONITOR struct. Use MONITOR.HDEV instead
(which is an opaque pointer to a PDEVOBJ)
Modified:
    trunk/reactos/subsystems/win32/win32k/include/monitor.h
    trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c
    trunk/reactos/subsystems/win32/win32k/ntuser/display.c
    trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c
    trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c
    trunk/reactos/subsystems/win32/win32k/ntuser/window.c
    trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
    trunk/reactos/subsystems/win32/win32k/objects/device.c
Modified: trunk/reactos/subsystems/win32/win32k/include/monitor.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/monitor.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/monitor.h [iso-8859-1] Mon Feb 20
13:23:32 2012
@@ -21,18 +21,13 @@
     SHORT   cFullScreen;
     SHORT   cWndStack;
     HDEV    hDev;
-
-    // ReactOS specific fields:
-    UNICODE_STRING DeviceName;  /* Name of the monitor */
-    PDEVOBJ        *GdiDevice;  /* Pointer to the GDI device to
-                                   which this monitor is attached */
 } MONITOR, *PMONITOR;
-NTSTATUS IntAttachMonitor(PDEVOBJ *pGdiDevice, ULONG DisplayNumber);
-NTSTATUS IntDetachMonitor(PDEVOBJ *pGdiDevice);
-NTSTATUS IntUpdateMonitorSize(IN PDEVOBJ *pGdiDevice);
-PMONITOR FASTCALL UserGetMonitorObject(IN HMONITOR);
-PMONITOR FASTCALL IntGetPrimaryMonitor(VOID);
-PMONITOR FASTCALL IntMonitorFromRect(PRECTL,DWORD);
+NTSTATUS NTAPI UserAttachMonitor(IN HDEV hDev);
+NTSTATUS NTAPI UserDetachMonitor(HDEV hDev);
+NTSTATUS NTAPI UserUpdateMonitorSize(IN HDEV hDev);
+PMONITOR NTAPI UserGetMonitorObject(IN HMONITOR);
+PMONITOR NTAPI UserGetPrimaryMonitor(VOID);
+PMONITOR NTAPI UserMonitorFromRect(PRECTL,DWORD);
 /* EOF */
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] Mon Feb 20
13:23:32 2012
@@ -565,9 +565,8 @@
     }
     else
     {
-        HDEV hDev;
-        hDev = (HDEV)pPrimarySurface;
-        DesktopHDC = IntGdiCreateDisplayDC(hDev, DcType, EmptyDC);
+        PMONITOR pMonitor = UserGetPrimaryMonitor();
+        DesktopHDC = IntGdiCreateDisplayDC(pMonitor->hDev, DcType, EmptyDC);
     }
     return DesktopHDC;
@@ -860,7 +859,7 @@
    /*
     * Try to open already existing desktop
     */
-
+
    TRACE("Trying to open desktop (%wZ)\n", &DesktopName);
    Status = ObOpenObjectByName(
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/display.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/display.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/display.c [iso-8859-1] Mon Feb 20
13:23:32 2012
@@ -779,7 +779,7 @@
         //IntvGetDeviceCaps(&PrimarySurface, &GdiHandleTable->DevCaps);
         /* Set new size of the monitor */
-        IntUpdateMonitorSize(ppdev);
+        UserUpdateMonitorSize((HDEV)ppdev);
         /* Remove all cursor clipping */
         UserClipCursor(NULL);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c [iso-8859-1] Mon Feb 20
13:23:32 2012
@@ -49,9 +49,6 @@
 void
 IntDestroyMonitorObject(IN PMONITOR pMonitor)
 {
-    /* Free monitor name */
-    RtlFreeUnicodeString(&pMonitor->DeviceName);
-
     /* Remove monitor region */
     if (pMonitor->hrgnMonitor)
     {
@@ -73,7 +70,7 @@
  *   hMonitor
  *      Handle of MONITOR object
  */
-PMONITOR FASTCALL
+PMONITOR NTAPI
 UserGetMonitorObject(IN HMONITOR hMonitor)
 {
     PMONITOR pMonitor;
@@ -94,16 +91,15 @@
     return pMonitor;
 }
-/* IntGetPrimaryMonitor
+/* UserGetPrimaryMonitor
  *
  * Returns a PMONITOR for the primary monitor
  *
  * Return value
  *   PMONITOR
  */
-PMONITOR
-FASTCALL
-IntGetPrimaryMonitor()
+PMONITOR NTAPI
+UserGetPrimaryMonitor()
 {
     PMONITOR pMonitor;
@@ -117,7 +113,7 @@
     return pMonitor;
 }
-/* IntAttachMonitor
+/* UserAttachMonitor
  *
  * Creates a new MONITOR and appends it to the list of monitors.
  *
@@ -129,12 +125,10 @@
  * Return value
  *   Returns a NTSTATUS
  */
-NTSTATUS
-IntAttachMonitor(IN PDEVOBJ *pGdiDevice,
-                 IN ULONG DisplayNumber)
+NTSTATUS NTAPI
+UserAttachMonitor(IN HDEV hDev)
 {
     PMONITOR pMonitor;
-    WCHAR Buffer[CCHDEVICENAME];
     TRACE("Attaching monitor...\n");
@@ -145,17 +139,8 @@
         TRACE("Couldnt create monitor object\n");
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-
-    _snwprintf(Buffer, CCHDEVICENAME, L"\\\\.\\DISPLAY%d", DisplayNumber + 1);
-    if (!RtlCreateUnicodeString(&pMonitor->DeviceName, Buffer))
-    {
-        TRACE("Couldn't duplicate monitor name!\n");
-        UserDereferenceObject(pMonitor);
-        UserDeleteObject(UserHMGetHandle(pMonitor), otMonitor);
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    pMonitor->GdiDevice = pGdiDevice;
+
+    pMonitor->hDev = hDev;
     pMonitor->cWndStack = 0;
     if (gMonitorList == NULL)
@@ -174,12 +159,12 @@
         pmonLast->pMonitorNext = pMonitor;
     }
-    IntUpdateMonitorSize(pGdiDevice);
+    UserUpdateMonitorSize(hDev);
     return STATUS_SUCCESS;
 }
-/* IntDetachMonitor
+/* UserDetachMonitor
  *
  * Deletes a MONITOR and removes it from the list of monitors.
  *
@@ -190,15 +175,15 @@
  * Return value
  *   Returns a NTSTATUS
  */
-NTSTATUS
-IntDetachMonitor(IN PDEVOBJ *pGdiDevice)
+NTSTATUS NTAPI
+UserDetachMonitor(IN HDEV hDev)
 {
     PMONITOR pMonitor = gMonitorList, *pLink = &gMonitorList;
     /* Find monitor attached to given device */
     while (pMonitor != NULL)
     {
-        if (pMonitor->GdiDevice == pGdiDevice)
+        if (pMonitor->hDev == hDev)
             break;
         pLink = &pMonitor->pMonitorNext;
@@ -224,7 +209,7 @@
     return STATUS_SUCCESS;
 }
-/* IntUpdateMonitorSize
+/* UserUpdateMonitorSize
  *
  * Reset size of the monitor using atached device
  *
@@ -236,15 +221,16 @@
  * Return value
  *   Returns a NTSTATUS
  */
-NTSTATUS
-IntUpdateMonitorSize(IN PDEVOBJ *pGdiDevice)
+NTSTATUS NTAPI
+UserUpdateMonitorSize(IN HDEV hDev)
 {
        PMONITOR pMonitor;
+    SIZEL DeviceSize;
     /* Find monitor attached to given device */
     for (pMonitor = gMonitorList; pMonitor != NULL; pMonitor = pMonitor->pMonitorNext)
     {
-        if (pMonitor->GdiDevice == pGdiDevice)
+        if (pMonitor->hDev == hDev)
             break;
     }
@@ -253,12 +239,15 @@
         /* No monitor has been found */
         return STATUS_INVALID_PARAMETER;
     }
+
+    /* Get the size of the hdev */
+    PDEVOBJ_sizl((PPDEVOBJ)hDev, &DeviceSize);
     /* Update monitor size */
     pMonitor->rcMonitor.left  = 0;
     pMonitor->rcMonitor.top   = 0;
-    pMonitor->rcMonitor.right  = pMonitor->rcMonitor.left +
pMonitor->GdiDevice->gdiinfo.ulHorzRes;
-    pMonitor->rcMonitor.bottom = pMonitor->rcMonitor.top +
pMonitor->GdiDevice->gdiinfo.ulVertRes;
+    pMonitor->rcMonitor.right  = pMonitor->rcMonitor.left + DeviceSize.cx;
+    pMonitor->rcMonitor.bottom = pMonitor->rcMonitor.top + DeviceSize.cy;
     pMonitor->rcWork = pMonitor->rcMonitor;
     /* Destroy monitor region... */
@@ -403,9 +392,8 @@
     return cMonitors;
 }
-PMONITOR
-FASTCALL
-IntMonitorFromRect(
+PMONITOR NTAPI
+UserMonitorFromRect(
     PRECTL pRect,
     DWORD dwFlags)
 {
@@ -703,6 +691,7 @@
     MONITORINFOEXW MonitorInfo;
     NTSTATUS Status;
     BOOL bRet = FALSE;
+    PWCHAR pwstrDeviceName;
     TRACE("Enter NtUserGetMonitorInfo\n");
     UserEnterShared();
@@ -721,6 +710,8 @@
         SetLastNtError(STATUS_INVALID_PARAMETER);
         goto cleanup;
     }
+
+    pwstrDeviceName =
((PPDEVOBJ)(pMonitor->hDev))->pGraphicsDevice->szWinDeviceName;
     /* Get size of pMonitorInfoUnsafe */
     Status = MmCopyFromCaller(&MonitorInfo.cbSize,
&pMonitorInfoUnsafe->cbSize, sizeof(MonitorInfo.cbSize));
@@ -750,8 +741,8 @@
     {
         RtlStringCbCopyNExW(MonitorInfo.szDevice,
                           sizeof(MonitorInfo.szDevice),
-                          pMonitor->DeviceName.Buffer,
-                          pMonitor->DeviceName.Length,
+                          pwstrDeviceName,
+                          (wcslen(pwstrDeviceName)+1) * sizeof(WCHAR),
                           NULL, NULL, STRSAFE_FILL_BEHIND_NULL);
     }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c [iso-8859-1] Mon Feb 20
13:23:32 2012
@@ -947,7 +947,7 @@
         case SPI_GETWORKAREA:
         {
-            PMONITOR pmonitor = IntGetPrimaryMonitor();
+            PMONITOR pmonitor = UserGetPrimaryMonitor();
             if(!pmonitor)
                 return 0;
@@ -959,7 +959,7 @@
         {
             /* FIXME: We should set the work area of the monitor
                       that contains the specified rectangle */
-            PMONITOR pmonitor = IntGetPrimaryMonitor();
+            PMONITOR pmonitor = UserGetPrimaryMonitor();
             RECT rcWorkArea;
             if(!pmonitor)
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] Mon Feb 20 13:23:32
2012
@@ -1463,7 +1463,7 @@
       PMONITOR pMonitor;
       PRTL_USER_PROCESS_PARAMETERS ProcessParams;
-      pMonitor = IntGetPrimaryMonitor();
+      pMonitor = UserGetPrimaryMonitor();
       /* Check if we don't have a monitor attached yet */
       if(pMonitor == NULL)
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c [iso-8859-1] Mon Feb 20 13:23:32
2012
@@ -323,7 +323,7 @@
          else
          {
             RECTL WorkArea;
-            PMONITOR pmonitor = IntMonitorFromRect(&Rect, MONITOR_DEFAULTTOPRIMARY );
+            PMONITOR pmonitor = UserMonitorFromRect(&Rect, MONITOR_DEFAULTTOPRIMARY
);
             // FIXME: support DPI aware, rcWorkDPI/Real etc..
             if (!(Wnd->style & WS_MAXIMIZEBOX) || (Wnd->state &
WNDS_HASCAPTION) || pmonitor->cFullScreen)
@@ -389,7 +389,7 @@
    if ( Wnd->spwndParent == Wnd->head.rpdesk->pDeskInfo->spwnd &&
        !(Wnd->ExStyle & WS_EX_TOOLWINDOW))
    {
-      PMONITOR pmonitor = IntMonitorFromRect(&lpwndpl->rcNormalPosition,
MONITOR_DEFAULTTOPRIMARY );
+      PMONITOR pmonitor = UserMonitorFromRect(&lpwndpl->rcNormalPosition,
MONITOR_DEFAULTTOPRIMARY );
       // FIXME: support DPI aware, rcWorkDPI/Real etc..
       if (Wnd->InternalPos.flags & WPF_MININIT)
@@ -414,7 +414,7 @@
 /* make sure the specified rect is visible on screen */
 static void make_rect_onscreen( RECT *rect )
 {
-    PMONITOR pmonitor = IntMonitorFromRect( rect, MONITOR_DEFAULTTONEAREST ); // Wine
uses this.
+    PMONITOR pmonitor = UserMonitorFromRect( rect, MONITOR_DEFAULTTONEAREST ); // Wine
uses this.
     //  FIXME: support DPI aware, rcWorkDPI/Real etc..
     if (!pmonitor) return;
@@ -744,7 +744,7 @@
     co_IntSendMessage(Window->head.h, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax);
     /* if the app didn't change the values, adapt them for the current monitor */
-    if ((monitor = IntGetPrimaryMonitor()))
+    if ((monitor = UserGetPrimaryMonitor()))
     {
         RECT rc_work;
Modified: trunk/reactos/subsystems/win32/win32k/objects/device.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/device.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/device.c [iso-8859-1] Mon Feb 20
13:23:32 2012
@@ -30,16 +30,9 @@
 {
     SIZEL SurfSize;
     SURFOBJ *pso;
-    BOOL calledFromUser;
-
-    calledFromUser = UserIsEntered(); // FIXME: Possibly upgrade a shared lock
-    if (!calledFromUser)
-    {
-        UserEnterExclusive();
-    }
     /* Attach monitor */
-    IntAttachMonitor(gppdevPrimary, 0);
+    UserAttachMonitor((HDEV)gppdevPrimary);
     DPRINT("IntCreatePrimarySurface, pPrimarySurface=%p,
pPrimarySurface->pSurface = %p\n",
         pPrimarySurface, pPrimarySurface->pSurface);
@@ -56,11 +49,6 @@
     // Init Primary Displays Device Capabilities.
     PDEVOBJ_vGetDeviceCaps(pPrimarySurface, &GdiHandleTable->DevCaps);
-
-    if (!calledFromUser)
-    {
-        UserLeave();
-    }
     return TRUE;
 }