[User32|IMM32] Fix a recursion crash in IMM. See CORE-14041.
[reactos.git] / win32ss / user / user32 / misc / logon.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS user32.dll
4 * FILE: win32ss/user/user32/misc/logon.c
5 * PURPOSE: Logon functions
6 * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <user32.h>
12
13 #include <wine/debug.h>
14
15 WINE_DEFAULT_DEBUG_CHANNEL(user32);
16
17 /* FUNCTIONS *****************************************************************/
18
19 /*
20 * @implemented
21 */
22 BOOL
23 WINAPI
24 RegisterServicesProcess(DWORD ServicesProcessId)
25 {
26 USER_API_MESSAGE ApiMessage;
27 PUSER_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest = &ApiMessage.Data.RegisterServicesProcessRequest;
28
29 RegisterServicesProcessRequest->ProcessId = ServicesProcessId;
30
31 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
32 NULL,
33 CSR_CREATE_API_NUMBER(USERSRV_SERVERDLL_INDEX, UserpRegisterServicesProcess),
34 sizeof(*RegisterServicesProcessRequest));
35 if (!NT_SUCCESS(ApiMessage.Status))
36 {
37 UserSetLastNTError(ApiMessage.Status);
38 return FALSE;
39 }
40
41 return TRUE;
42 }
43
44 /*
45 * @implemented
46 */
47 BOOL
48 WINAPI
49 RegisterLogonProcess(DWORD dwProcessId,
50 BOOL bRegister)
51 {
52 gfLogonProcess = NtUserxRegisterLogonProcess(dwProcessId, bRegister);
53
54 if (gfLogonProcess)
55 {
56 USER_API_MESSAGE ApiMessage;
57 PUSER_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest = &ApiMessage.Data.RegisterLogonProcessRequest;
58
59 RegisterLogonProcessRequest->ProcessId = dwProcessId;
60 RegisterLogonProcessRequest->Register = bRegister;
61
62 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
63 NULL,
64 CSR_CREATE_API_NUMBER(USERSRV_SERVERDLL_INDEX, UserpRegisterLogonProcess),
65 sizeof(*RegisterLogonProcessRequest));
66 if (!NT_SUCCESS(ApiMessage.Status))
67 {
68 ERR("Failed to register logon process with CSRSS\n");
69 UserSetLastNTError(ApiMessage.Status);
70 }
71 }
72
73 return gfLogonProcess;
74 }
75
76 /*
77 * Helper function used by SetWindowStationUser (see winsta.c)
78 */
79 VOID FASTCALL
80 Logon(BOOL IsLogon)
81 {
82 USER_API_MESSAGE ApiMessage;
83 PUSER_LOGON LogonRequest = &ApiMessage.Data.LogonRequest;
84
85 LogonRequest->IsLogon = IsLogon;
86 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
87 NULL,
88 CSR_CREATE_API_NUMBER(USERSRV_SERVERDLL_INDEX, UserpLogon),
89 sizeof(*LogonRequest));
90 }
91
92 /*
93 * @implemented
94 */
95 BOOL
96 WINAPI
97 SetLogonNotifyWindow(HWND Wnd)
98 {
99 return NtUserSetLogonNotifyWindow(Wnd);
100 }
101
102 /*
103 * @implemented
104 */
105 BOOL
106 WINAPI
107 UpdatePerUserSystemParameters(DWORD dwReserved,
108 BOOL bEnable)
109 {
110 // Update Imm support and load Imm32.dll.
111 UpdatePerUserImmEnabling();
112
113 return NtUserUpdatePerUserSystemParameters(dwReserved, bEnable);
114 }