Author: hbelusca
Date: Sun Oct 28 12:13:03 2012
New Revision: 57635
URL: 
http://svn.reactos.org/svn/reactos?rev=57635&view=rev
Log:
- Synchronize with trunk's revision r57633.
[WIN32CSR/BOOTDATA]
- Finally get rid of win32csr, being replaced by winsrv and consrv.
- Remove it from the subsystem command-line.
[WINSRV]
- Move a hack from win32csr to winsrv.
Removed:
    branches/ros-csrss/win32ss/user/win32csr/
Modified:
    branches/ros-csrss/   (props changed)
    branches/ros-csrss/boot/bootdata/hivesys_amd64.inf
    branches/ros-csrss/boot/bootdata/hivesys_arm.inf
    branches/ros-csrss/boot/bootdata/hivesys_i386.inf
    branches/ros-csrss/ntoskrnl/ex/win32k.c
    branches/ros-csrss/ntoskrnl/ps/win32.c
    branches/ros-csrss/win32ss/CMakeLists.txt
    branches/ros-csrss/win32ss/gdi/ntgdi/device.c
    branches/ros-csrss/win32ss/pch.h
    branches/ros-csrss/win32ss/user/ntuser/accelerator.c
    branches/ros-csrss/win32ss/user/ntuser/callback.c
    branches/ros-csrss/win32ss/user/ntuser/callproc.c
    branches/ros-csrss/win32ss/user/ntuser/class.c
    branches/ros-csrss/win32ss/user/ntuser/class.h
    branches/ros-csrss/win32ss/user/ntuser/clipboard.c
    branches/ros-csrss/win32ss/user/ntuser/csr.c
    branches/ros-csrss/win32ss/user/ntuser/cursoricon.c
    branches/ros-csrss/win32ss/user/ntuser/desktop.c
    branches/ros-csrss/win32ss/user/ntuser/desktop.h
    branches/ros-csrss/win32ss/user/ntuser/event.c
    branches/ros-csrss/win32ss/user/ntuser/hook.c
    branches/ros-csrss/win32ss/user/ntuser/input.c
    branches/ros-csrss/win32ss/user/ntuser/kbdlayout.c
    branches/ros-csrss/win32ss/user/ntuser/main.c
    branches/ros-csrss/win32ss/user/ntuser/menu.c
    branches/ros-csrss/win32ss/user/ntuser/message.c
    branches/ros-csrss/win32ss/user/ntuser/monitor.c
    branches/ros-csrss/win32ss/user/ntuser/msgqueue.c
    branches/ros-csrss/win32ss/user/ntuser/msgqueue.h
    branches/ros-csrss/win32ss/user/ntuser/object.c
    branches/ros-csrss/win32ss/user/ntuser/object.h
    branches/ros-csrss/win32ss/user/ntuser/simplecall.c
    branches/ros-csrss/win32ss/user/ntuser/timer.c
    branches/ros-csrss/win32ss/user/ntuser/window.c
    branches/ros-csrss/win32ss/user/ntuser/window.h
    branches/ros-csrss/win32ss/user/ntuser/winsta.c
    branches/ros-csrss/win32ss/user/user32/windows/cursoricon.c
    branches/ros-csrss/win32ss/user/winsrv/harderror.c
    branches/ros-csrss/win32ss/user/winsrv/init.c
    branches/ros-csrss/win32ss/user/winsrv/shutdown.c
Propchange: branches/ros-csrss/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Oct 28 12:13:03 2012
@@ -13,4 +13,4 @@
/branches/usb-bringup:51335,51337,51341-51343,51348,51350,51353,51355,51365-51369,51372,51384-54388,54396-54398,54736-54737,54752-54754,54756-54760,54762,54764-54765,54767-54768,54772,54774-54777,54781,54787,54790-54792,54797-54798,54806,54808,54834-54838,54843,54850,54852,54856,54858-54859
 /branches/usb-bringup-trunk:55019-55543,55548-55554,55556-55567
 /branches/wlan-bringup:54809-54998
