ReactOS 0.4.15-dev-8408-g466a198
register.c File Reference
#include "w32time.h"
#include <debug.h>
#include <strsafe.h>
#include "resource.h"
Include dependency graph for register.c:

Go to the source code of this file.

Functions

static PWSTR ReadString (_In_ UINT uID)
 
static HRESULT RegisterService (VOID)
 
static HRESULT SetParametersValues (VOID)
 
static HRESULT SetNtpClientValues (VOID)
 
HRESULT WINAPI DllRegisterServer (VOID)
 
HRESULT WINAPI DllUnregisterServer (VOID)
 

Function Documentation

◆ DllRegisterServer()

HRESULT WINAPI DllRegisterServer ( VOID  )

Definition at line 262 of file register.c.

263{
264 HRESULT hresult;
265
266 hresult = RegisterService();
267 if (FAILED(hresult))
268 return hresult;
269
270 hresult = SetParametersValues();
271 if (FAILED(hresult))
272 return hresult;
273
274 hresult = SetNtpClientValues();
275
276 return hresult;
277}
static HRESULT SetNtpClientValues(VOID)
Definition: register.c:217
static HRESULT RegisterService(VOID)
Definition: register.c:43
static HRESULT SetParametersValues(VOID)
Definition: register.c:172
#define FAILED(hr)
Definition: intsafe.h:51

◆ DllUnregisterServer()

HRESULT WINAPI DllUnregisterServer ( VOID  )

Definition at line 282 of file register.c.

283{
284 DPRINT1("DllUnregisterServer()\n");
285 return S_OK;
286}
#define DPRINT1
Definition: precomp.h:8
#define S_OK
Definition: intsafe.h:52

◆ ReadString()

static PWSTR ReadString ( _In_ UINT  uID)
static

Definition at line 16 of file register.c.

18{
20 int nLength;
21 PWSTR pszString, pszPtr;
22
23 hInstance = GetModuleHandleW(L"w32time");
24 if (hInstance == NULL)
25 return NULL;
26
27 nLength = LoadStringW(hInstance, uID, (LPWSTR)&pszPtr, 0);
28 if (nLength == 0)
29 return NULL;
30
32 if (pszString == NULL)
33 return NULL;
34
35 wcsncpy(pszString, pszPtr, nLength);
36
37 return pszString;
38}
HINSTANCE hInstance
Definition: charmap.c:19
#define NULL
Definition: types.h:112
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
#define L(x)
Definition: ntvdm.h:50
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
uint16_t * PWSTR
Definition: typedefs.h:56
_In_ DWORD nLength
Definition: wincon.h:473
_In_ DWORD _In_ DWORD _Out_writes_to_opt_ pcchString LPSTR pszString
Definition: wincrypt.h:4505
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by RegisterService().

◆ RegisterService()

static HRESULT RegisterService ( VOID  )
static

Definition at line 43 of file register.c.

