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)