-/trunk/reactos:57561-57633
+/trunk/reactos:57561-57634
Modified: branches/ros-csrss/boot/bootdata/hivesys_amd64.inf
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/boot/bootdata/hivesys…
==============================================================================
--- branches/ros-csrss/boot/bootdata/hivesys_amd64.inf [iso-8859-1] (original)
+++ branches/ros-csrss/boot/bootdata/hivesys_amd64.inf [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -1239,7 +1239,7 @@
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Optional",0x00010000,"Posix"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Required",0x00010000,"Debug","Windows"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe
ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=consrv:ConServerDllInitialization,2 ServerDll=win32csr:Win32CsrInitialization,4
ProfileControl=Off MaxRequestThreads=16"
+HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe
ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=consrv:ConServerDllInitialization,2 ProfileControl=Off
MaxRequestThreads=16"
 ; WOW Support
HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
Modified: branches/ros-csrss/boot/bootdata/hivesys_arm.inf
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/boot/bootdata/hivesys…
==============================================================================
--- branches/ros-csrss/boot/bootdata/hivesys_arm.inf [iso-8859-1] (original)
+++ branches/ros-csrss/boot/bootdata/hivesys_arm.inf [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -794,7 +794,7 @@
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Optional",0x00010000,"Posix"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Required",0x00010000,"Debug","Windows"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe
ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=consrv:ConServerDllInitialization,2 ServerDll=win32csr:Win32CsrInitialization,4
ProfileControl=Off MaxRequestThreads=16"
+HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe
ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=consrv:ConServerDllInitialization,2 ProfileControl=Off
MaxRequestThreads=16"
 ; WOW Support
HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
Modified: branches/ros-csrss/boot/bootdata/hivesys_i386.inf
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/boot/bootdata/hivesys…
==============================================================================
--- branches/ros-csrss/boot/bootdata/hivesys_i386.inf [iso-8859-1] (original)
+++ branches/ros-csrss/boot/bootdata/hivesys_i386.inf [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -1239,7 +1239,7 @@
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Optional",0x00010000,"Posix"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Required",0x00010000,"Debug","Windows"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe
ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=consrv:ConServerDllInitialization,2 ServerDll=win32csr:Win32CsrInitialization,4
ProfileControl=Off MaxRequestThreads=16"
+HKLM,"SYSTEM\CurrentControlSet\Control\Session
Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe
ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=consrv:ConServerDllInitialization,2 ProfileControl=Off
MaxRequestThreads=16"
 ; WOW Support
HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
Modified: branches/ros-csrss/ntoskrnl/ex/win32k.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/ntoskrnl/ex/win32k.c?…
==============================================================================
--- branches/ros-csrss/ntoskrnl/ex/win32k.c [iso-8859-1] (original)
+++ branches/ros-csrss/ntoskrnl/ex/win32k.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -40,6 +40,8 @@
 PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpWindowStationObjectOkToClose = NULL;
 PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpDesktopObjectOkToClose = NULL;
 PKWIN32_DELETEMETHOD_CALLOUT ExpDesktopObjectDelete = NULL;
+PKWIN32_OPENMETHOD_CALLOUT ExpDesktopObjectOpen = NULL;
+PKWIN32_CLOSEMETHOD_CALLOUT ExpDesktopObjectClose = NULL;
 /* FUNCTIONS ****************************************************************/
@@ -131,6 +133,44 @@
     /* Call the Registered Callback */
     ExpDesktopObjectDelete(&Parameters);
+}
+
+NTSTATUS
+NTAPI
+ExpDesktopOpen(IN OB_OPEN_REASON Reason,
+               IN PEPROCESS Process OPTIONAL,
+               IN PVOID ObjectBody,
+               IN ACCESS_MASK GrantedAccess,
+               IN ULONG HandleCount)
+{
+    WIN32_OPENMETHOD_PARAMETERS Parameters;
+
+    Parameters.OpenReason = Reason;
+    Parameters.Process = Process;
+    Parameters.Object = ObjectBody;
+    Parameters.GrantedAccess = GrantedAccess;
+    Parameters.HandleCount = HandleCount;
+
+    return ExpDesktopObjectOpen(&Parameters);
+}
+
+VOID
+NTAPI
+ExpDesktopClose(IN PEPROCESS Process OPTIONAL,
+                IN PVOID Object,
+                IN ACCESS_MASK GrantedAccess,
+                IN ULONG ProcessHandleCount,
+                IN ULONG SystemHandleCount)
+{
+    WIN32_CLOSEMETHOD_PARAMETERS Parameters;
+
+    Parameters.Process = Process;
+    Parameters.Object = Object;
+    Parameters.AccessMask = GrantedAccess;
+    Parameters.ProcessHandleCount = ProcessHandleCount;
+    Parameters.SystemHandleCount = SystemHandleCount;
+
+    ExpDesktopObjectClose(&Parameters);
 }
 BOOLEAN
@@ -169,6 +209,8 @@
     ObjectTypeInitializer.DeleteProcedure = ExpDesktopDelete;
     ObjectTypeInitializer.ParseProcedure = NULL;
     ObjectTypeInitializer.OkayToCloseProcedure = ExpDesktopOkToClose;
+    ObjectTypeInitializer.OpenProcedure = ExpDesktopOpen;
+    ObjectTypeInitializer.CloseProcedure = ExpDesktopClose;
     ObCreateObjectType(&Name,
                        &ObjectTypeInitializer,
                        NULL,
Modified: branches/ros-csrss/ntoskrnl/ps/win32.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/ntoskrnl/ps/win32.c?r…
==============================================================================
--- branches/ros-csrss/ntoskrnl/ps/win32.c [iso-8859-1] (original)
+++ branches/ros-csrss/ntoskrnl/ps/win32.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -23,6 +23,8 @@
 extern PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpWindowStationObjectOkToClose;
 extern PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpDesktopObjectOkToClose;
 extern PKWIN32_DELETEMETHOD_CALLOUT ExpDesktopObjectDelete;
+extern PKWIN32_OPENMETHOD_CALLOUT ExpDesktopObjectOpen;
+extern PKWIN32_CLOSEMETHOD_CALLOUT ExpDesktopObjectClose;
 extern PKWIN32_POWEREVENT_CALLOUT PopEventCallout;
 /* PRIVATE FUNCTIONS *********************************************************/
@@ -121,6 +123,8 @@
     ExpWindowStationObjectOkToClose = CalloutData->WindowStationOkToCloseProcedure;
     ExpDesktopObjectOkToClose = CalloutData->DesktopOkToCloseProcedure;
     ExpDesktopObjectDelete = CalloutData->DesktopDeleteProcedure;
+    ExpDesktopObjectOpen = CalloutData->DesktopOpenProcedure;
+    ExpDesktopObjectClose = CalloutData->DesktopCloseProcedure;
     PopEventCallout = CalloutData->PowerEventCallout;
     KeGdiFlushUserBatch = CalloutData->BatchFlushRoutine;
 }
Modified: branches/ros-csrss/win32ss/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/CMakeLists.tx…
==============================================================================
--- branches/ros-csrss/win32ss/CMakeLists.txt [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/CMakeLists.txt [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -14,7 +14,6 @@
 add_subdirectory(reactx)
 add_subdirectory(user/consrv)
 add_subdirectory(user/user32)
-add_subdirectory(user/win32csr)
 add_subdirectory(user/winsrv)
 spec2def(win32k.sys win32k.spec ADD_IMPORTLIB)
Modified: branches/ros-csrss/win32ss/gdi/ntgdi/device.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/gdi/ntgdi/dev…
==============================================================================
--- branches/ros-csrss/win32ss/gdi/ntgdi/device.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/gdi/ntgdi/device.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -32,15 +32,15 @@
     SURFOBJ *pso;
     PDESKTOP rpDesk;
+    /* Create surface */
+    pso = &PDEVOBJ_pSurface(gppdevPrimary)->SurfObj;
+    SurfSize = pso->sizlBitmap;
+
     /* Attach monitor */
     UserAttachMonitor((HDEV)gppdevPrimary);
     DPRINT("IntCreatePrimarySurface, gppdevPrimary=%p, gppdevPrimary->pSurface =
%p\n",
         gppdevPrimary, gppdevPrimary->pSurface);
-
-    /* Create surface */
-    pso = &PDEVOBJ_pSurface(gppdevPrimary)->SurfObj;
-    SurfSize = pso->sizlBitmap;
     /* Put the pointer in the center of the screen */
     gpsi->ptCursor.x = pso->sizlBitmap.cx / 2;
Modified: branches/ros-csrss/win32ss/pch.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/pch.h?rev=576…
==============================================================================
--- branches/ros-csrss/win32ss/pch.h [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/pch.h [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -36,6 +36,7 @@
 /* Win32 headers */
 /* FIXME: Defines in winbase.h that we need... */
 typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
+#define MAKEINTATOM(i) (LPWSTR)((ULONG_PTR)((WORD)(i)))
 #define WINBASEAPI
 #define STARTF_USESIZE 2
 #define STARTF_USEPOSITION 4
Modified: branches/ros-csrss/win32ss/user/ntuser/accelerator.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/a…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/accelerator.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/accelerator.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -257,7 +257,7 @@
         RETURN( (HACCEL) NULL );
     }
-    Accel = UserCreateObject(gHandleTable, NULL, (PHANDLE)&hAccel, otAccel,
sizeof(ACCELERATOR_TABLE));
+    Accel = UserCreateObject(gHandleTable, NULL, NULL, (PHANDLE)&hAccel, otAccel,
sizeof(ACCELERATOR_TABLE));
     if (Accel == NULL)
     {
Modified: branches/ros-csrss/win32ss/user/ntuser/callback.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/c…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/callback.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/callback.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -130,6 +130,9 @@
    BOOL bResult;
    ULONG_PTR pLibNameBuffer = 0, pInitFuncBuffer = 0;
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    TRACE("co_IntClientLoadLibrary: %S, %S, %d, %d\n", pstrLibName->Buffer,
pstrLibName->Buffer, Unload, ApiHook);
    /* Calculate the size of the argument */
@@ -235,6 +238,9 @@
    PWND pWnd;
    ULONG ResultLength;
    NTSTATUS Status;
+
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
    Arguments.Callback = CompletionCallback;
    Arguments.Wnd = hWnd;
@@ -280,6 +286,9 @@
    ULONG ResultLength;
    ULONG ArgumentLength;
    LRESULT Result;
+
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
    if (0 < lParamBufferSize)
    {
@@ -363,6 +372,9 @@
    NTSTATUS Status;
    PVOID ResultPointer;
    ULONG ResultLength;
+
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
    ResultPointer = NULL;
    ResultLength = sizeof(LRESULT);
@@ -394,6 +406,8 @@
    return (HMENU)Result;
 }
+extern HCURSOR gDesktopCursor;
+
 BOOL APIENTRY
 co_IntLoadDefaultCursors(VOID)
 {
@@ -402,8 +416,11 @@
    ULONG ResultLength;
    BOOL DefaultCursor = TRUE;
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    ResultPointer = NULL;
-   ResultLength = sizeof(LRESULT);
+   ResultLength = sizeof(HCURSOR);
    UserLeaveCo();
@@ -414,6 +431,9 @@
                                &ResultLength);
    UserEnterCo();
+
+   /* HACK: The desktop class doen't have a proper cursor yet, so set it here */
+    gDesktopCursor = *((HCURSOR*)ResultPointer);
    if (!NT_SUCCESS(Status))
    {
@@ -448,6 +468,8 @@
    UINT lParamSize = 0;
    ASSERT(Proc);
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
    pti = PsGetCurrentThreadWin32Thread();
    if (pti->TIF_flags & TIF_INCLEANUP)
@@ -834,6 +856,9 @@
    ULONG ArgumentLength, ResultLength;
    PVOID Argument, ResultPointer;
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    ArgumentLength = ResultLength = 0;
    Argument = ResultPointer = NULL;
Modified: branches/ros-csrss/win32ss/user/ntuser/callproc.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/c…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/callproc.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/callproc.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -35,6 +35,7 @@
     NewCallProc = (PCALLPROCDATA)UserCreateObject(gHandleTable,
                                              Desktop,
+                                             NULL,
                                              &Handle,
                                              otCallProc,
                                              sizeof(CALLPROCDATA));
Modified: branches/ros-csrss/win32ss/user/ntuser/class.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/c…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/class.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/class.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -641,9 +641,17 @@
     PCLS Class;
     ASSERT(BaseClass->pclsBase == BaseClass);
-    Class = IntGetClassForDesktop(BaseClass,
-                                  ClassLink,
-                                  Desktop);
+    if (Desktop != NULL)
+    {
+        Class = IntGetClassForDesktop(BaseClass,
+                                      ClassLink,
+                                      Desktop);
+    }
+    else
+    {
+        Class = BaseClass;
+    }
+
     if (Class != NULL)
     {
         Class->cWndReferenceCount++;
@@ -1286,13 +1294,16 @@
 }
 PCLS
-IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance)
+IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance, BOOL
bDesktopThread)
 {
    PCLS *ClassLink, Class = NULL;
    RTL_ATOM ClassAtom;
    PTHREADINFO pti;
-   pti = PsGetCurrentThreadWin32Thread();
+   if (bDesktopThread)
+       pti = gptiDesktopThread;
+   else
+       pti = PsGetCurrentThreadWin32Thread();
    if ( !(pti->ppi->W32PF_flags & W32PF_CLASSESREGISTERED ))
    {
Modified: branches/ros-csrss/win32ss/user/ntuser/class.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/c…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/class.h [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/class.h [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -39,7 +39,7 @@
                     IN PPROCESSINFO pi);
 PCLS
-IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance);
+IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance, BOOL
bDesktopThread);
 BOOL FASTCALL UserRegisterSystemClasses(VOID);
Modified: branches/ros-csrss/win32ss/user/ntuser/clipboard.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/c…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/clipboard.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/clipboard.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -182,6 +182,7 @@
     /* Create the clipboard data */
     pClipboardData = (PCLIPBOARDDATA)UserCreateObject(gHandleTable,
                                                       NULL,
+                                                      NULL,
                                                       &hMem,
                                                       otClipBoardData,
                                                       cjDataSize);
@@ -293,7 +294,7 @@
         PCLIPBOARDDATA pMemObj;
         HANDLE hMem;
-        pMemObj = (PCLIPBOARDDATA)UserCreateObject(gHandleTable, NULL, &hMem,
otClipBoardData,
+        pMemObj = (PCLIPBOARDDATA)UserCreateObject(gHandleTable, NULL, NULL, &hMem,
otClipBoardData,
                                                    sizeof(CLIPBOARDDATA) + sizeof(LCID));
         if (pMemObj)
         {
@@ -1080,7 +1081,7 @@
     UserEnterExclusive();
     /* Create Clipboard data object */
-    pMemObj = UserCreateObject(gHandleTable, NULL, &hMem, otClipBoardData,
sizeof(CLIPBOARDDATA) + cbData);
+    pMemObj = UserCreateObject(gHandleTable, NULL, NULL, &hMem, otClipBoardData,
sizeof(CLIPBOARDDATA) + cbData);
     if (!pMemObj)
         goto cleanup;
Modified: branches/ros-csrss/win32ss/user/ntuser/csr.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/c…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/csr.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/csr.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -93,74 +93,4 @@
     return Status;
 }
-
-NTSTATUS
-APIENTRY
-CsrInsertObject(HANDLE ObjectHandle,
-                ACCESS_MASK DesiredAccess,
-                PHANDLE Handle)
-{
-   NTSTATUS Status;
-   HANDLE CsrProcessHandle;
-   OBJECT_ATTRIBUTES ObjectAttributes;
-   CLIENT_ID Cid;
-
-   /* Put CSR'S CID */
-   Cid.UniqueProcess = CsrProcess->UniqueProcessId;
-   Cid.UniqueThread = 0;
-
-   /* Empty Attributes */
-   InitializeObjectAttributes(&ObjectAttributes,
-                              NULL,
-                              0,
-                              NULL,
-                              NULL);
-
-   /* Get a Handle to Csrss */
-   Status = ZwOpenProcess(&CsrProcessHandle,
-                          PROCESS_DUP_HANDLE,
-                          &ObjectAttributes,
-                          &Cid);
-
-   if ((NT_SUCCESS(Status)))
-   {
-      /* Duplicate the Handle */
-      Status = ZwDuplicateObject(NtCurrentProcess(),
-                                 ObjectHandle,
-                                 CsrProcessHandle,
-                                 Handle,
-                                 DesiredAccess,
-                                 OBJ_INHERIT,
-                                 0);
-
-      /* Close our handle to CSRSS */
-      ZwClose(CsrProcessHandle);
-   }
-
-   return Status;
-}
-
-NTSTATUS FASTCALL
-CsrCloseHandle(HANDLE Handle)
-{
-   NTSTATUS Status;
-   PEPROCESS OldProcess;
-
-   /* Switch to the process in which the handle is valid */
-   OldProcess = PsGetCurrentProcess();
-   if (CsrProcess != OldProcess)
-   {
-      KeAttachProcess(&CsrProcess->Pcb);
-   }
-
-   Status = ZwClose(Handle);
-
-   if (CsrProcess != OldProcess)
-   {
-      KeDetachProcess();
-   }
-
-   return Status;
-}
-
 /* EOF */
Modified: branches/ros-csrss/win32ss/user/ntuser/cursoricon.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/c…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/cursoricon.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/cursoricon.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -209,7 +209,7 @@
     PCURICON_OBJECT CurIcon;
     HANDLE hCurIcon;
-    CurIcon = UserCreateObject(gHandleTable, NULL, &hCurIcon, otCursorIcon,
sizeof(CURICON_OBJECT));
+    CurIcon = UserCreateObject(gHandleTable, NULL, NULL, &hCurIcon, otCursorIcon,
sizeof(CURICON_OBJECT));
     if (!CurIcon)
     {
Modified: branches/ros-csrss/win32ss/user/ntuser/desktop.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/d…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/desktop.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/desktop.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -11,11 +11,17 @@
 #include <win32k.h>
 DBG_DEFAULT_CHANNEL(UserDesktop);
-static
-VOID
-IntFreeDesktopHeap(
-    IN OUT PDESKTOP Desktop
-);
+static NTSTATUS
+UserInitializeDesktop(PDESKTOP pdesk, PUNICODE_STRING DesktopName, PWINSTATION_OBJECT
pwinsta);
+
+static NTSTATUS
+IntMapDesktopView(IN PDESKTOP pdesk);
+
+static NTSTATUS
+IntUnmapDesktopView(IN PDESKTOP pdesk);
+
+static VOID
+IntFreeDesktopHeap(IN PDESKTOP pdesk);
 /* GLOBALS *******************************************************************/
@@ -23,6 +29,8 @@
 PDESKTOP InputDesktop = NULL;
 HDESK InputDesktopHandle = NULL;
 HDC ScreenDeviceContext = NULL;
+PTHREADINFO gptiDesktopThread;
+HCURSOR gDesktopCursor = NULL;
 /* OBJECT CALLBACKS **********************************************************/
@@ -112,17 +120,16 @@
                             sizeof(DESKTOP),
                             0,
                             0,
-                            (PVOID)&Desktop);
+                            (PVOID*)&Desktop);
     if (!NT_SUCCESS(Status)) return Status;
-    /* Initialize shell hook window list and set the parent */
-    RtlZeroMemory(Desktop, sizeof(DESKTOP));
-    InitializeListHead(&Desktop->ShellHookWindows);
-    Desktop->rpwinstaParent = (PWINSTATION_OBJECT)ParseObject;
-
-    /* Put the desktop on the window station's list of associated desktops */
-    InsertTailList(&Desktop->rpwinstaParent->DesktopListHead,
-                   &Desktop->ListEntry);
+    /* Initialize the desktop */
+    Status = UserInitializeDesktop(Desktop, RemainingName, WinStaObject);
+    if (!NT_SUCCESS(Status))
+    {
+        ObDereferenceObject(Desktop);
+        return Status;
+    }
     /* Set the desktop object and return success */
     *Object = Desktop;
@@ -133,22 +140,29 @@
 VOID APIENTRY
 IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters)
 {
-   PDESKTOP Desktop = (PDESKTOP)Parameters->Object;
-
-   TRACE("Deleting desktop object 0x%p\n", Desktop);
+   PDESKTOP pdesk = (PDESKTOP)Parameters->Object;
+
+   TRACE("Deleting desktop object 0x%p\n", pdesk);
+
+   ASSERT(pdesk->pDeskInfo->spwnd->spwndChild == NULL);
+
+   if (pdesk->pDeskInfo->spwnd)
+       co_UserDestroyWindow(pdesk->pDeskInfo->spwnd);
+
+   if (pdesk->spwndMessage)
+       co_UserDestroyWindow(pdesk->spwndMessage);
    /* Remove the desktop from the window station's list of associcated desktops */
-   RemoveEntryList(&Desktop->ListEntry);
-
-   IntFreeDesktopHeap(Desktop);
+   RemoveEntryList(&pdesk->ListEntry);
+
+   /* Free the heap */
+   IntFreeDesktopHeap(pdesk);
 }
 NTSTATUS NTAPI
 IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters)
 {
-    PTHREADINFO pti;
-
-    pti = PsGetCurrentThreadWin32Thread();
+    PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
     if( pti == NULL)
     {
@@ -165,6 +179,29 @@
     return STATUS_SUCCESS;
 }
+
+NTSTATUS NTAPI IntDesktopObjectOpen(PWIN32_OPENMETHOD_PARAMETERS Parameters)
+{
+    PPROCESSINFO ppi = PsGetProcessWin32Process(Parameters->Process);
+    if (ppi == NULL)
+        return STATUS_SUCCESS;
+
+    return IntMapDesktopView((PDESKTOP)Parameters->Object);
+}
+
+NTSTATUS NTAPI IntDesktopObjectClose(PWIN32_CLOSEMETHOD_PARAMETERS Parameters)
+{
+    PPROCESSINFO ppi = PsGetProcessWin32Process(Parameters->Process);
+    if (ppi == NULL)
+    {
+        /* This happens when the process leaks desktop handles.
+         * At this point the PPROCESSINFO is already destroyed */
+         return STATUS_SUCCESS;
+    }
+
+    return IntUnmapDesktopView((PDESKTOP)Parameters->Object);
+}
+
 /* PRIVATE FUNCTIONS **********************************************************/
@@ -596,8 +633,66 @@
       case WM_SYSCOLORCHANGE:
          co_UserRedrawWindow(Wnd, NULL, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN);
          return TRUE;
-   }
-   return FALSE; // Not processed so go with callback.
+      case WM_SETCURSOR:
+      {
+          PCURICON_OBJECT pcurOld, pcurNew;
+          pcurNew = UserGetCurIconObject(gDesktopCursor);
+          if (!pcurNew)
+          {
+              return TRUE;
+          }
+          pcurOld = UserSetCursor(pcurNew, FALSE);
+          if (pcurOld)
+          {
+               UserDereferenceObject(pcurOld);
+          }
+      }
+   }
+   return TRUE; /* We are done. Do not do any callbacks to user mode */
+}
+
+BOOL FASTCALL
+UserMessageWindowProc(PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT
*lResult)
+{
+    *lResult = 0;
+
+    switch(Msg)
+    {
+    case WM_NCCREATE:
+        pwnd->fnid |= FNID_MESSAGEWND;
+        *lResult = (LRESULT)TRUE;
+        break;
+    case WM_DESTROY:
+        pwnd->fnid |= FNID_DESTROY;
+        break;
+    }
+
+    return TRUE; /* We are done. Do not do any callbacks to user mode */
+}
+
+VOID NTAPI DesktopThreadMain()
+{
+    BOOL Ret;
+    MSG Msg;
+
+    gptiDesktopThread = PsGetCurrentThreadWin32Thread();
+
+    UserEnterExclusive();
+
+    /* Register system classes. This thread does not belong to any desktop so the
+       classes will be allocated from the shared heap */
+    UserRegisterSystemClasses();
+
+    while(TRUE)
+    {
+        Ret = co_IntGetPeekMessage(&Msg, 0, 0, 0, PM_REMOVE, TRUE);
+        if (Ret)
+        {
+            IntDispatchMessage(&Msg);
+        }
+    }
+
+    UserLeave();
 }
 HDC FASTCALL
@@ -813,6 +908,8 @@
 static VOID
 IntFreeDesktopHeap(IN OUT PDESKTOP Desktop)
 {
+    /* FIXME: Disable until unmapping works in mm */
+#if 0
     if (Desktop->pheapDesktop != NULL)
     {
         MmUnmapViewInSessionSpace(Desktop->pheapDesktop);
@@ -824,6 +921,7 @@
         ObDereferenceObject(Desktop->hsectionDesktop);
         Desktop->hsectionDesktop = NULL;
     }
+#endif
 }
 BOOL FASTCALL
@@ -1030,6 +1128,61 @@
    return TRUE;
 }
+static NTSTATUS
+UserInitializeDesktop(PDESKTOP pdesk, PUNICODE_STRING DesktopName, PWINSTATION_OBJECT
pwinsta)
+{
+    PVOID DesktopHeapSystemBase = NULL;
+    ULONG_PTR HeapSize = 400 * 1024;
+    SIZE_T DesktopInfoSize;
+    ULONG i;
+
+    TRACE("UserInitializeDesktop desktop 0x%p with name %wZ\n", pdesk,
DesktopName);
+
+    RtlZeroMemory(pdesk, sizeof(DESKTOP));
+
+    /* Link the desktop with the parent window station */
+    pdesk->rpwinstaParent = pwinsta;
+    InsertTailList(&pwinsta->DesktopListHead, &pdesk->ListEntry);
+
+    /* Create the desktop heap */
+    pdesk->hsectionDesktop = NULL;
+    pdesk->pheapDesktop = UserCreateHeap(&pdesk->hsectionDesktop,
+                                         &DesktopHeapSystemBase,
+                                         HeapSize);
+   if (pdesk->pheapDesktop == NULL)
+   {
+       ERR("Failed to create desktop heap!\n");
+       return STATUS_NO_MEMORY;
+   }
+
+   /* Create DESKTOPINFO */
+   DesktopInfoSize = sizeof(DESKTOPINFO) + DesktopName->Length + sizeof(WCHAR);
+   pdesk->pDeskInfo = RtlAllocateHeap(pdesk->pheapDesktop,
+                                      HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY,
+                                      DesktopInfoSize);
+   if (pdesk->pDeskInfo == NULL)
+   {
+       ERR("Failed to create the DESKTOP structure!\n");
+       return STATUS_NO_MEMORY;
+   }
+
+   /* Initialize the DESKTOPINFO */
+   pdesk->pDeskInfo->pvDesktopBase = DesktopHeapSystemBase;
+   pdesk->pDeskInfo->pvDesktopLimit = (PVOID)((ULONG_PTR)DesktopHeapSystemBase +
HeapSize);
+   RtlCopyMemory(pdesk->pDeskInfo->szDesktopName,
+                 DesktopName->Buffer,
+                 DesktopName->Length + sizeof(WCHAR));
+   for (i = 0; i < NB_HOOKS; i++)
+   {
+      InitializeListHead(&pdesk->pDeskInfo->aphkStart[i]);
+   }
+
+   InitializeListHead(&pdesk->ShellHookWindows);
+   InitializeListHead(&pdesk->PtiList);
+
+   return STATUS_SUCCESS;
+}
+
 /* SYSCALLS *******************************************************************/
 /*
@@ -1073,43 +1226,35 @@
    DWORD dwFlags,
    ACCESS_MASK dwDesiredAccess)
 {
-   PDESKTOP DesktopObject;
-   UNICODE_STRING DesktopName;
+   PDESKTOP pdesk = NULL;
    NTSTATUS Status = STATUS_SUCCESS;
-   HDESK Desktop;
-   CSR_API_MESSAGE Request;
-   PVOID DesktopHeapSystemBase = NULL;
-   SIZE_T DesktopInfoSize;
+   HDESK hdesk;
    BOOLEAN Context;
-   ULONG_PTR HeapSize = 400 * 1024; /* FIXME: Windows uses 200KB by default */
    UNICODE_STRING ClassName;
    LARGE_STRING WindowName;
    BOOL NoHooks = FALSE;
    PWND pWnd = NULL;
    CREATESTRUCTW Cs;
-   INT i;
    PTHREADINFO ptiCurrent;
+   PCLS pcls;
+
    DECLARE_RETURN(HDESK);
    TRACE("Enter NtUserCreateDesktop\n");
    UserEnterExclusive();
    ptiCurrent = PsGetCurrentThreadWin32Thread();
-   if (ptiCurrent)
-   {
+   ASSERT(ptiCurrent);
+   ASSERT(gptiDesktopThread);
+
    /* Turn off hooks when calling any CreateWindowEx from inside win32k. */
-      NoHooks = (ptiCurrent->TIF_flags & TIF_DISABLEHOOKS);
-      ptiCurrent->TIF_flags |= TIF_DISABLEHOOKS;
-      ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
-   }
-   /*else
-   {ERR("NtUserCreateDesktop: No ptiCurrent\n");}*/
-   DesktopName.Buffer = NULL;
+   NoHooks = (ptiCurrent->TIF_flags & TIF_DISABLEHOOKS);
+   ptiCurrent->TIF_flags |= TIF_DISABLEHOOKS;
+   ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
    /*
     * Try to open already existing desktop
     */
-
    Status = ObOpenObjectByName(
                ObjectAttributes,
                ExDesktopObjectType,
@@ -1117,142 +1262,98 @@
                NULL,
                dwDesiredAccess,
                (PVOID)&Context,
-               (HANDLE*)&Desktop);
-   if (!NT_SUCCESS(Status)) RETURN(NULL);
+               (HANDLE*)&hdesk);
+   if (!NT_SUCCESS(Status))
+   {
+      ERR("ObOpenObjectByName failed to open/create desktop\n");
+      SetLastNtError(Status);
+      RETURN(NULL);
+   }
    /* In case the object was not created (eg if it existed), return now */
    if (Context == FALSE)
    {
        TRACE("NtUserCreateDesktop opened desktop %wZ\n",
ObjectAttributes->ObjectName);
-       RETURN( Desktop);
-   }
-
-   /* Capture desktop name */
-   _SEH2_TRY
-   {
-      ProbeForRead( ObjectAttributes, sizeof(OBJECT_ATTRIBUTES),  1);
-
-      Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopName,
ObjectAttributes->ObjectName);
-   }
-   _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-   {
-      Status = _SEH2_GetExceptionCode();
-   }
-   _SEH2_END
-
-   if (! NT_SUCCESS(Status))
-   {
-      ERR("Failed reading Object Attributes from user space.\n");
-      SetLastNtError(Status);
-      RETURN( NULL);
+       RETURN( hdesk);
    }
    /* Reference the desktop */
