Hans Leidekker : programs: Add a stub winmgmt service.

Alexandre Julliard julliard at winehq.org
Thu May 3 18:04:02 CDT 2018


Module: wine
Branch: master
Commit: 623543bedc17eec14252ad3f81e87af010143b2f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=623543bedc17eec14252ad3f81e87af010143b2f

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu May  3 13:29:50 2018 +0200

programs: Add a stub winmgmt service.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 configure                    |   2 +
 configure.ac                 |   1 +
 loader/wine.inf.in           |  11 +++++
 programs/winmgmt/Makefile.in |   6 +++
 programs/winmgmt/main.c      | 100 +++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 120 insertions(+)

diff --git a/configure b/configure
index 119391d..a2adb44 100755
--- a/configure
+++ b/configure
@@ -1727,6 +1727,7 @@ enable_winemsibuilder
 enable_winepath
 enable_winetest
 enable_winhlp32
+enable_winmgmt
 enable_winver
 enable_wmic
 enable_wmplayer
@@ -19298,6 +19299,7 @@ wine_fn_config_makefile programs/winetest enable_winetest
 wine_fn_config_makefile programs/winevdm enable_win16
 wine_fn_config_makefile programs/winhelp.exe16 enable_win16
 wine_fn_config_makefile programs/winhlp32 enable_winhlp32
+wine_fn_config_makefile programs/winmgmt enable_winmgmt
 wine_fn_config_makefile programs/winoldap.mod16 enable_win16
 wine_fn_config_makefile programs/winver enable_winver
 wine_fn_config_makefile programs/wmic enable_wmic
diff --git a/configure.ac b/configure.ac
index 1bc3d13..6064081 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3920,6 +3920,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 627c6ef..861aa82 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 0000000..0a3b08e
--- /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 0000000..283f26e
--- /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;
+}




More information about the wine-cvs mailing list