From a00af0d288f300ebfa195e0138e148881cc22b9e Mon Sep 17 00:00:00 2001 From: Misha Koshelev Date: Sun, 11 Feb 2007 21:09:45 -0600 Subject: [PATCH] wineboot: Start items in StartUp folder on boot. --- programs/wineboot/Makefile.in | 3 +- programs/wineboot/wineboot.c | 96 +++++++++++++++++++++++++++++++++-- 2 files changed, 95 insertions(+), 4 deletions(-) diff --git a/programs/wineboot/Makefile.in b/programs/wineboot/Makefile.in index 08c27a5115f..b11b2808259 100644 --- a/programs/wineboot/Makefile.in +++ b/programs/wineboot/Makefile.in @@ -4,7 +4,8 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = wineboot.exe APPMODE = -mconsole -IMPORTS = version user32 advapi32 kernel32 +IMPORTS = shell32 shlwapi version user32 advapi32 kernel32 +EXTRALIBS = -luuid C_SRCS = \ shutdown.c \ diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c index 14340039a84..27babc7525f 100644 --- a/programs/wineboot/wineboot.c +++ b/programs/wineboot/wineboot.c @@ -37,9 +37,9 @@ * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, synch) * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch) * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch) - * - Startup folders (all, ?asynch?, no imp) + * - Startup folders (all, ?asynch?) * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, asynch) - * + * * Somewhere in there is processing the RunOnceEx entries (also no imp) * * Bugs: @@ -63,6 +63,12 @@ #include #include +#define COBJMACROS +#include +#include +#include +#include + WINE_DEFAULT_DEBUG_CHANNEL(wineboot); #define MAX_LINE_LENGTH (2*MAX_PATH+2) @@ -616,6 +622,88 @@ static int ProcessWindowsFileProtection(void) return 1; } +/* 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) +{ + BOOL ret = FALSE; + HRESULT hr; + int iRet; + IMalloc *ppM = NULL; + IShellFolder *psfDesktop = NULL, *psfStartup = NULL; + LPITEMIDLIST pidlStartup = NULL, pidlItem; + ULONG NumPIDLs; + IEnumIDList *iEnumList = NULL; + STRRET strret; + WCHAR wszCommand[MAX_PATH]; + + WINE_TRACE("Processing items in the StartUp folder.\n"); + + hr = SHGetMalloc(&ppM); + if (FAILED(hr)) + { + WINE_ERR("Couldn't get IMalloc object.\n"); + goto done; + } + + hr = SHGetDesktopFolder(&psfDesktop); + if (FAILED(hr)) + { + WINE_ERR("Couldn't get desktop folder.\n"); + goto done; + } + + hr = SHGetSpecialFolderLocation(NULL, CSIDL_STARTUP, &pidlStartup); + if (FAILED(hr)) + { + WINE_TRACE("Couldn't get StartUp folder location.\n"); + goto done; + } + + hr = IShellFolder_BindToObject(psfDesktop, pidlStartup, NULL, &IID_IShellFolder, (LPVOID*)&psfStartup); + if (FAILED(hr)) + { + WINE_TRACE("Couldn't bind IShellFolder to StartUp folder.\n"); + goto done; + } + + hr = IShellFolder_EnumObjects(psfStartup, NULL, SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &iEnumList); + if (FAILED(hr)) + { + WINE_TRACE("Unable to enumerate StartUp objects.\n"); + goto done; + } + + while (IEnumIDList_Next(iEnumList, 1, &pidlItem, &NumPIDLs) == S_OK && + (NumPIDLs) == 1) + { + hr = IShellFolder_GetDisplayNameOf(psfStartup, pidlItem, SHGDN_FORPARSING, &strret); + if (FAILED(hr)) + WINE_TRACE("Unable to get display name of enumeration item.\n"); + else + { + hr = StrRetToBufW(&strret, pidlItem, wszCommand, MAX_PATH); + if (FAILED(hr)) + WINE_TRACE("Unable to parse display name.\n"); + else + if ((iRet = (int)ShellExecuteW(NULL, NULL, wszCommand, NULL, NULL, SW_SHOWNORMAL)) <= 32) + WINE_ERR("Error %d executing command %s.\n", iRet, wine_dbgstr_w(wszCommand)); + } + + IMalloc_Free(ppM, pidlItem); + } + + /* Return success */ + ret = TRUE; + +done: + if (iEnumList) IEnumIDList_Release(iEnumList); + if (psfStartup) IShellFolder_Release(psfStartup); + if (pidlStartup) IMalloc_Free(ppM, pidlStartup); + + return ret; +} + static void usage(void) { WINE_MESSAGE( "Usage: wineboot [options]\n" ); @@ -732,7 +820,9 @@ int main( int argc, char *argv[] ) FALSE, FALSE )) && (!ops.postlogin || !ops.startup || ProcessRunKeys( HKEY_CURRENT_USER, runkeys_names[RUNKEY_RUN], - FALSE, FALSE )); + FALSE, FALSE )) && + (!ops.postlogin || !ops.startup || + ProcessStartupItems( )); WINE_TRACE("Operation done\n");