-   Status = ObReferenceObjectByHandle(Desktop,
+   Status = ObReferenceObjectByHandle(hdesk,
                                       0,
                                       ExDesktopObjectType,
                                       KernelMode,
-                                      (PVOID)&DesktopObject,
+                                      (PVOID*)&pdesk,
                                       NULL);
    if (!NT_SUCCESS(Status))
    {
        ERR("Failed to reference desktop object\n");
+       SetLastNtError(Status);
        RETURN(NULL);
    }
-   TRACE("NtUserCreateDesktop created desktop 0x%p with name %wZ\n",
DesktopObject, &DesktopName);
-
-   DesktopObject->hsectionDesktop = NULL;
-   DesktopObject->pheapDesktop =
UserCreateHeap(&DesktopObject->hsectionDesktop,
-                                                &DesktopHeapSystemBase,
-                                                HeapSize);
-   if (DesktopObject->pheapDesktop == NULL)
-   {
-       ObDereferenceObject(DesktopObject);
-       ERR("Failed to create desktop heap!\n");
-       RETURN(NULL);
-   }
-
-   DesktopInfoSize = sizeof(DESKTOPINFO) + DesktopName.Length + sizeof(WCHAR);
-
-   DesktopObject->pDeskInfo = RtlAllocateHeap(DesktopObject->pheapDesktop,
-                                              HEAP_NO_SERIALIZE,
-                                              DesktopInfoSize);
-
-   if (DesktopObject->pDeskInfo == NULL)
-   {
-       ObDereferenceObject(DesktopObject);
-       ERR("Failed to create the DESKTOP structure!\n");
-       RETURN(NULL);
-   }
-
-   RtlZeroMemory(DesktopObject->pDeskInfo,
-                 DesktopInfoSize);
-
-   DesktopObject->pDeskInfo->pvDesktopBase = DesktopHeapSystemBase;
-   DesktopObject->pDeskInfo->pvDesktopLimit =
(PVOID)((ULONG_PTR)DesktopHeapSystemBase + HeapSize);
-   RtlCopyMemory(DesktopObject->pDeskInfo->szDesktopName,
-                 DesktopName.Buffer,
-                 DesktopName.Length + sizeof(WCHAR));
-
-   /* Initialize some local (to win32k) desktop state. */
-   InitializeListHead(&DesktopObject->PtiList);
-   DesktopObject->ActiveMessageQueue = NULL;
-
-   /* Setup Global Hooks. */
-   for (i = 0; i < NB_HOOKS; i++)
-   {
-      InitializeListHead(&DesktopObject->pDeskInfo->aphkStart[i]);
-   }
-
-   /*
-    * Create a handle for CSRSS and notify CSRSS for Creating Desktop Background Windows
and Threads.
+   if (!ptiCurrent->rpdesk) IntSetThreadDesktop(hdesk,FALSE);
+
+   /* Get the desktop window class. The thread desktop does not belong to any desktop
+    * so the classes created there (including the desktop class) are allocated in the
shared heap
+    * It would cause problems if we used a class that belongs to the caller
     */
-   Request.ApiNumber = CSR_CREATE_API_NUMBER(CSR_GUI, CREATE_DESKTOP);
-   Status = CsrInsertObject(Desktop,
-                            GENERIC_ALL,
-
(HANDLE*)&Request.Data.CreateDesktopRequest.DesktopHandle);
-   if (! NT_SUCCESS(Status))
-   {
-      ERR("Failed to create desktop handle for CSRSS\n");
-      ZwClose(Desktop);
-      SetLastNtError(Status);
-      RETURN( NULL);
-   }
-
-   Status = co_CsrNotify((PCSR_API_MESSAGE)&Request,
-                         sizeof(CSR_API_MESSAGE));
-   if (! NT_SUCCESS(Status))
-   {
-      CsrCloseHandle(Request.Data.CreateDesktopRequest.DesktopHandle);
-      ERR("Failed to notify CSRSS about new desktop\n");
-      ZwClose(Desktop);
-      SetLastNtError(Status);
-      RETURN( NULL);
-   }
-
-   if (ptiCurrent && !ptiCurrent->rpdesk) IntSetThreadDesktop(Desktop,FALSE);
-
-   ClassName.Buffer =
((PWSTR)((ULONG_PTR)(WORD)(gpsi->atomSysClass[ICLS_HWNDMESSAGE])));
+   ClassName.Buffer = WC_DESKTOP;
    ClassName.Length = 0;
+   pcls = IntGetAndReferenceClass(&ClassName, 0, TRUE);
+   if (pcls == NULL)
+   {
+      ASSERT(FALSE);
+      RETURN(NULL);
+   }
+
    RtlZeroMemory(&WindowName, sizeof(WindowName));
-
+   RtlZeroMemory(&Cs, sizeof(Cs));
+   Cs.x = UserGetSystemMetrics(SM_XVIRTUALSCREEN),
+   Cs.y = UserGetSystemMetrics(SM_YVIRTUALSCREEN),
+   Cs.cx = UserGetSystemMetrics(SM_CXVIRTUALSCREEN),
+   Cs.cy = UserGetSystemMetrics(SM_CYVIRTUALSCREEN),
+   Cs.style = WS_POPUP|WS_CLIPCHILDREN;
+   Cs.hInstance = hModClient; // hModuleWin; // Server side winproc!
+   Cs.lpszName = (LPCWSTR) &WindowName;
+   Cs.lpszClass = (LPCWSTR) &ClassName;
+
+   /* Use IntCreateWindow instead of co_UserCreateWindowEx cause the later expects a
thread with a desktop */
+   pWnd = IntCreateWindow(&Cs, &WindowName, pcls, NULL, NULL, NULL, pdesk);
+   if (pWnd == NULL)
+   {
+      ERR("Failed to create desktop window for the new desktop\n");
+      RETURN(NULL);
+   }
+
+   pdesk->DesktopWindow = pWnd->head.h;
+   pdesk->pDeskInfo->spwnd = pWnd;
+   pWnd->fnid = FNID_DESKTOP;
+
+   ClassName.Buffer = MAKEINTATOM(gpsi->atomSysClass[ICLS_HWNDMESSAGE]);
+   ClassName.Length = 0;
+   pcls = IntGetAndReferenceClass(&ClassName, 0, TRUE);
+   if (pcls == NULL)
+   {
+      ASSERT(FALSE);
+      RETURN(NULL);
+   }
+
+   RtlZeroMemory(&WindowName, sizeof(WindowName));
    RtlZeroMemory(&Cs, sizeof(Cs));
    Cs.cx = Cs.cy = 100;
    Cs.style = WS_POPUP|WS_CLIPCHILDREN;
-   Cs.hInstance = hModClient; // hModuleWin; // Server side winproc! Leave it to Timo to
not pass on notes!
+   Cs.hInstance = hModClient; // hModuleWin; // Server side winproc!
    Cs.lpszName = (LPCWSTR) &WindowName;
    Cs.lpszClass = (LPCWSTR) &ClassName;
-
-   pWnd = co_UserCreateWindowEx(&Cs, &ClassName, &WindowName, NULL);
-   if (!pWnd)
-   {
-      ERR("Failed to create Message window handle\n");
-   }
-   else
-   {
-      DesktopObject->spwndMessage = pWnd;
-   }
+   pWnd = IntCreateWindow(&Cs, &WindowName, pcls, NULL, NULL, NULL, pdesk);
+   if (pWnd == NULL)
+   {
+      ERR("Failed to create message window for the new desktop\n");
+      RETURN(NULL);
+   }
+
+   pdesk->spwndMessage = pWnd;
+   pWnd->fnid = FNID_MESSAGEWND;
    /* Now,,,
       if !(WinStaObject->Flags & WSF_NOIO) is (not set) for desktop input output
mode (see wiki)
@@ -1262,14 +1363,18 @@
       The rest is same as message window.
       
http://msdn.microsoft.com/en-us/library/bb760250(VS.85).aspx
    */
-   RETURN( Desktop);
+   RETURN( hdesk);
 CLEANUP:
-   if(DesktopName.Buffer != NULL)
-   {
-       ExFreePoolWithTag(DesktopName.Buffer, TAG_STRING);
-   }
-   if (!NoHooks && ptiCurrent)
+   if (pdesk != NULL)
+   {
+       ObDereferenceObject(pdesk);
+   }
+   if (_ret_ == NULL && hdesk != NULL)
+   {
+      ObCloseHandle(hdesk, UserMode);
+   }
+   if (!NoHooks)
    {
        ptiCurrent->TIF_flags &= ~TIF_DISABLEHOOKS;
        ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
Modified: branches/ros-csrss/win32ss/user/ntuser/desktop.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/d…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/desktop.h [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/desktop.h [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -73,6 +73,7 @@
 extern HDESK InputDesktopHandle;
 extern PCLS DesktopWindowClass;
 extern HDC ScreenDeviceContext;
+extern PTHREADINFO gptiDesktopThread;
 typedef struct _SHELL_HOOK_WINDOW
 {
@@ -104,6 +105,12 @@
 NTSTATUS NTAPI
 IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters);
+NTSTATUS NTAPI
+IntDesktopObjectOpen(PWIN32_OPENMETHOD_PARAMETERS Parameters);
+
+NTSTATUS NTAPI
+IntDesktopObjectClose(PWIN32_CLOSEMETHOD_PARAMETERS Parameters);
+
 HDC FASTCALL
 IntGetScreenDC(VOID);
@@ -283,4 +290,6 @@
 PWND FASTCALL co_GetDesktopWindow(PWND);
 BOOL FASTCALL IntPaintDesktop(HDC);
 BOOL FASTCALL DesktopWindowProc(PWND, UINT, WPARAM, LPARAM, LRESULT *);
+BOOL FASTCALL UserMessageWindowProc(PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam,
LRESULT *lResult);
+VOID NTAPI DesktopThreadMain();
 /* EOF */
Modified: branches/ros-csrss/win32ss/user/ntuser/event.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/e…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/event.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/event.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -378,7 +378,7 @@
       }
    }
    // Creator, pti is set here.
-   pEH = UserCreateObject(gHandleTable, NULL, &Handle, otEvent, sizeof(EVENTHOOK));
+   pEH = UserCreateObject(gHandleTable, NULL, NULL, &Handle, otEvent,
sizeof(EVENTHOOK));
    if (pEH)
    {
       InsertTailList(&GlobalEvents->Events, &pEH->Chain);
Modified: branches/ros-csrss/win32ss/user/ntuser/hook.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/h…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/hook.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/hook.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -1569,7 +1569,7 @@
     }
     ObDereferenceObject(WinStaObj);
-    Hook = UserCreateObject(gHandleTable, NULL, (PHANDLE)&Handle, otHook,
sizeof(HOOK));
+    Hook = UserCreateObject(gHandleTable, NULL, NULL, (PHANDLE)&Handle, otHook,
sizeof(HOOK));
     if (!Hook)
     {
Modified: branches/ros-csrss/win32ss/user/ntuser/input.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/i…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/input.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/input.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -304,6 +304,7 @@
     switch (Type)
     {
         case 0: RawInputThreadMain(); break;
+        case 1: DesktopThreadMain(); break;
         default: ERR("Wrong type: %x\n", Type);
     }
Modified: branches/ros-csrss/win32ss/user/ntuser/kbdlayout.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/k…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/kbdlayout.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/kbdlayout.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -131,7 +131,7 @@
                                  L"Control\\Keyboard Layouts\\";
     /* Create keyboard layout file object */
-    pkf = UserCreateObject(gHandleTable, NULL, NULL, otKBDfile, sizeof(KBDFILE));
+    pkf = UserCreateObject(gHandleTable, NULL, NULL, NULL, otKBDfile, sizeof(KBDFILE));
     if (!pkf)
     {
         ERR("Failed to create object!\n");
@@ -206,7 +206,7 @@
     PKL pKl;
     /* Create keyboard layout object */
-    pKl = UserCreateObject(gHandleTable, NULL, NULL, otKBDlayout, sizeof(KL));
+    pKl = UserCreateObject(gHandleTable, NULL, NULL, NULL, otKBDlayout, sizeof(KL));
     if (!pKl)
     {
         ERR("Failed to create object!\n");
Modified: branches/ros-csrss/win32ss/user/ntuser/main.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/m…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/main.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/main.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -304,6 +304,7 @@
     if (ptiCurrent->KeyboardLayout)
         UserReferenceObject(ptiCurrent->KeyboardLayout);
     ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
+    ptiCurrent->pcti = &ptiCurrent->cti;
     /* Initialize the CLIENTINFO */
     pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
@@ -624,14 +625,16 @@
     DPRINT("Win32k hInstance 0x%p!\n",hModuleWin);
     /* Register Object Manager Callbacks */
+    CalloutData.ProcessCallout = Win32kProcessCallback;
+    CalloutData.ThreadCallout = Win32kThreadCallback;
     CalloutData.WindowStationParseProcedure = IntWinStaObjectParse;
     CalloutData.WindowStationDeleteProcedure = IntWinStaObjectDelete;
+    CalloutData.WindowStationOkToCloseProcedure = IntWinstaOkToClose;
+    CalloutData.DesktopOkToCloseProcedure = IntDesktopOkToClose;
     CalloutData.DesktopDeleteProcedure = IntDesktopObjectDelete;
-    CalloutData.ProcessCallout = Win32kProcessCallback;
-    CalloutData.ThreadCallout = Win32kThreadCallback;
+    CalloutData.DesktopCloseProcedure = IntDesktopObjectClose;
+    CalloutData.DesktopOpenProcedure = IntDesktopObjectOpen;
     CalloutData.BatchFlushRoutine = NtGdiFlushUserBatch;
-    CalloutData.DesktopOkToCloseProcedure = IntDesktopOkToClose;
-    CalloutData.WindowStationOkToCloseProcedure = IntWinstaOkToClose;
     /* Register our per-process and per-thread structures. */
     PsEstablishWin32Callouts((PWIN32_CALLOUTS_FPNS)&CalloutData);
Modified: branches/ros-csrss/win32ss/user/ntuser/menu.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/m…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/menu.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/menu.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -249,7 +249,8 @@
    PPROCESSINFO CurrentWin32Process;
    Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable,
-                                          NULL,
+                                          NULL,
+                                          NULL,
                                           Handle,
                                           otMenu,
                                           sizeof(MENU_OBJECT));
@@ -360,8 +361,9 @@
       return NULL;
    Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable,
-                                          NULL,
-                                         &hMenu,
+                                          NULL,
+                                          NULL,
+                                          &hMenu,
                                           otMenu,
                                           sizeof(MENU_OBJECT));
    if(!Menu)
Modified: branches/ros-csrss/win32ss/user/ntuser/message.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/m…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/message.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/message.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -714,6 +714,13 @@
                                              pMsg->lParam,
                                             &retval);
             break;
+          case FNID_MESSAGEWND:
+            DoCallBack = !UserMessageWindowProc( Window,
+                                                 pMsg->message,
+                                                 pMsg->wParam,
+                                                 pMsg->lParam,
+                                                 &retval);
+            break;
        }
     }
