diff --git a/configure b/configure index 119391d91ba..a2adb44e1a6 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 1bc3d13fc33..6064081a9c2 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 627c6ef56c1..861aa82c2a9 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 00000000000..0a3b08ec932 --- /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 00000000000..283f26e0f25 --- /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 +#include +#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; +}