diff --git a/reactos/dll/win32/user32/misc/dllmain.c b/reactos/dll/win32/user32/misc/dllmain.c index 01f5153fb19..dc643e7379d 100644 --- a/reactos/dll/win32/user32/misc/dllmain.c +++ b/reactos/dll/win32/user32/misc/dllmain.c @@ -232,6 +232,8 @@ Init(VOID) (PVOID)User32CallEventProcFromKernel; NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADMENU] = (PVOID)User32CallLoadMenuFromKernel; + NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_CLIENTTHREADSTARTUP] = + (PVOID)User32CallClientThreadSetupFromKernel; NtUserProcessConnect( NtCurrentProcess(), &UserCon, @@ -353,3 +355,12 @@ GetConnected(VOID) gHandleEntries = SharedPtrToUser(gHandleTable->handles); } + +NTSTATUS +WINAPI +User32CallClientThreadSetupFromKernel(PVOID Arguments, ULONG ArgumentLength) +{ + ERR("GetConnected\n"); + return ZwCallbackReturn(NULL, 0, STATUS_SUCCESS); +} + diff --git a/reactos/include/reactos/win32k/callback.h b/reactos/include/reactos/win32k/callback.h index 74a405cc9d7..7dd97948adc 100644 --- a/reactos/include/reactos/win32k/callback.h +++ b/reactos/include/reactos/win32k/callback.h @@ -8,7 +8,8 @@ #define USER32_CALLBACK_HOOKPROC (4) #define USER32_CALLBACK_EVENTPROC (5) #define USER32_CALLBACK_LOADMENU (6) -#define USER32_CALLBACK_MAXIMUM (6) +#define USER32_CALLBACK_CLIENTTHREADSTARTUP (7) +#define USER32_CALLBACK_MAXIMUM (7) typedef struct _WINDOWPROC_CALLBACK_ARGUMENTS { @@ -84,5 +85,7 @@ NTSTATUS WINAPI User32CallEventProcFromKernel(PVOID Arguments, ULONG ArgumentLength); NTSTATUS WINAPI User32CallLoadMenuFromKernel(PVOID Arguments, ULONG ArgumentLength); +NTSTATUS WINAPI +User32CallClientThreadSetupFromKernel(PVOID Arguments, ULONG ArgumentLength); #endif /* __INCLUDE_USER32_CALLBACK_H */ diff --git a/reactos/subsystems/win32/win32k/include/callback.h b/reactos/subsystems/win32/win32k/include/callback.h index 48136d8c280..61b80745552 100644 --- a/reactos/subsystems/win32/win32k/include/callback.h +++ b/reactos/subsystems/win32/win32k/include/callback.h @@ -56,4 +56,6 @@ IntCbFreeMemory(PVOID Data); HMENU APIENTRY co_IntCallLoadMenu(HINSTANCE,PUNICODE_STRING); +NTSTATUS APIENTRY co_IntClientThreadSetup(VOID); + #endif /* _WIN32K_CALLBACK_H */ diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 3b351e4b2ac..17350ce0d78 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -703,4 +703,29 @@ co_IntCallLoadMenu( HINSTANCE hModule, return (HMENU)Result; } +NTSTATUS +APIENTRY +co_IntClientThreadSetup(VOID) +{ + NTSTATUS Status; + ULONG ArgumentLength, ResultLength; + PVOID Argument, ResultPointer; + + ArgumentLength = ResultLength = 0; + Argument = ResultPointer = NULL; + + UserLeaveCo(); + + Status = KeUserModeCallback(USER32_CALLBACK_CLIENTTHREADSTARTUP, + Argument, + ArgumentLength, + &ResultPointer, + &ResultLength); + + UserEnterCo(); + + return Status; +} + + /* EOF */ diff --git a/reactos/subsystems/win32/win32k/ntuser/ntuser.c b/reactos/subsystems/win32/win32k/ntuser/ntuser.c index c32ffde9812..ec8c8412554 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntuser.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntuser.c @@ -94,6 +94,8 @@ UserInitialize( HANDLE hPowerRequestEvent, HANDLE hMediaRequestEvent) { + NTSTATUS Status; + // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA) // Create Object Directory,,, Looks like create workstation. "\\Windows\\WindowStations" // Create Event for Diconnect Desktop. @@ -105,6 +107,15 @@ UserInitialize( // Initialize User Screen. // } // Create ThreadInfo for this Thread! +// { + + GetW32ThreadInfo(); + +// Callback to User32 Client Thread Setup + + Status = co_IntClientThreadSetup(); + +// } // Set Global SERVERINFO Error flags. // Load Resources.