@@ -1306,6 +1313,9 @@
            {
               case FNID_DESKTOP:
                 DoCallBack = !DesktopWindowProc(Window, Msg, wParam,
lParam,(LRESULT*)&Result);
+                break;
+              case FNID_MESSAGEWND:
+                DoCallBack = !UserMessageWindowProc(Window, Msg, wParam,
lParam,(LRESULT*)&Result);
                 break;
            }
            if (!DoCallBack)
@@ -1589,6 +1599,9 @@
            {
               case FNID_DESKTOP:
                 DoCallBack = !DesktopWindowProc(Window, Msg, wParam, lParamPacked,
(LRESULT*)&Result);
+                break;
+              case FNID_MESSAGEWND:
+                DoCallBack = !UserMessageWindowProc(Window, Msg, wParam,
lParam,(LRESULT*)&Result);
                 break;
            }
         }
@@ -2233,6 +2246,16 @@
            }
            break;
         }
+
+   case FNID_MESSAGEWND:
+       {
+           Window = UserGetWindowObject(hWnd);
+           if (Window)
+           {
+                Ret = !UserMessageWindowProc(Window, Msg, wParam, lParam,&lResult);
+           }
+           break;
+       }
     case FNID_DEFWINDOWPROC:
         /* Validate input */
         if (hWnd)
