ReactOS  0.4.12-dev-18-gf469aca
globals.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Service Host
3  * LICENSE: BSD - See COPYING.ARM in the top level directory
4  * FILE: base/services/svchost/globals.c
5  * PURPOSE: Functions to initialize global settings and support
6  * PROGRAMMERS: ReactOS Portable Systems Group
7  */
8 
9 /* INCLUDES ******************************************************************/
10 
11 #include "svchost.h"
12 
13 /* GLOBALS *******************************************************************/
14 
21 
23 {
36 };
37 
39 {
48 };
49 
53 
54 /* FUNCTIONS *****************************************************************/
55 
56 VOID
57 WINAPI
59  _In_ HANDLE Heap
60  )
61 {
62  /* Save the heap handle */
63  g_hHeap = Heap;
64 }
65 
66 BOOL
67 WINAPI
69  _In_ LPVOID lpMem
70  )
71 {
72  /* Free memory back into the heap */
73  return HeapFree(g_hHeap, 0, lpMem);
74 }
75 
76 PVOID
77 WINAPI
80  _In_ DWORD dwBytes
81  )
82 {
83  /* Allocate memory from the heap */
84  return HeapAlloc(g_hHeap, dwFlags, dwBytes);
85 }
86 
87 VOID
88 WINAPI
90  VOID
91  )
92 {
93  ASSERT(g_pSvchostSharedGlobals == NULL);
94 
95  /* Is RPC initialized? */
97  {
98  /* Nope, go initialize it */
99  if (!NT_SUCCESS(RpcpInitRpcServer())) return;
100 
101  /* This is now done */
103  }
104 
105  /* Is NetBIOS initialized? */
107  {
108  /* Nope, set it up */
109  SvcNetBiosInit();
110 
111  /* This is now done */
113  }
114 
115  /* Do we have the global SIDs initialized? */
117  {
118  /* Create the SIDs we'll export in the global structure */
119  if (!NT_SUCCESS(ScCreateWellKnownSids())) return;
120 
121  /* This is now done */
123  }
124 
125  /* Allocate memory for the globals */
126  g_pSvchostSharedGlobals = MemAlloc(HEAP_ZERO_MEMORY,
127  sizeof(*g_pSvchostSharedGlobals));
128  if (g_pSvchostSharedGlobals == NULL) return;
129 
130  /* Write the pointers to the SIDs */
131  g_pSvchostSharedGlobals->NullSid = NullSid;
132  g_pSvchostSharedGlobals->WorldSid = WorldSid;
133  g_pSvchostSharedGlobals->LocalSid = LocalSid;
134  g_pSvchostSharedGlobals->NetworkSid = NetworkSid;
135  g_pSvchostSharedGlobals->LocalSystemSid = LocalSystemSid;
136  g_pSvchostSharedGlobals->LocalServiceSid = LocalServiceSid;
137  g_pSvchostSharedGlobals->NetworkServiceSid = NetworkServiceSid;
138  g_pSvchostSharedGlobals->BuiltinDomainSid = BuiltinDomainSid;
139  g_pSvchostSharedGlobals->AuthenticatedUserSid = AuthenticatedUserSid;
140  g_pSvchostSharedGlobals->AnonymousLogonSid = AnonymousLogonSid;
141  g_pSvchostSharedGlobals->AliasAdminsSid = AliasAdminsSid;
142  g_pSvchostSharedGlobals->AliasUsersSid = AliasUsersSid;
143  g_pSvchostSharedGlobals->AliasGuestsSid = AliasGuestsSid;
144  g_pSvchostSharedGlobals->AliasPowerUsersSid = AliasPowerUsersSid;
145  g_pSvchostSharedGlobals->AliasAccountOpsSid = AliasAccountOpsSid;
146  g_pSvchostSharedGlobals->AliasSystemOpsSid = AliasSystemOpsSid;
147  g_pSvchostSharedGlobals->AliasPrintOpsSid = AliasPrintOpsSid;
148  g_pSvchostSharedGlobals->AliasBackupOpsSid = AliasBackupOpsSid;
149 
150  /* Write the pointers to the callbacks */
151  g_pSvchostSharedGlobals->RpcpStartRpcServer = RpcpStartRpcServer;
152  g_pSvchostSharedGlobals->RpcpStopRpcServer = RpcpStopRpcServer;
153  g_pSvchostSharedGlobals->RpcpStopRpcServerEx = RpcpStopRpcServerEx;
154  g_pSvchostSharedGlobals->SvcNetBiosOpen = SvcNetBiosOpen;
155  g_pSvchostSharedGlobals->SvcNetBiosClose = SvcNetBiosClose;
156  g_pSvchostSharedGlobals->SvcNetBiosReset = SvcNetBiosReset;
157  g_pSvchostSharedGlobals->SvcRegisterStopCallback = SvcRegisterStopCallback;
158 }
159 
160 VOID
161 WINAPI
163  _In_ LPCWSTR lpSrcStr
164  )
165 {
166  DWORD cchSrc;
167 
168  /* If there's nothing to do, bail out */
169  if (lpSrcStr == NULL) return;
170 
171  /* Get the length of the input string */
172  cchSrc = wcslen(lpSrcStr);
173 
174  /* Call the locale API to lower-case it */
177  lpSrcStr,
178  cchSrc + 1,
179  (LPWSTR)lpSrcStr,
180  cchSrc + 1) == FALSE)
181  {
182  DBG_ERR("SvchostCharLowerW failed for %ws\n", lpSrcStr);
183  }
184 }
185 
186 NTSTATUS
187 NTAPI
190  _In_ ULONG DomainId,
191  _Out_ PSID *DestinationSid
192  )
193 {
194  ULONG sidCount, sidLength;
196 
197  /* Get the length of the SID based onthe number of subauthorities */
198  sidCount = *RtlSubAuthorityCountSid(SourceSid);
199  sidLength = RtlLengthRequiredSid(sidCount + 1);
200 
201  /* Allocate it */
202  *DestinationSid = RtlAllocateHeap(RtlGetProcessHeap(), 0, sidLength);
203  if (*DestinationSid)
204  {
205  /* Make a copy of it */
206  status = RtlCopySid(sidLength, *DestinationSid, SourceSid);
207  if (NT_SUCCESS(status))
208  {
209  /* Increase the subauthority count */
210  ++*RtlSubAuthorityCountSid(*DestinationSid);
211 
212  /* And add the specific domain RID we're creating */
213  *RtlSubAuthoritySid(*DestinationSid, sidCount) = DomainId;
214 
215  /* Everything worked */
216  status = STATUS_SUCCESS;
217  }
218  else
219  {
220  /* The SID copy failed, so free the SID we just allocated */
221  RtlFreeHeap(RtlGetProcessHeap(), 0, *DestinationSid);
222  }
223  }
224  else
225  {
226  /* No space for the SID, bail out */
227  status = STATUS_NO_MEMORY;
228  }
229 
230  /* Return back to the caller */
231  return status;
232 }
233 
234 NTSTATUS
235 NTAPI
237  _Out_ PVOID *Sid,
240  )
241 {
243 
244  /* Allocate room for the SID */
245  *Sid = RtlAllocateHeap(RtlGetProcessHeap(),
246  0,
247  RtlLengthRequiredSid(SubAuthorityCount));
248  if (*Sid)
249  {
250  /* Initialize it, we're done */
251  RtlInitializeSid(*Sid, IdentifierAuthority, SubAuthorityCount);
252  Status = STATUS_SUCCESS;
253  }
254  else
255  {
256  /* No memory, we'll fail */
257  Status = STATUS_NO_MEMORY;
258  }
259 
260  /* Return what happened */
261  return Status;
262 }
263 
264 NTSTATUS
265 NTAPI
267  VOID
268  )
269 {
270  ULONG i;
272 
273  /* Loop the non-domain SIDs */
274  for (i = 0; i < RTL_NUMBER_OF(SidData); i++)
275  {
276  /* Convert our optimized structure into an actual SID */
277  Status = ScAllocateAndInitializeSid(&SidData[i].Sid,
278  &SidData[i].Authority,
279  1);
280  if (!NT_SUCCESS(Status)) break;
281 
282  /* Write the correct sub-authority */
283  *RtlSubAuthoritySid(SidData[i].Sid, 0) = SidData[i].SubAuthority;
284  }
285 
286  /* Now loop the domain SIDs */
287  for (i = 0; i < RTL_NUMBER_OF(DomainSidData); i++)
288  {
289  /* Convert our optimized structure into an actual SID */
290  Status = ScDomainIdToSid(BuiltinDomainSid,
291  DomainSidData[i].SubAuthority,
292  &DomainSidData[i].Sid);
293  if (!NT_SUCCESS(Status)) break;
294  }
295 
296  /* If we got to the end, return success */
297  return (i == RTL_NUMBER_OF(DomainSidData)) ? STATUS_SUCCESS : STATUS_NO_MEMORY;
298 }
299 
NTSTATUS NTAPI RpcpStartRpcServer(_In_ LPCWSTR IfName, _In_ RPC_IF_HANDLE IfSpec)
Definition: rpcsrv.c:131
PSVCHOST_GLOBALS g_pSvchostSharedGlobals
Definition: globals.c:50
PSID AliasUsersSid
Definition: globals.c:17
#define SECURITY_AUTHENTICATED_USER_RID
Definition: setypes.h:540
#define SECURITY_LOCAL_SYSTEM_RID
Definition: setypes.h:546
#define DOMAIN_ALIAS_RID_GUESTS
Definition: setypes.h:626
PVOID AnonymousLogonSid
Definition: svchost.h:63
PVOID LocalServiceSid
Definition: svchost.h:59
PSID AnonymousLogonSid
Definition: globals.c:17
#define DBG_ERR(fmt,...)
Definition: svchost.h:35
PSID AliasGuestsSid
Definition: globals.c:18
* PSID_IDENTIFIER_AUTHORITY
Definition: setypes.h:436
#define SVCHOST_SID_INIT_COMPLETE
Definition: svchost.h:93
#define DOMAIN_ALIAS_RID_ACCOUNT_OPS
Definition: setypes.h:629
PVOID AliasAdminsSid
Definition: svchost.h:64
PSID AliasSystemOpsSid
Definition: globals.c:18
PVOID AliasPrintOpsSid
Definition: svchost.h:70
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:603
#define SECURITY_NETWORK_RID
Definition: setypes.h:529
PVOID AuthenticatedUserSid
Definition: svchost.h:62
PVOID AliasPowerUsersSid
Definition: svchost.h:67
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
NTSYSAPI PULONG NTAPI RtlSubAuthoritySid(_In_ PSID Sid, _In_ ULONG SubAuthority)
#define DOMAIN_ALIAS_RID_POWER_USERS
Definition: setypes.h:627
#define SECURITY_INTERACTIVE_RID
Definition: setypes.h:531
DOMAIN_SID_DATA DomainSidData[8]
Definition: globals.c:38
NTSTATUS NTAPI RpcpInitRpcServer(VOID)
Definition: rpcsrv.c:22
DWORD SubAuthority
Definition: svchost.h:111
#define SECURITY_NULL_SID_AUTHORITY
Definition: setypes.h:496
PSID BuiltinDomainSid
Definition: globals.c:16
PSID LocalSid
Definition: globals.c:15
PVOID RpcpStopRpcServerEx
Definition: svchost.h:74
VOID WINAPI MemInit(_In_ HANDLE Heap)
Definition: globals.c:58
NTSYSAPI NTSTATUS NTAPI RtlInitializeSid(IN OUT PSID Sid, IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, IN UCHAR SubAuthorityCount)
HANDLE g_hHeap
Definition: globals.c:52
GLenum GLclampf GLint i
Definition: glfuncs.h:14
PVOID SvcNetBiosClose
Definition: svchost.h:76
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
DWORD g_SvchostInitFlag
Definition: globals.c:51
#define SECURITY_LOCAL_SID_AUTHORITY
Definition: setypes.h:502
_In_ PSID SourceSid
Definition: rtlfuncs.h:1333
SID_DATA SidData[12]
Definition: globals.c:22
INT WINAPI LCMapStringW(LCID lcid, DWORD flags, LPCWSTR src, INT srclen, LPWSTR dst, INT dstlen)
Definition: lang.c:1645
PVOID RpcpStartRpcServer
Definition: svchost.h:72
PVOID NetworkServiceSid
Definition: svchost.h:60
PVOID NetworkSid
Definition: svchost.h:57
#define SVCHOST_NBT_INIT_COMPLETE
Definition: svchost.h:92
#define LCMAP_LOWERCASE
Definition: winnls.h:181
smooth NULL
Definition: ftsmooth.c:416
PVOID SvcNetBiosOpen
Definition: svchost.h:75
#define _Out_
Definition: no_sal2.h:323
_In_ ULONG _In_ ACCESS_MASK _In_ PSID Sid
Definition: rtlfuncs.h:1104
PSID AliasAdminsSid
Definition: globals.c:17
#define SECURITY_LOCAL_SERVICE_RID
Definition: setypes.h:547
PVOID NullSid
Definition: svchost.h:54
NTSTATUS NTAPI ScAllocateAndInitializeSid(_Out_ PVOID *Sid, _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, _In_ ULONG SubAuthorityCount)
Definition: globals.c:236
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:526
VOID WINAPI SvcNetBiosInit(VOID)
Definition: netbios.c:84
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:585
VOID WINAPI SvcNetBiosClose(VOID)
Definition: netbios.c:96
DWORD WINAPI SvcRegisterStopCallback(_In_ PHANDLE phNewWaitObject, _In_ LPCWSTR ServiceName, _In_ HANDLE hObject, _In_ PSVCHOST_STOP_CALLBACK pfnStopCallback, _In_ PVOID pContext, _In_ ULONG dwFlags)
Definition: svchost.c:518
PVOID SvcRegisterStopCallback
Definition: svchost.h:78
unsigned int BOOL
Definition: ntddk_ex.h:94
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define SECURITY_BUILTIN_DOMAIN_RID
Definition: setypes.h:553
PSID NetworkSid
Definition: globals.c:15
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:24
#define DOMAIN_ALIAS_RID_BACKUP_OPS
Definition: setypes.h:632
#define SECURITY_WORLD_SID_AUTHORITY
Definition: setypes.h:499
PSID LocalSystemSid
Definition: globals.c:16
NTSYSAPI PUCHAR NTAPI RtlSubAuthorityCountSid(IN PSID Sid)
Definition: sid.c:104
#define DOMAIN_ALIAS_RID_SYSTEM_OPS
Definition: setypes.h:630
#define SECURITY_LOCAL_RID
Definition: setypes.h:514
unsigned long DWORD
Definition: ntddk_ex.h:95
PVOID LocalSystemSid
Definition: svchost.h:58
PSID AuthenticatedUserSid
Definition: globals.c:17
PVOID AliasSystemOpsSid
Definition: svchost.h:69
#define SECURITY_WORLD_RID
Definition: setypes.h:513
VOID WINAPI SvchostBuildSharedGlobals(VOID)
Definition: globals.c:89
#define SECURITY_ANONYMOUS_LOGON_RID
Definition: setypes.h:535
PSID LocalServiceSid
Definition: globals.c:16
PSID NullSid
Definition: globals.c:15
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define SECURITY_NULL_RID
Definition: setypes.h:512
NTSTATUS NTAPI RpcpStopRpcServerEx(_In_ RPC_IF_HANDLE IfSpec)
Definition: rpcsrv.c:58
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
PSID AliasPrintOpsSid
Definition: globals.c:19
PSID WorldSid
Definition: globals.c:15
_In_ PSID_IDENTIFIER_AUTHORITY _In_ UCHAR SubAuthorityCount
Definition: rtlfuncs.h:1487
#define SECURITY_NETWORK_SERVICE_RID
Definition: setypes.h:548
#define WINAPI
Definition: msvc.h:20
PVOID SvcNetBiosReset
Definition: svchost.h:77
Status
Definition: gdiplustypes.h:24
#define _In_
Definition: no_sal2.h:204
PVOID RpcpStopRpcServer
Definition: svchost.h:73
#define DOMAIN_ALIAS_RID_USERS
Definition: setypes.h:625
NTSTATUS NTAPI ScDomainIdToSid(_In_ PSID SourceSid, _In_ ULONG DomainId, _Out_ PSID *DestinationSid)
Definition: globals.c:188
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
PVOID AliasGuestsSid
Definition: svchost.h:66
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
PVOID AliasUsersSid
Definition: svchost.h:65
NTSTATUS NTAPI RpcpStopRpcServer(_In_ RPC_IF_HANDLE IfSpec)
Definition: rpcsrv.c:33
PSID InteractiveSid
Definition: globals.c:15
PSID NetworkServiceSid
Definition: globals.c:16
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
VOID WINAPI SvchostCharLowerW(_In_ LPCWSTR lpSrcStr)
Definition: globals.c:162
NTSTATUS NTAPI ScCreateWellKnownSids(VOID)
Definition: globals.c:266
PSID AliasPowerUsersSid
Definition: globals.c:18
#define DOMAIN_ALIAS_RID_PRINT_OPS
Definition: setypes.h:631
#define SECURITY_SERVICE_RID
Definition: setypes.h:534
DWORD WINAPI SvcNetBiosReset(_In_ UCHAR LanaNum)
Definition: netbios.c:124
PVOID LocalSid
Definition: svchost.h:56
PSID AliasBackupOpsSid
Definition: globals.c:20
unsigned int ULONG
Definition: retypes.h:1
PVOID WorldSid
Definition: svchost.h:55
PSID ServiceLogonSid
Definition: globals.c:15
_In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
Definition: rtlfuncs.h:1487
BOOL WINAPI MemFree(_In_ LPVOID lpMem)
Definition: globals.c:68
WCHAR * LPWSTR
Definition: xmlstorage.h:184
PVOID AliasBackupOpsSid
Definition: svchost.h:71
PVOID BuiltinDomainSid
Definition: svchost.h:61
NTSYSAPI BOOLEAN WINAPI RtlCopySid(DWORD, PSID, PSID)
return STATUS_SUCCESS
Definition: btrfs.c:2710
PVOID WINAPI MemAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: globals.c:78
static SERVICE_STATUS status
Definition: service.c:31
#define DOMAIN_ALIAS_RID_ADMINS
Definition: setypes.h:624
PVOID AliasAccountOpsSid
Definition: svchost.h:68
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:394
VOID WINAPI SvcNetBiosOpen(VOID)
Definition: netbios.c:112
#define LANG_USER_DEFAULT
Definition: tnerror.cpp:50
#define SVCHOST_RPC_INIT_COMPLETE
Definition: svchost.h:91
PSID AliasAccountOpsSid
Definition: globals.c:18
NTSYSAPI ULONG NTAPI RtlLengthRequiredSid(IN ULONG SubAuthorityCount)
Definition: sid.c:54