Module: wine Branch: master Commit: 8f6e1db3e0c40bd99035605149d08f54af3f694e URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f6e1db3e0c40bd99035605149...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Dec 20 15:53:03 2007 +0100
wineboot: Add support for starting NT-style services.
---
programs/wineboot/wineboot.c | 53 ++++++++++++++++++++++++++++++++++++++++- 1 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c index 7da4662..e63bbbe 100644 --- a/programs/wineboot/wineboot.c +++ b/programs/wineboot/wineboot.c @@ -29,7 +29,7 @@ * - PendingRenameOperations (rename operations left in the registry - Win NT+ only) * * Startup (before the user logs in) - * - Services (NT, ?semi-synchronous?, not implemented yet) + * - Services (NT) * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce (9x, asynch) * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices (9x, asynch) * @@ -622,6 +622,51 @@ static int ProcessWindowsFileProtection(void) return 1; }
+/* start services */ +static void start_services(void) +{ + static const WCHAR servicesW[] = {'S','y','s','t','e','m','\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\', + 'S','e','r','v','i','c','e','s',0}; + static const WCHAR startW[] = {'S','t','a','r','t',0}; + HKEY hkey, skey; + DWORD type, size, start, index = 0; + WCHAR name[MAX_PATH]; + SC_HANDLE manager; + + if (RegOpenKeyW( HKEY_LOCAL_MACHINE, servicesW, &hkey )) return; + + if (!(manager = OpenSCManagerW( NULL, NULL, SC_MANAGER_ALL_ACCESS ))) + { + RegCloseKey( hkey ); + return; + } + + while (!RegEnumKeyW( hkey, index++, name, sizeof(name) )) + { + if (RegOpenKeyW( hkey, name, &skey )) continue; + size = sizeof(start); + if (!RegQueryValueExW( skey, startW, NULL, &type, (LPBYTE)&start, &size ) && type == REG_DWORD) + { + if (start == SERVICE_BOOT_START || + start == SERVICE_SYSTEM_START || + start == SERVICE_AUTO_START) + { + SC_HANDLE handle = OpenServiceW( manager, name, SERVICE_ALL_ACCESS ); + if (handle) + { + WINE_TRACE( "starting service %s start %u\n", wine_dbgstr_w(name), start ); + StartServiceW( handle, 0, NULL ); + CloseServiceHandle( handle ); + } + } + } + RegCloseKey( skey ); + } + CloseServiceHandle( manager ); + RegCloseKey( hkey ); +} + /* Process items in the StartUp group of the user's Programs under the Start Menu. Some installers put * shell links here to restart themselves after boot. */ static BOOL ProcessStartupItems(void) @@ -790,7 +835,11 @@ int main( int argc, char *argv[] )
ProcessWindowsFileProtection(); ProcessRunKeys( HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICESONCE], TRUE, FALSE ); - if (!restart) ProcessRunKeys( HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICES], FALSE, FALSE ); + if (!restart) + { + ProcessRunKeys( HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICES], FALSE, FALSE ); + start_services(); + } ProcessRunKeys( HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNONCE], TRUE, TRUE ); if (!restart) {