Modified: branches/ros-csrss/win32ss/user/ntuser/monitor.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/m…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/monitor.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/monitor.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -32,7 +32,7 @@
 PMONITOR
 IntCreateMonitorObject()
 {
-    return UserCreateObject(gHandleTable, NULL, NULL, otMonitor, sizeof(MONITOR));
+    return UserCreateObject(gHandleTable, NULL, NULL, NULL, otMonitor, sizeof(MONITOR));
 }
 /* IntDestroyMonitorObject
Modified: branches/ros-csrss/win32ss/user/ntuser/msgqueue.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/m…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/msgqueue.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/msgqueue.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -101,7 +101,7 @@
     }
     /* Window has not been found */
-    return NULL;
+    return pwndDesktop;
 }
 PCURICON_OBJECT
Modified: branches/ros-csrss/win32ss/user/ntuser/msgqueue.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/m…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/msgqueue.h [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/msgqueue.h [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -298,4 +298,13 @@
 DWORD APIENTRY IntGetQueueStatus(DWORD);
 UINT lParamMemorySize(UINT Msg, WPARAM wParam, LPARAM lParam);
+
+BOOL FASTCALL
+co_IntGetPeekMessage( PMSG pMsg,
+                      HWND hWnd,
+                      UINT MsgFilterMin,
+                      UINT MsgFilterMax,
+                      UINT RemoveMsg,
+                      BOOL bGMSG );
+
 /* EOF */
Modified: branches/ros-csrss/win32ss/user/ntuser/object.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/o…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/object.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/object.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -315,20 +315,24 @@
 FASTCALL
 UserCreateObject( PUSER_HANDLE_TABLE ht,
                   PDESKTOP pDesktop,
+                  PTHREADINFO pti,
                   HANDLE* h,
                   USER_OBJECT_TYPE type,
                   ULONG size)
 {
    HANDLE hi;
    PVOID Object;
-   PTHREADINFO pti;
    PPROCESSINFO ppi;
    BOOL dt;
    PDESKTOP rpdesk = pDesktop;
-   pti = GetW32ThreadInfo();
+   /* We could get the desktop for the new object from the pti however this is
+    * not always the case for example when creating a new desktop window for
+    * the desktop thread*/
+
+   if (!pti) pti = GetW32ThreadInfo();
+   if (!pDesktop) rpdesk = pti->rpdesk;
    ppi = pti->ppi;
-   if (!pDesktop) rpdesk = pti->rpdesk;
    switch (type)
    {
Modified: branches/ros-csrss/win32ss/user/ntuser/object.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/o…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/object.h [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/object.h [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -33,7 +33,7 @@
 VOID FASTCALL UserReferenceObject(PVOID obj);
 PVOID FASTCALL UserReferenceObjectByHandle(HANDLE handle, USER_OBJECT_TYPE type);
 BOOL FASTCALL UserDereferenceObject(PVOID obj);
-PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, struct _DESKTOP* pDesktop, HANDLE*
h,USER_OBJECT_TYPE type , ULONG size);
+PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, struct _DESKTOP* pDesktop,
PTHREADINFO pti, HANDLE* h,USER_OBJECT_TYPE type , ULONG size);
 BOOL FASTCALL UserDeleteObject(HANDLE h, USER_OBJECT_TYPE type );
 PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, USER_OBJECT_TYPE type );
 PVOID UserGetObjectNoErr(PUSER_HANDLE_TABLE, HANDLE, USER_OBJECT_TYPE);
Modified: branches/ros-csrss/win32ss/user/ntuser/simplecall.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/s…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/simplecall.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/simplecall.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -184,7 +184,8 @@
              if (count == 0) count = 8;
              psmwp = (PSMWP) UserCreateObject( gHandleTable,
-                                               NULL,
+                                               NULL,
+                                               NULL,
                                               (PHANDLE)&hDwp,
                                                otSMWP,
                                                sizeof(SMWP));
Modified: branches/ros-csrss/win32ss/user/ntuser/timer.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/t…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/timer.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/timer.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -56,7 +56,7 @@
   HANDLE Handle;
   PTIMER Ret = NULL;
-  Ret = UserCreateObject(gHandleTable, NULL, &Handle, otTimer, sizeof(TIMER));
+  Ret = UserCreateObject(gHandleTable, NULL, NULL, &Handle, otTimer, sizeof(TIMER));
   if (Ret)
   {
      Ret->head.h = Handle;
Modified: branches/ros-csrss/win32ss/user/ntuser/window.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/w…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/window.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/window.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -1661,7 +1661,8 @@
                                         PCLS Class,
                                         PWND ParentWindow,
                                         PWND OwnerWindow,
-                                        PVOID acbiBuffer)
+                                        PVOID acbiBuffer,
+                                        PDESKTOP pdeskCreated)
 {
    PWND pWnd = NULL;
    HWND hWnd;
@@ -1670,7 +1671,7 @@
    BOOL MenuChanged;
    BOOL bUnicodeWindow;
-   pti = PsGetCurrentThreadWin32Thread();
+   pti = pdeskCreated ? gptiDesktopThread : GetW32ThreadInfo();
    if (!(Cs->dwExStyle & WS_EX_LAYOUTRTL))
    {
@@ -1690,8 +1691,7 @@
          */
          if ( Class->fnid != FNID_DIALOG )
          {
-            PPROCESSINFO ppi = PsGetCurrentProcessWin32Process();
-            if (ppi->dwLayout & LAYOUT_RTL)
+            if (pti->ppi->dwLayout & LAYOUT_RTL)
             {
                Cs->dwExStyle |= WS_EX_LAYOUTRTL;
             }
@@ -1713,7 +1713,8 @@
    /* Allocate the new window */
    pWnd = (PWND) UserCreateObject( gHandleTable,
-                                   pti->rpdesk,
+                                   pdeskCreated ? pdeskCreated : pti->rpdesk,
+                                   pti,
                                   (PHANDLE)&hWnd,
                                    otWindow,
                                    sizeof(WND) + Class->cbwndExtra);
@@ -1723,14 +1724,14 @@
       goto AllocError;
    }
-   TRACE("Created object with handle %X\n", hWnd);
-
-   if (NULL == pti->rpdesk->DesktopWindow)
+   TRACE("Created window object with handle %X\n", hWnd);
+
+   if (pdeskCreated && pdeskCreated->DesktopWindow == NULL )
    {  /* HACK: Helper for win32csr/desktopbg.c */
       /* If there is no desktop window yet, we must be creating it */
       TRACE("CreateWindow setting desktop.\n");
-      pti->rpdesk->DesktopWindow = hWnd;
-      pti->rpdesk->pDeskInfo->spwnd = pWnd;
+      pdeskCreated->DesktopWindow = hWnd;
+      pdeskCreated->pDeskInfo->spwnd = pWnd;
    }
    /*
@@ -2010,7 +2011,7 @@
    pCbtCreate = NULL;
    /* Get the class and reference it */
-   Class = IntGetAndReferenceClass(ClassName, Cs->hInstance);
+   Class = IntGetAndReferenceClass(ClassName, Cs->hInstance, FALSE);
    if(!Class)
    {
        ERR("Failed to find class %wZ\n", ClassName);
@@ -2059,7 +2060,8 @@
                             Class,
                             ParentWindow,
                             OwnerWindow,
-                            acbiBuffer);
+                            acbiBuffer,
+                            NULL);
    if(!Window)
    {
        ERR("IntCreateWindow failed!\n");
@@ -2540,12 +2542,15 @@
    TRACE("co_UserDestroyWindow \n");
-   /* Check for owner thread */
-   if ( (Window->head.pti->pEThread != PsGetCurrentThread()) ||
-        Window->head.pti != PsGetCurrentThreadWin32Thread() )
-   {
-      EngSetLastError(ERROR_ACCESS_DENIED);
-      return FALSE;
+   /* Check for owner thread */
+   if ( Window->head.pti != PsGetCurrentThreadWin32Thread())
+   {
+       /* Check if we are destroying the desktop window */
+       if (! ((Window->head.rpdesk->dwDTFlags & DF_DESTROYED) && Window
== Window->head.rpdesk->pDeskInfo->spwnd))
+       {
+           EngSetLastError(ERROR_ACCESS_DENIED);
+           return FALSE;
+       }
    }
    /* If window was created successfully and it is hooked */
Modified: branches/ros-csrss/win32ss/user/ntuser/window.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/w…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/window.h [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/window.h [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -47,7 +47,13 @@
 BOOL FASTCALL IntShowOwnedPopups( PWND owner, BOOL fShow );
 LRESULT FASTCALL IntDefWindowProc( PWND Window, UINT Msg, WPARAM wParam, LPARAM lParam,
BOOL Ansi);
 VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG, DWORD);
-PWND FASTCALL co_UserCreateWindowEx(CREATESTRUCTW*, PUNICODE_STRING, PLARGE_STRING,
PVOID);
+PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
+                                        PLARGE_STRING WindowName,
+                                        PCLS Class,
+                                        PWND ParentWindow,
+                                        PWND OwnerWindow,
+                                        PVOID acbiBuffer,
+                                        PDESKTOP pdeskCreated);
 BOOL FASTCALL IntEnableWindow(HWND,BOOL);
 BOOL FASTCALL IntIsWindowVisible(PWND);
 DWORD FASTCALL GetNCHitEx(PWND,POINT);
Modified: branches/ros-csrss/win32ss/user/ntuser/winsta.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/ntuser/w…
==============================================================================
--- branches/ros-csrss/win32ss/user/ntuser/winsta.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/ntuser/winsta.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -229,10 +229,7 @@
 {
    TEXTMETRICW tmw;
    UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY");
-   if (! IntCreatePrimarySurface())
-   {
-      return FALSE;
-   }
+
    ScreenDeviceContext = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE);
    if (NULL == ScreenDeviceContext)
    {
@@ -240,6 +237,11 @@
       return FALSE;
    }
    GreSetDCOwner(ScreenDeviceContext, GDI_OBJ_HMGR_PUBLIC);
+
+   if (! IntCreatePrimarySurface())
+   {
+      return FALSE;
+   }
    /* Setup the cursor */
    co_IntLoadDefaultCursors();
Modified: branches/ros-csrss/win32ss/user/user32/windows/cursoricon.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/user32/w…
==============================================================================
--- branches/ros-csrss/win32ss/user/user32/windows/cursoricon.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/user32/windows/cursoricon.c [iso-8859-1] Sun Oct 28
12:13:03 2012
@@ -2137,21 +2137,23 @@
                           ULONG ArgumentLength)
 {
     BOOL *DefaultCursor = (BOOL*)Arguments;
-    LRESULT Result = TRUE;
+    HCURSOR hCursor;
     if(*DefaultCursor)
     {
         /* set default cursor */
-        SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
+        hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW);
+        SetCursor(hCursor);
     }
     else
     {
         /* FIXME load system cursor scheme */
         SetCursor(0);
-        SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
-    }
-
-    return(ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS));
+        hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW);
+        SetCursor(hCursor);
+    }
+
+    return(ZwCallbackReturn(&hCursor, sizeof(HCURSOR), STATUS_SUCCESS));
 }
 BOOL get_icon_size(HICON hIcon, SIZE *size)
