Alexandre Julliard : wineboot: Add support for starting NT-style services.
Alexandre Julliard
julliard at winehq.org
Fri Dec 21 07:28:22 CST 2007
Module: wine
Branch: master
Commit: 8f6e1db3e0c40bd99035605149d08f54af3f694e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f6e1db3e0c40bd99035605149d08f54af3f694e
Author: Alexandre Julliard <julliard at 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)
{
More information about the wine-cvs
mailing list