https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3d8d88eaf94e4d369c518…
commit 3d8d88eaf94e4d369c5184841e55954b946f8950
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Mon Dec 6 23:24:51 2021 +0100
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Mon Dec 6 23:24:51 2021 +0100
[W32TIME] Improve w32time setup
- Remove w32time from hivesys.inf
- Implement DllRegisterServer
- Add DllUnregisterServer stub
- Register w32time at the end of setup phase 2
---
base/services/w32time/CMakeLists.txt | 4 +-
base/services/w32time/lang/de-DE.rc | 7 +
base/services/w32time/lang/en-US.rc | 7 +
base/services/w32time/register.c | 286 +++++++++++++++++++++++++++++++++++
base/services/w32time/resource.h | 4 +
base/services/w32time/w32time.h | 1 +
base/services/w32time/w32time.rc | 20 +++
base/services/w32time/w32time.spec | 2 +
boot/bootdata/hivesys.inf | 26 ----
media/inf/syssetup.inf | 1 +
10 files changed, 331 insertions(+), 27 deletions(-)
diff --git a/base/services/w32time/CMakeLists.txt b/base/services/w32time/CMakeLists.txt
index 080d1fd3e18..f1d25b455d2 100644
--- a/base/services/w32time/CMakeLists.txt
+++ b/base/services/w32time/CMakeLists.txt
@@ -4,9 +4,11 @@ spec2def(w32time.dll w32time.spec ADD_IMPORTLIB)
add_library(w32time MODULE
w32time.c
ntpclient.c
+ register.c
+ w32time.rc
${CMAKE_CURRENT_BINARY_DIR}/w32time.def)
set_module_type(w32time win32dll UNICODE)
-add_importlibs(w32time ws2_32 advapi32 msvcrt kernel32 ntdll)
+add_importlibs(w32time ws2_32 advapi32 msvcrt user32 kernel32 ntdll)
add_cd_file(TARGET w32time DESTINATION reactos/system32 FOR all)
diff --git a/base/services/w32time/lang/de-DE.rc b/base/services/w32time/lang/de-DE.rc
new file mode 100644
index 00000000000..b4b7f2f2663
--- /dev/null
+++ b/base/services/w32time/lang/de-DE.rc
@@ -0,0 +1,7 @@
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
+
+STRINGTABLE
+BEGIN
+ IDS_DISPLAYNAME "Zeitgeberdienst"
+ IDS_DESCRIPTION "Verwaltet die Datum- und Uhrzeitsynchronisation auf allen
Clients und Servern im Netzwerk."
+END
diff --git a/base/services/w32time/lang/en-US.rc b/base/services/w32time/lang/en-US.rc
new file mode 100644
index 00000000000..3aef0f2a641
--- /dev/null
+++ b/base/services/w32time/lang/en-US.rc
@@ -0,0 +1,7 @@
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+STRINGTABLE
+BEGIN
+ IDS_DISPLAYNAME "Time Service"
+ IDS_DESCRIPTION "Maintains date and time synchronization on all clients and
servers on the network."
+END
diff --git a/base/services/w32time/register.c b/base/services/w32time/register.c
new file mode 100644
index 00000000000..205a288bb04
--- /dev/null
+++ b/base/services/w32time/register.c
@@ -0,0 +1,286 @@
+/*
+ * PROJECT: ReactOS W32Time Service
+ * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE: Service Registration
+ * COPYRIGHT: Copyright 2021 Eric Kohl <ekohl(a)reactos.org>
+ */
+
+#include "w32time.h"
+#include <debug.h>
+#include <strsafe.h>
+
+#include "resource.h"
+
+static
+PWSTR
+ReadString(
+ _In_ UINT uID)
+{
+ HINSTANCE hInstance;
+ int nLength;
+ PWSTR pszString, pszPtr;
+
+ hInstance = GetModuleHandleW(L"w32time");
+ if (hInstance == NULL)
+ return NULL;
+
+ nLength = LoadStringW(hInstance, uID, (LPWSTR)&pszPtr, 0);
+ if (nLength == 0)
+ return NULL;
+
+ pszString = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) *
sizeof(WCHAR));
+ if (pszString == NULL)
+ return NULL;
+
+ wcsncpy(pszString, pszPtr, nLength);
+
+ return pszString;
+}
+
+
+static
+HRESULT
+RegisterService(VOID)
+{
+ SC_HANDLE hServiceManager = NULL;
+ SC_HANDLE hService = NULL;
+ HKEY hKey = NULL;
+ PWSTR pszValue;
+ PWSTR pszDisplayName = NULL, pszDescription = NULL;
+ DWORD dwDisposition, dwError;
+ SERVICE_DESCRIPTIONW ServiceDescription;
+ HRESULT hresult = S_OK;
+
+ DPRINT("RegisterService()\n");
+
+ hServiceManager = OpenSCManagerW(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+ if (hServiceManager == NULL)
+ {
+ DPRINT1("OpenSCManager() failed!\n");
+ hresult = E_FAIL;
+ goto done;
+ }
+
+ pszDisplayName = ReadString(IDS_DISPLAYNAME);
+ if (pszDisplayName == NULL)
+ {
+ DPRINT1("ReadString(IDS_DISPLAYNAME) failed!\n");
+ hresult = E_FAIL;
+ goto done;
+ }
+
+ pszDescription = ReadString(IDS_DESCRIPTION);
+ if (pszDescription == NULL)
+ {
+ DPRINT1("ReadString(IDS_DESCRIPTION) failed!\n");
+ hresult = E_FAIL;
+ goto done;
+ }
+
+ hService = CreateServiceW(hServiceManager,
+ L"W32Time",
+ pszDisplayName,
+ GENERIC_WRITE,
+ SERVICE_WIN32_SHARE_PROCESS,
+ SERVICE_AUTO_START,
+ SERVICE_ERROR_NORMAL,
+ L"%SystemRoot%\\system32\\svchost.exe -k
netsvcs",
+ L"Time", NULL, NULL, L"LocalSystem",
NULL);
+ if (hService == NULL)
+ {
+ DPRINT1("CreateService() failed!\n");
+ hresult = E_FAIL;
+ goto done;
+ }
+
+ ServiceDescription.lpDescription = pszDescription;
+ if (ChangeServiceConfig2W(hService,
+ SERVICE_CONFIG_DESCRIPTION,
+ &ServiceDescription) == FALSE)
+ {
+ DPRINT1("ChangeServiceConfig2() failed!\n");
+ hresult = E_FAIL;
+ goto done;
+ }
+
+ dwError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
+
L"System\\CurrentControlSet\\Services\\W32Time\\Parameters",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_WRITE,
+ NULL,
+ &hKey,
+ &dwDisposition);
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT1("RegCreateKeyEx() failed!\n");
+ hresult = E_FAIL;
+ goto done;
+ }
+
+ pszValue = L"%SystemRoot%\\system32\\w32time.dll";
+ dwError = RegSetValueExW(hKey,
+ L"ServiceDll",
+ 0,
+ REG_EXPAND_SZ,
+ (LPBYTE)pszValue,
+ (wcslen(pszValue) + 1) * sizeof(WCHAR));
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueEx() failed!\n");
+ hresult = E_FAIL;
+ goto done;
+ }
+
+ pszValue = L"SvchostEntry_W32Time";
+ dwError = RegSetValueExW(hKey,
+ L"ServiceMain",
+ 0,
+ REG_SZ,
+ (LPBYTE)pszValue,
+ (wcslen(pszValue) + 1) * sizeof(WCHAR));
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueEx() failed!\n");
+ hresult = E_FAIL;
+ goto done;
+ }
+
+done:
+ if (hKey)
+ RegCloseKey(hKey);
+
+ if (hService)
+ CloseServiceHandle(hService);
+
+ if (hServiceManager)
+ CloseServiceHandle(hServiceManager);
+
+ if (pszDescription)
+ HeapFree(GetProcessHeap(), 0, pszDescription);
+
+ if (pszDisplayName)
+ HeapFree(GetProcessHeap(), 0, pszDisplayName);
+
+ return hresult;
+}
+
+
+static
+HRESULT
+SetParametersValues(VOID)
+{
+ HKEY hKey = NULL;
+ PWSTR pszValue;
+ DWORD dwDisposition, dwError;
+ HRESULT hresult = S_OK;
+
+ dwError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
+
L"System\\CurrentControlSet\\Services\\W32Time\\Parameters",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_WRITE,
+ NULL,
+ &hKey,
+ &dwDisposition);
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT1("RegCreateKeyEx() failed!\n");
+ goto done;
+ }
+
+ pszValue = L"NTP";
+ dwError = RegSetValueExW(hKey,
+ L"Type",
+ 0,
+ REG_SZ,
+ (LPBYTE)pszValue,
+ (wcslen(pszValue) + 1) * sizeof(WCHAR));
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueEx() failed!\n");
+ goto done;
+ }
+
+done:
+ if (hKey)
+ RegCloseKey(hKey);
+
+ return hresult;
+}
+
+
+static
+HRESULT
+SetNtpClientValues(VOID)
+{
+ HKEY hKey = NULL;
+ DWORD dwValue;
+ DWORD dwDisposition, dwError;
+ HRESULT hresult = S_OK;
+
+ dwError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
+
L"System\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpClient",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_WRITE,
+ NULL,
+ &hKey,
+ &dwDisposition);
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT1("RegCreateKeyEx() failed!\n");
+ goto done;
+ }
+
+ dwValue = 0x00093a80;
+ dwError = RegSetValueExW(hKey,
+ L"SpecialPollInterval",
+ 0,
+ REG_DWORD,
+ (LPBYTE)&dwValue,
+ sizeof(dwValue));
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueEx() failed!\n");
+ goto done;
+ }
+
+done:
+ if (hKey)
+ RegCloseKey(hKey);
+
+ return hresult;
+}
+
+
+HRESULT
+WINAPI
+DllRegisterServer(VOID)
+{
+ HRESULT hresult;
+
+ hresult = RegisterService();
+ if (FAILED(hresult))
+ return hresult;
+
+ hresult = SetParametersValues();
+ if (FAILED(hresult))
+ return hresult;
+
+ hresult = SetNtpClientValues();
+
+ return hresult;
+}
+
+
+HRESULT
+WINAPI
+DllUnregisterServer(VOID)
+{
+ DPRINT1("DllUnregisterServer()\n");
+ return S_OK;
+}
diff --git a/base/services/w32time/resource.h b/base/services/w32time/resource.h
new file mode 100644
index 00000000000..d3049b4a38b
--- /dev/null
+++ b/base/services/w32time/resource.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#define IDS_DISPLAYNAME 200
+#define IDS_DESCRIPTION 201
diff --git a/base/services/w32time/w32time.h b/base/services/w32time/w32time.h
index 87be3d09d68..0bd729e6d6f 100644
--- a/base/services/w32time/w32time.h
+++ b/base/services/w32time/w32time.h
@@ -12,6 +12,7 @@
#include <winnls.h>
#include <winreg.h>
#include <winsvc.h>
+#include <winuser.h>
#define MAX_VALUE_NAME 16383
#define NTPPORT 123
diff --git a/base/services/w32time/w32time.rc b/base/services/w32time/w32time.rc
new file mode 100644
index 00000000000..4b0b320485d
--- /dev/null
+++ b/base/services/w32time/w32time.rc
@@ -0,0 +1,20 @@
+#include <windef.h>
+#include <winuser.h>
+
+#include "resource.h"
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "Time Service"
+#define REACTOS_STR_INTERNAL_NAME "w32time"
+#define REACTOS_STR_ORIGINAL_FILENAME "w32time.dll"
+#include <reactos/version.rc>
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+#ifdef LANGUAGE_DE_DE
+ #include "lang/de-DE.rc"
+#endif
+#ifdef LANGUAGE_EN_US
+ #include "lang/en-US.rc"
+#endif
diff --git a/base/services/w32time/w32time.spec b/base/services/w32time/w32time.spec
index 32d25bff181..6e0850009aa 100644
--- a/base/services/w32time/w32time.spec
+++ b/base/services/w32time/w32time.spec
@@ -1,3 +1,5 @@
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()
6 stdcall SvchostEntry_W32Time(long ptr) W32TmServiceMain
18 stdcall W32TimeSyncNow(wstr long long)
21 stdcall W32TmServiceMain(long ptr)
diff --git a/boot/bootdata/hivesys.inf b/boot/bootdata/hivesys.inf
index fa6c21b9261..4f2024799b2 100644
--- a/boot/bootdata/hivesys.inf
+++ b/boot/bootdata/hivesys.inf
@@ -2072,20 +2072,6 @@
HKLM,"SYSTEM\CurrentControlSet\Services\WlanSvc","ObjectName",0x00000000,"LocalS
HKLM,"SYSTEM\CurrentControlSet\Services\WlanSvc","Start",0x00010001,0x00000002
HKLM,"SYSTEM\CurrentControlSet\Services\WlanSvc","Type",0x00010001,0x00000110
-; W32TIME service
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time","DisplayName",0x00000000,%W32TIME_SERVICE%
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time","Description",0x00000000,%W32TIME_SERVICE_DESCRIPTION%
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time","ErrorControl",0x00010001,0x00000001
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time","Group",0x00000000,"Time"
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time","ImagePath",0x00020000,"%SystemRoot%\system32\svchost.exe
-k netsvcs"
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time","ObjectName",0x00000000,"LocalSystem"
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time","Start",0x00010001,0x00000002
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time","Type",0x00010001,0x00000020
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time\Parameters","ServiceDll",0x00020000,"%SystemRoot%\system32\w32time.dll"
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time\Parameters","ServiceMain",0x00000000,"SvchostEntry_W32Time"
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time\Parameters","Type",0x00010000,"NTP"
-HKLM,"SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient","SpecialPollInterval",0x00010001,0x00093a80
-
; Simple TCP services
HKLM,"SYSTEM\CurrentControlSet\Services\tcpsvcs","Description",0x00000000,%TCPSVCS_SERVICE_DECRIPTION%
HKLM,"SYSTEM\CurrentControlSet\Services\tcpsvcs","DisplayName",0x00000000,%TCPSVCS_SERVICE%
@@ -2317,9 +2303,6 @@ WINMGMT_SERVICE_DESCRIPTION="Provides interface to system
management information
WLANSVC_SERVICE="WLAN Service"
WLANSVC_SERVICE_DESCRIPTION="WLAN Service"
-W32TIME_SERVICE="Time Service"
-W32TIME_SERVICE_DESCRIPTION="ReactOS Time Service"
-
WORKSTATION_SERVICE="Workstation"
WORKSTATION_SERVICE_DESCRIPTION="Responsible for creating and maintaining network
connections to servers."
@@ -2474,9 +2457,6 @@ WINMGMT_SERVICE_DESCRIPTION="Dostarcza interfejs w celu
uzyskiwania dostępu do
WLANSVC_SERVICE="Usługa WLAN"
WLANSVC_SERVICE_DESCRIPTION="Usługa WLAN"
-W32TIME_SERVICE="Usługa Czas"
-W32TIME_SERVICE_DESCRIPTION="Usługa Czas systemu ReactOS"
-
WORKSTATION_SERVICE="Stacja robocza"
WORKSTATION_SERVICE_DESCRIPTION="Tworzy i zachowuje połączenia sieciowe klientów z
serwerami."
@@ -2936,9 +2916,6 @@ WINMGMT_SERVICE_DESCRIPTION="Proporciona una interfaz para la
gestión de la inf
WLANSVC_SERVICE="Servicio de WLAN"
WLANSVC_SERVICE_DESCRIPTION="Servicio de redes inalámbricas WLAN."
-W32TIME_SERVICE="Servicio de hora"
-W32TIME_SERVICE_DESCRIPTION="Servicio de hora para ReactOS"
-
WORKSTATION_SERVICE="Estación de trabajo"
WORKSTATION_SERVICE_DESCRIPTION="Es el responsable de crear y mantener las
conexiones de redes LAN a los servidores."
@@ -3092,9 +3069,6 @@ WINMGMT_SERVICE_DESCRIPTION="Sistem yönetim bilgisine arayüz
sağlar."
WLANSVC_SERVICE="WLAN Hizmeti"
WLANSVC_SERVICE_DESCRIPTION="WLAN Hizmeti"
-W32TIME_SERVICE="Zaman Hizmeti"
-W32TIME_SERVICE_DESCRIPTION="ReactOS Zaman Hizmeti"
-
WORKSTATION_SERVICE="İş İstasyonu"
WORKSTATION_SERVICE_DESCRIPTION="Sunuculara ağ bağlantılarını oluşturmaktan ve
yönetmekten sorumludur."
diff --git a/media/inf/syssetup.inf b/media/inf/syssetup.inf
index 2a5375352bb..0196d9bca52 100644
--- a/media/inf/syssetup.inf
+++ b/media/inf/syssetup.inf
@@ -113,6 +113,7 @@ AddReg=Classes
11,,stobject.dll,1
11,,urlmon.dll,3
11,,vbscript.dll,1
+11,,w32time.dll,1
11,,windowscodecs.dll,1
11,,winhttp.dll,1
11,,wininet.dll,2