Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
configure.ac | 1 +
loader/wine.inf.in | 11 +++++
programs/winmgmt/Makefile.in | 6 +++
programs/winmgmt/main.c | 100 +++++++++++++++++++++++++++++++++++++++++++
4 files changed, 118 insertions(+)
create mode 100644 programs/winmgmt/Makefile.in
create mode 100644 programs/winmgmt/main.c
diff --git a/configure.ac b/configure.ac
index 6fb1e9287b..d2592d6893 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3921,6 +3921,7 @@ WINE_CONFIG_MAKEFILE(programs/winetest)
WINE_CONFIG_MAKEFILE(programs/winevdm,enable_win16)
WINE_CONFIG_MAKEFILE(programs/winhelp.exe16,enable_win16)
WINE_CONFIG_MAKEFILE(programs/winhlp32)
+WINE_CONFIG_MAKEFILE(programs/winmgmt)
WINE_CONFIG_MAKEFILE(programs/winoldap.mod16,enable_win16)
WINE_CONFIG_MAKEFILE(programs/winver)
WINE_CONFIG_MAKEFILE(programs/wmic)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 627c6ef56c..861aa82c2a 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -135,6 +135,7 @@ AddService=FontCache,0,FontCacheService
AddService=Schedule,0,TaskSchedulerService
AddService=WineBus,0,WineBusService
AddService=WineHID,0,WineHIDService
+AddService=Winmgmt,0,WinmgmtService
[DefaultInstall.NT.Services]
AddService=BITS,0,BITSService
@@ -151,6 +152,7 @@ AddService=FontCache,0,FontCacheService
AddService=Schedule,0,TaskSchedulerService
AddService=WineBus,0,WineBusService
AddService=WineHID,0,WineHIDService
+AddService=Winmgmt,0,WinmgmtService
[DefaultInstall.ntamd64.Services]
AddService=BITS,0,BITSService
@@ -167,6 +169,7 @@ AddService=FontCache,0,FontCacheService
AddService=Schedule,0,TaskSchedulerService
AddService=WineBus,0,WineBusService
AddService=WineHID,0,WineHIDService
+AddService=Winmgmt,0,WinmgmtService
[Strings]
MciExtStr="Software\Microsoft\Windows NT\CurrentVersion\MCI Extensions"
@@ -3321,6 +3324,14 @@ ServiceType=32
StartType=3
ErrorControl=1
+[WinmgmtService]
+Description="Provides access to Windows Management Instrumentation"
+DisplayName="Windows Management Instrumentation Service"
+ServiceBinary="%11%\winmgmt.exe"
+ServiceType=32
+StartType=3
+ErrorControl=1
+
[StiService]
AddReg=StiServiceKeys
Description="WIA Service"
diff --git a/programs/winmgmt/Makefile.in b/programs/winmgmt/Makefile.in
new file mode 100644
index 0000000000..0a3b08ec93
--- /dev/null
+++ b/programs/winmgmt/Makefile.in
@@ -0,0 +1,6 @@
+MODULE = winmgmt.exe
+APPMODE = -mconsole -municode
+IMPORTS = advapi32
+
+C_SRCS = \
+ main.c
diff --git a/programs/winmgmt/main.c b/programs/winmgmt/main.c
new file mode 100644
index 0000000000..283f26e0f2
--- /dev/null
+++ b/programs/winmgmt/main.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2018 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define WIN32_LEAN_AND_MEAN
+
+#include <windows.h>
+#include <winsvc.h>
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(winmgmt);
+
+static WCHAR winmgmtW[] = {'W','i','n','m','g','m','t',0};
+
+static SERVICE_STATUS_HANDLE service_handle;
+static HANDLE stop_event;
+
+static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context )
+{
+ SERVICE_STATUS status;
+
+ status.dwServiceType = SERVICE_WIN32;
+ status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+ status.dwWin32ExitCode = 0;
+ status.dwServiceSpecificExitCode = 0;
+ status.dwCheckPoint = 0;
+ status.dwWaitHint = 0;
+
+ switch(ctrl)
+ {
+ case SERVICE_CONTROL_STOP:
+ case SERVICE_CONTROL_SHUTDOWN:
+ TRACE( "shutting down\n" );
+ status.dwCurrentState = SERVICE_STOP_PENDING;
+ status.dwControlsAccepted = 0;
+ SetServiceStatus( service_handle, &status );
+ SetEvent( stop_event );
+ return NO_ERROR;
+ default:
+ FIXME( "got service ctrl %x\n", ctrl );
+ status.dwCurrentState = SERVICE_RUNNING;
+ SetServiceStatus( service_handle, &status );
+ return NO_ERROR;
+ }
+}
+
+static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv )
+{
+ SERVICE_STATUS status;
+
+ TRACE( "starting service\n" );
+
+ stop_event = CreateEventW( NULL, TRUE, FALSE, NULL );
+
+ service_handle = RegisterServiceCtrlHandlerExW( winmgmtW, service_handler, NULL );
+ if (!service_handle)
+ return;
+
+ status.dwServiceType = SERVICE_WIN32;
+ status.dwCurrentState = SERVICE_RUNNING;
+ status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
+ status.dwWin32ExitCode = 0;
+ status.dwServiceSpecificExitCode = 0;
+ status.dwCheckPoint = 0;
+ status.dwWaitHint = 10000;
+ SetServiceStatus( service_handle, &status );
+
+ WaitForSingleObject( stop_event, INFINITE );
+
+ status.dwCurrentState = SERVICE_STOPPED;
+ status.dwControlsAccepted = 0;
+ SetServiceStatus( service_handle, &status );
+ TRACE( "service stopped\n" );
+}
+
+int wmain( int argc, WCHAR *argv[] )
+{
+ static const SERVICE_TABLE_ENTRYW service_table[] =
+ {
+ { winmgmtW, ServiceMain },
+ { NULL, NULL }
+ };
+
+ StartServiceCtrlDispatcherW( service_table );
+ return 0;
+}
--
2.11.0