#include #include #define FRONTEND_FOR_A "base.exe" #define FRONTEND_FOR_W L"base.exe" #ifdef WINDOWS_GUI_SUBSYSTEM #define PROCESS_CREATION_FLAGS DETACHED_PROCESS #define PROCESS_DWFLAGS STARTF_FORCEONFEEDBACK #else #define PROCESS_CREATION_FLAGS 0 #define PROCESS_DWFLAGS 0 #endif /* - CreateProcess and pass all inheritable (stdioe) handles to it.*/ /* - Wait for its termination */ /* - Return its exit code */ /* We will pass the name of our executable as a first argument to the process * that we've created. He will mount us as an archive and do what we are for. * - We will use GetCommandLine (a/w) * */ /* * - stdin is * * */ static cantDoWide=0; static DWORD wideStarter() { size_t new_cmdline_length; DWORD result=0; WCHAR *new_cmdline; WCHAR who_am_i[MAX_PATH+1]; WCHAR *mycmdline = GetCommandLineW(); WCHAR ercd[100]; STARTUPINFOW startup; PROCESS_INFORMATION pinfo; WCHAR imgname[MAX_PATH+1],*filepart; WCHAR oldpwd[MAX_PATH+1], sysdir[MAX_PATH+1]; if (!mycmdline) {cantDoWide=1; return 0;} /* Advance mycmdline to find quotes or else */ while (mycmdline[0]==L' ') ++mycmdline; if (mycmdline[0]==L'"') { do { ++mycmdline; } while (mycmdline[0] && mycmdline[0]!=L'"'); if (mycmdline[0]==L'"') ++mycmdline; } else { if (mycmdline[0]) do { ++mycmdline; } while (mycmdline[0] && mycmdline[0]!=L' '); } while (mycmdline[0]==L' ') ++mycmdline; if (GetModuleFileNameW(NULL,who_am_i,MAX_PATH)==FALSE) {cantDoWide=1; return 0;} GetCurrentDirectoryW(MAX_PATH,oldpwd); GetSystemDirectoryW(sysdir,MAX_PATH); _wchdir(sysdir); SearchPathW(NULL,FRONTEND_FOR_W,NULL,MAX_PATH,imgname,&filepart); _wchdir(oldpwd); new_cmdline = malloc(sizeof(WCHAR)*(wcslen(mycmdline)+wcslen(who_am_i)+wcslen(imgname)+40)); swprintf(new_cmdline,L"\"%s\" \"%s\" %s",imgname,who_am_i,mycmdline); startup.cb = sizeof(STARTUPINFOW); startup.lpReserved = NULL; startup.lpReserved2 = NULL; startup.lpDesktop = NULL; startup.lpTitle = NULL; startup.dwFlags = PROCESS_DWFLAGS; if (CreateProcessW(imgname, new_cmdline, NULL,NULL, FALSE, /* inherit */ PROCESS_CREATION_FLAGS, /* flags */ NULL, /* envp */ NULL, /* cwd */ &startup, /* startupinfo */ &pinfo /* pinfo */ )==FALSE) { swprintf(ercd,L"Failed to start: %d",GetLastError()); MessageBoxW(NULL,ercd,imgname,0); } #ifndef FIRE_AND_FORGET WaitForSingleObject(pinfo.hProcess, INFINITE); GetExitCodeProcess(pinfo.hProcess, &result); #endif CloseHandle(pinfo.hProcess); CloseHandle(pinfo.hThread); free(new_cmdline); return result; } static DWORD ansiStarter() { size_t new_cmdline_length; DWORD result=0; char *new_cmdline; char who_am_i[MAX_PATH]; char *mycmdline = GetCommandLineA(); char imgname[MAX_PATH], *filepart; char oldpwd[MAX_PATH+1], sysdir[MAX_PATH+1]; STARTUPINFOA startup; PROCESS_INFORMATION pinfo; /* Advance mycmdline to find quotes or else */ while (mycmdline[0]==' ') ++mycmdline; if (mycmdline[0]=='"') { do { ++mycmdline; } while (mycmdline[0] && mycmdline[0]!='"'); } else { do { ++mycmdline; } while (mycmdline[0] && mycmdline[0]!=' '); } while (mycmdline[0]==' ') ++mycmdline; GetModuleFileNameA(NULL,who_am_i,MAX_PATH); new_cmdline = malloc(strlen(mycmdline)+strlen(who_am_i)+10); sprintf(new_cmdline,"\"%s\" \"%s\" %s",imgname,who_am_i,mycmdline); startup.cb = sizeof(STARTUPINFOA); startup.lpReserved = NULL; startup.lpReserved2 = NULL; startup.lpDesktop = NULL; startup.lpTitle = NULL; startup.dwFlags = PROCESS_DWFLAGS; GetCurrentDirectoryA(MAX_PATH,oldpwd); GetSystemDirectoryA(sysdir,MAX_PATH); _chdir(sysdir); SearchPathA(NULL,FRONTEND_FOR_A,NULL,MAX_PATH,imgname,&filepart); _chdir(oldpwd); CreateProcessA(imgname, new_cmdline, NULL,NULL, TRUE, PROCESS_CREATION_FLAGS, /* flags */ NULL, /* envp */ NULL, /* cwd */ &startup, /* startupinfo */ &pinfo /* pinfo */ ); #ifndef FIRE_AND_FORGET WaitForSingleObject(pinfo.hProcess, INFINITE); GetExitCodeProcess(pinfo.hProcess, &result); #endif CloseHandle(pinfo.hProcess); CloseHandle(pinfo.hThread); free(new_cmdline); return result; } #ifdef WINDOWS_GUI_SUBSYSTEM int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) #else int main() #endif { int result=0; MSG what; HWND me; #ifdef WINDOWS_GUI_SUBSYSTEM me = CreateWindow("MonsterStarter","MonsterStarter",0,0,0,1,1,0,0,0,0); PostMessage(NULL,WM_USER,0,0); GetMessage(&what,NULL,0,WM_USER); #endif result = (int)wideStarter(); if (cantDoWide) { result = (int)ansiStarter(); } return result; }