44{
45 SC_HANDLE hServiceManager = NULL;
46 SC_HANDLE hService = NULL;
47 HKEY hKey = NULL;
48 PWSTR pszValue;
49 PWSTR pszDisplayName = NULL, pszDescription = NULL;
50 DWORD dwDisposition, dwError;
51 SERVICE_DESCRIPTIONW ServiceDescription;
52 HRESULT hresult = S_OK;
53
54 DPRINT("RegisterService()\n");
55
57 if (hServiceManager == NULL)
58 {
59 DPRINT1("OpenSCManager() failed!\n");
60 hresult = E_FAIL;
61 goto done;
62 }
63
64 pszDisplayName = ReadString(IDS_DISPLAYNAME);
65 if (pszDisplayName == NULL)
66 {
67 DPRINT1("ReadString(IDS_DISPLAYNAME) failed!\n");
68 hresult = E_FAIL;
69 goto done;
70 }
71
72 pszDescription = ReadString(IDS_DESCRIPTION);
73 if (pszDescription == NULL)
74 {
75 DPRINT1("ReadString(IDS_DESCRIPTION) failed!\n");
76 hresult = E_FAIL;
77 goto done;
78 }
79
80 hService = CreateServiceW(hServiceManager,
81 L"W32Time",
82 pszDisplayName,
87 L"%SystemRoot%\\system32\\svchost.exe -k netsvcs",
88 L"Time", NULL, NULL, L"LocalSystem", NULL);
89 if (hService == NULL)
90 {
91 DPRINT1("CreateService() failed!\n");
92 hresult = E_FAIL;
93 goto done;
94 }
95
96 ServiceDescription.lpDescription = pszDescription;
97 if (ChangeServiceConfig2W(hService,
99 &ServiceDescription) == FALSE)
100 {
101 DPRINT1("ChangeServiceConfig2() failed!\n");
102 hresult = E_FAIL;
103 goto done;
104 }
105
107 L"System\\CurrentControlSet\\Services\\W32Time\\Parameters",
108 0,
109 NULL,
111 KEY_WRITE,
112 NULL,
113 &hKey,
114 &dwDisposition);
115 if (dwError != ERROR_SUCCESS)
116 {
117 DPRINT1("RegCreateKeyEx() failed!\n");
118 hresult = E_FAIL;
119 goto done;
120 }
121
122 pszValue = L"%SystemRoot%\\system32\\w32time.dll";
123 dwError = RegSetValueExW(hKey,
124 L"ServiceDll",
125 0,
127 (LPBYTE)pszValue,
128 (wcslen(pszValue) + 1) * sizeof(WCHAR));
129 if (dwError != ERROR_SUCCESS)
130 {
131 DPRINT1("RegSetValueEx() failed!\n");
132 hresult = E_FAIL;
133 goto done;
134 }
135
136 pszValue = L"SvchostEntry_W32Time";
137 dwError = RegSetValueExW(hKey,
138 L"ServiceMain",
139 0,
140 REG_SZ,
141 (LPBYTE)pszValue,
142 (wcslen(pszValue) + 1) * sizeof(WCHAR));
143 if (dwError != ERROR_SUCCESS)
144 {
145 DPRINT1("RegSetValueEx() failed!\n");
146 hresult = E_FAIL;
147 goto done;
148 }
149
150done:
151 if (hKey)
153
154 if (hService)
155 CloseServiceHandle(hService);
156
157 if (hServiceManager)
158 CloseServiceHandle(hServiceManager);
159
160 if (pszDescription)
161 HeapFree(GetProcessHeap(), 0, pszDescription);
162
163 if (pszDisplayName)
164 HeapFree(GetProcessHeap(), 0, pszDisplayName);
165
166 return hresult;
167}
#define IDS_DESCRIPTION
Definition: resource.h:4
static PWSTR ReadString(_In_ UINT uID)
Definition: register.c:16
#define IDS_DISPLAYNAME
Definition: resource.h:3
#define RegCloseKey(hKey)
Definition: registry.h:49
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
#define HeapFree(x, y, z)
Definition: compat.h:735
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define REG_SZ
Definition: layer.c:22
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define KEY_WRITE
Definition: nt_native.h:1031
#define GENERIC_WRITE
Definition: nt_native.h:90
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, DWORD dwDesiredAccess)
Definition: scm.c:2068
SC_HANDLE WINAPI CreateServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, LPCWSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, LPCWSTR lpBinaryPathName, LPCWSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCWSTR lpDependencies, LPCWSTR lpServiceStartName, LPCWSTR lpPassword)
Definition: scm.c:812
BOOL WINAPI ChangeServiceConfig2W(SC_HANDLE hService, DWORD dwInfoLevel, LPVOID lpInfo)
Definition: scm.c:305
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
Definition: scm.c:580
#define DPRINT
Definition: sndvol32.h:73
LPWSTR lpDescription
Definition: winsvc.h:196
unsigned char * LPBYTE
Definition: typedefs.h:53
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define SERVICE_CONFIG_DESCRIPTION
Definition: winsvc.h:65
#define SC_MANAGER_CREATE_SERVICE
Definition: winsvc.h:15
#define SERVICE_WIN32_SHARE_PROCESS
Definition: cmtypes.h:963
#define SERVICE_AUTO_START
Definition: cmtypes.h:977
#define SERVICE_ERROR_NORMAL
Definition: cmtypes.h:982

Referenced by DllRegisterServer().

◆ SetNtpClientValues()

static HRESULT SetNtpClientValues ( VOID  )
static

Definition at line 217 of file register.c.

218{
219 HKEY hKey = NULL;
220 DWORD dwValue;
221 DWORD dwDisposition, dwError;
222 HRESULT hresult = S_OK;
223
225 L"System\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpClient",
226 0,
227 NULL,
229 KEY_WRITE,
230 NULL,
231 &hKey,
232 &dwDisposition);
233 if (dwError != ERROR_SUCCESS)
234 {
235 DPRINT1("RegCreateKeyEx() failed!\n");
236 goto done;
237 }
238
239 dwValue = W32TIME_POLL_INTERVAL;
240 dwError = RegSetValueExW(hKey,
241 L"SpecialPollInterval",
242 0,
243 REG_DWORD,
244 (LPBYTE)&dwValue,
245 sizeof(dwValue));
246 if (dwError != ERROR_SUCCESS)
247 {
248 DPRINT1("RegSetValueEx() failed!\n");
249 goto done;
250 }
251
252done:
253 if (hKey)
255
256 return hresult;
257}
#define REG_DWORD
Definition: sdbapi.c:596
#define W32TIME_POLL_INTERVAL
Definition: w32time.h:19

Referenced by DllRegisterServer().

◆ SetParametersValues()

static HRESULT SetParametersValues ( VOID  )
static

Definition at line 172 of file register.c.

173{
174 HKEY hKey = NULL;
175 PWSTR pszValue;
176 DWORD dwDisposition, dwError;
177 HRESULT hresult = S_OK;
178
180 L"System\\CurrentControlSet\\Services\\W32Time\\Parameters",
181 0,
182 NULL,
184 KEY_WRITE,
185 NULL,
186 &hKey,
187 &dwDisposition);
188 if (dwError != ERROR_SUCCESS)
189 {
190 DPRINT1("RegCreateKeyEx() failed!\n");
191 goto done;
192 }
193
194 pszValue = L"NTP";
195 dwError = RegSetValueExW(hKey,
196 L"Type",
197 0,
198 REG_SZ,
199 (LPBYTE)pszValue,
200 (wcslen(pszValue) + 1) * sizeof(WCHAR));
201 if (dwError != ERROR_SUCCESS)
202 {
203 DPRINT1("RegSetValueEx() failed!\n");
204 goto done;
205 }
206
207done:
208 if (hKey)
210
211 return hresult;
212}

Referenced by DllRegisterServer().