Modified: branches/ros-csrss/win32ss/user/winsrv/harderror.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/winsrv/h…
==============================================================================
--- branches/ros-csrss/win32ss/user/winsrv/harderror.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/winsrv/harderror.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -141,6 +141,9 @@
     UNICODE_STRING TempStringU, ParamStringU;
     ANSI_STRING TempStringA;
+    if (SizeOfAllUnicodeStrings)
+        *SizeOfAllUnicodeStrings = 0;
+
     /* Read all strings from client space */
     for (nParam = 0; nParam < HardErrorMessage->NumberOfParameters; nParam++)
     {
@@ -227,7 +230,9 @@
         return Status;
     }
-    *SizeOfAllUnicodeStrings = Size;
+    if (SizeOfAllUnicodeStrings)
+        *SizeOfAllUnicodeStrings = Size;
+
     return Status;
 }
Modified: branches/ros-csrss/win32ss/user/winsrv/init.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/winsrv/i…
==============================================================================
--- branches/ros-csrss/win32ss/user/winsrv/init.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/winsrv/init.c [iso-8859-1] Sun Oct 28 12:13:03 2012
@@ -356,6 +356,28 @@
     NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
 }
+static HHOOK hhk = NULL;
+
+/*** HACK from win32csr... ***/
+LRESULT
+CALLBACK
+KeyboardHookProc(int nCode,
+                 WPARAM wParam,
+                 LPARAM lParam)
+{
+    return CallNextHookEx(hhk, nCode, wParam, lParam);
+}
+/*** END - HACK from win32csr... ***/
+
+DWORD
+WINAPI
+CreateSystemThreads(PVOID pParam)
+{
+    NtUserCallOneParam((DWORD)pParam, ONEPARAM_ROUTINE_CREATESYSTEMTHREADS);
+    DPRINT1("This thread should not terminate!\n");
+    return 0;
+}
+
 CSR_SERVER_DLL_INIT(UserServerDllInitialization)
 {
 /*
@@ -377,6 +399,13 @@
     }
     return Status;
 */
+
+/*** From win32csr... ***/
+    HANDLE ServerThread;
+    CLIENT_ID ClientId;
+    NTSTATUS Status;
+    UINT i;
+/*** END - From win32csr... ***/
     /* Initialize memory */
     UserSrvHeap = RtlGetProcessHeap();  // Initialize our own heap.
@@ -399,6 +428,21 @@
     // LoadedServerDll->NewProcessCallback = Win32CsrDuplicateHandleTable;
     LoadedServerDll->HardErrorCallback = Win32CsrHardError;
+/*** From win32csr... ***/
+    /* Start the Raw Input Thread and the Desktop Thread */
+    for (i = 0; i < 2; ++i)
+    {
+        Status = RtlCreateUserThread(NtCurrentProcess(), NULL, TRUE, 0, 0, 0,
(PTHREAD_START_ROUTINE)CreateSystemThreads, (PVOID)i, &ServerThread, &ClientId);
+        if (NT_SUCCESS(Status))
+        {
+            NtResumeThread(ServerThread, NULL);
+            NtClose(ServerThread);
+        }
+        else
+            DPRINT1("Cannot start Raw Input Thread!\n");
+    }
+/*** END - From win32csr... ***/
+
     /* All done */
     return STATUS_SUCCESS;
 }
