Sync with trunk r64222.
[reactos.git] / win32ss / user / winsrv / usersrv / register.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS User API Server DLL
4 * FILE: win32ss/user/winsrv/usersrv/register.c
5 * PURPOSE: Register logon window and services process
6 * PROGRAMMERS: Eric Kohl
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8 */
9
10 /* INCLUDES *******************************************************************/
11
12 #include "usersrv.h"
13
14 #define NDEBUG
15 #include <debug.h>
16
17 /* GLOBALS ********************************************************************/
18
19 static BOOLEAN ServicesProcessIdValid = FALSE;
20 static ULONG_PTR ServicesProcessId = 0;
21
22 ULONG_PTR LogonProcessId = 0;
23
24 /* PUBLIC SERVER APIS *********************************************************/
25
26 CSR_API(SrvRegisterLogonProcess)
27 {
28 PUSER_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest = &((PUSER_API_MESSAGE)ApiMessage)->Data.RegisterLogonProcessRequest;
29
30 if (RegisterLogonProcessRequest->Register)
31 {
32 if (LogonProcessId != 0)
33 return STATUS_LOGON_SESSION_EXISTS;
34
35 LogonProcessId = RegisterLogonProcessRequest->ProcessId;
36 }
37 else
38 {
39 if (ApiMessage->Header.ClientId.UniqueProcess != (HANDLE)LogonProcessId)
40 {
41 DPRINT1("Current logon process 0x%x, can't deregister from process 0x%x\n",
42 LogonProcessId, ApiMessage->Header.ClientId.UniqueProcess);
43 return STATUS_NOT_LOGON_PROCESS;
44 }
45
46 LogonProcessId = 0;
47 }
48
49 return STATUS_SUCCESS;
50 }
51
52 CSR_API(SrvRegisterServicesProcess)
53 {
54 PUSER_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest = &((PUSER_API_MESSAGE)ApiMessage)->Data.RegisterServicesProcessRequest;
55
56 if (ServicesProcessIdValid == TRUE)
57 {
58 /* Only accept a single call */
59 return STATUS_INVALID_PARAMETER;
60 }
61 else
62 {
63 ServicesProcessId = RegisterServicesProcessRequest->ProcessId;
64 ServicesProcessIdValid = TRUE;
65 return STATUS_SUCCESS;
66 }
67 }
68
69 /* EOF */