ReactOS  0.4.14-dev-57-g333b8f1
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 {
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 */
127  sizeof(*g_pSvchostSharedGlobals));
128  if (g_pSvchostSharedGlobals == NULL) return;
129 
130  /* Write the pointers to the SIDs */
149 
150  /* Write the pointers to the callbacks */
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 */
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 */
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,
248  if (*Sid)
249  {
250  /* Initialize it, we're done */
253  }
254  else
255  {
256  /* No memory, we'll fail */
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 */
278  &SidData[i].Authority,
279  1);
280  if (!NT_SUCCESS(Status)) break;
281 
282  /* Write the correct sub-authority */
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 */
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 */
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
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#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:606
#define SECURITY_NETWORK_RID
Definition: setypes.h:529
PVOID AuthenticatedUserSid
Definition: svchost.h:62
PVOID AliasPowerUsersSid
Definition: svchost.h:67
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
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
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
unsigned int BOOL
Definition: ntddk_ex.h:94
#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:2021
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:588
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
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:32
#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 WINAPI
Definition: msvc.h:8
#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
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:2966
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
Definition: ps.c:97