diff --git a/configure b/configure index c64dc5ae2a7..450cb4f7ad5 100755 --- a/configure +++ b/configure @@ -1791,6 +1791,7 @@ enable_wmplayer enable_wordpad enable_write enable_wscript +enable_wuauserv enable_wusa enable_xcopy enable_server @@ -20960,6 +20961,7 @@ wine_fn_config_makefile programs/wordpad enable_wordpad wine_fn_config_makefile programs/write enable_write wine_fn_config_makefile programs/wscript enable_wscript wine_fn_config_makefile programs/wscript/tests enable_tests +wine_fn_config_makefile programs/wuauserv enable_wuauserv wine_fn_config_makefile programs/wusa enable_wusa wine_fn_config_makefile programs/xcopy enable_xcopy wine_fn_config_makefile programs/xcopy/tests enable_tests diff --git a/configure.ac b/configure.ac index 0d0ba2fb575..df652e87ac8 100644 --- a/configure.ac +++ b/configure.ac @@ -3942,6 +3942,7 @@ WINE_CONFIG_MAKEFILE(programs/wordpad) WINE_CONFIG_MAKEFILE(programs/write) WINE_CONFIG_MAKEFILE(programs/wscript) WINE_CONFIG_MAKEFILE(programs/wscript/tests) +WINE_CONFIG_MAKEFILE(programs/wuauserv) WINE_CONFIG_MAKEFILE(programs/wusa) WINE_CONFIG_MAKEFILE(programs/xcopy) WINE_CONFIG_MAKEFILE(programs/xcopy/tests) diff --git a/loader/wine.inf.in b/loader/wine.inf.in index e8354664b6e..3ddda8d5aad 100644 --- a/loader/wine.inf.in +++ b/loader/wine.inf.in @@ -133,6 +133,7 @@ AddService=FontCache,0,FontCacheService AddService=Schedule,0,TaskSchedulerService AddService=WineBus,0,WineBusService AddService=Winmgmt,0,WinmgmtService +AddService=wuauserv,0,wuauService [DefaultInstall.NT.Services] AddService=BITS,0,BITSService @@ -150,6 +151,7 @@ AddService=FontCache,0,FontCacheService AddService=Schedule,0,TaskSchedulerService AddService=WineBus,0,WineBusService AddService=Winmgmt,0,WinmgmtService +AddService=wuauserv,0,wuauService [DefaultInstall.ntamd64.Services] AddService=BITS,0,BITSService @@ -167,6 +169,7 @@ AddService=FontCache,0,FontCacheService AddService=Schedule,0,TaskSchedulerService AddService=WineBus,0,WineBusService AddService=Winmgmt,0,WinmgmtService +AddService=wuauserv,0,wuauService [Strings] MciExtStr="Software\Microsoft\Windows NT\CurrentVersion\MCI Extensions" @@ -3582,6 +3585,14 @@ ErrorControl=1 HKR,Parameters,"ServiceDll",,"%11%\schedsvc.dll" HKLM,%CurrentVersionNT%\SvcHost,"netsvcs",0x00010008,"Schedule" +[wuauService] +Description="wuauserv" +DisplayName="Automatic Updates" +ServiceBinary="%11%\wuauserv.exe" +ServiceType=32 +StartType=3 +ErrorControl=1 + [Services] HKLM,%CurrentVersion%\RunServices,"winemenubuilder",2,"%11%\winemenubuilder.exe -a -r" HKLM,"System\CurrentControlSet\Services\Eventlog\Application",,16 diff --git a/programs/wuauserv/Makefile.in b/programs/wuauserv/Makefile.in new file mode 100644 index 00000000000..ff9939bb64e --- /dev/null +++ b/programs/wuauserv/Makefile.in @@ -0,0 +1,6 @@ +MODULE = wuauserv.exe +APPMODE = -mconsole -mno-cygwin +IMPORTS = advapi32 + +C_SRCS = \ + main.c diff --git a/programs/wuauserv/main.c b/programs/wuauserv/main.c new file mode 100644 index 00000000000..31df299e90e --- /dev/null +++ b/programs/wuauserv/main.c @@ -0,0 +1,104 @@ +/* + * Copyright 2007 Jacek Caban for CodeWeavers + * Copyright 2016 Michael Müller + * + * 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(wuauserv); + +static WCHAR wuauservW[] = {'w','u','a','u','s','e','r','v',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: + WINE_TRACE( "shutting down\n" ); + status.dwCurrentState = SERVICE_STOP_PENDING; + status.dwControlsAccepted = 0; + SetServiceStatus( service_handle, &status ); + SetEvent( stop_event ); + return NO_ERROR; + default: + WINE_FIXME( "got service ctrl %x\n", ctrl ); + status.dwCurrentState = SERVICE_RUNNING; + SetServiceStatus( service_handle, &status ); + return NO_ERROR; + } +} + +static void WINAPI serv_main(DWORD argc, LPWSTR *argv) +{ + SERVICE_STATUS status; + + WINE_TRACE( "starting service\n" ); + + stop_event = CreateEventW( NULL, TRUE, FALSE, NULL ); + + service_handle = RegisterServiceCtrlHandlerExW( wuauservW, 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 ); + WINE_TRACE( "service stopped\n" ); +} + +int main(int argc, char **argv) +{ + static const SERVICE_TABLE_ENTRYW servtbl[] = + { + {wuauservW, serv_main}, + {NULL, NULL} + }; + + WINE_TRACE( "(%d %p)\n", argc, argv ); + + StartServiceCtrlDispatcherW( servtbl ); + return 0; +}