@@ -422,6 +466,18 @@
     if (DLL_PROCESS_ATTACH == dwReason)
     {
         DllHandle = hDll;
+
+/*** HACK from win32csr... ***/
+
+//
+// HACK HACK HACK ReactOS to BOOT! Initialization BUG ALERT! See bug 5655.
+//
+        hhk = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, NULL, 0);
+// BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
+//  BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
+//   BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
+
+/*** END - HACK from win32csr... ***/
     }
     return TRUE;
Modified: branches/ros-csrss/win32ss/user/winsrv/shutdown.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/winsrv/s…
==============================================================================
--- branches/ros-csrss/win32ss/user/winsrv/shutdown.c [iso-8859-1] (original)
+++ branches/ros-csrss/win32ss/user/winsrv/shutdown.c [iso-8859-1] Sun Oct 28 12:13:03
2012
@@ -471,7 +471,7 @@
     return TRUE;
 }
-/*** Taken from win32ss/user/win32csr/desktopbg.c ***/
+/*** Taken from win32ss/user/consrv/console.c ***/
 BOOL FASTCALL
 DtbgIsDesktopVisible(VOID)
 {
@@ -485,9 +485,7 @@
     return VisibleDesktopWindow != NULL;
 }
-/****************************************************/
-
-/*** Taken from win32ss/user/consrv/console.c ***/
+
 /* TODO: Find another way to do it. */
 VOID FASTCALL
 ConioConsoleCtrlEventTimeout(DWORD Event, PCSR_PROCESS ProcessData, DWORD Timeout)