diff -r 509e4801c378 -r 22878952f6e2 srcanamdw/codescanner/pyinstaller/source/windows/winmain.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srcanamdw/codescanner/pyinstaller/source/windows/winmain.c Thu Feb 18 12:29:02 2010 +0530 @@ -0,0 +1,155 @@ +/* + * Bootloader for a packed executable. + * Copyright (C) 2005, Giovanni Bajo + * Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * In addition to the permissions in the GNU General Public License, the + * authors give you unlimited permission to link or embed the compiled + * version of this file into combinations with other programs, and to + * distribute those combinations without any restriction coming from the + * use of this file. (The General Public License restrictions do apply in + * other respects; for example, they cover modification of the file, and + * distribution when not linked into a combine executable.) + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +#include "launch.h" +#include +#include // InitCommonControls +#include + +int relaunch(char *thisfile, char *workpath) +{ + char envvar[_MAX_PATH + 12]; + SECURITY_ATTRIBUTES sa; + STARTUPINFO si; + PROCESS_INFORMATION pi; + int rc = 0; + + // the parent process should ignore all signals it can + signal(SIGABRT, SIG_IGN); + signal(SIGINT, SIG_IGN); + signal(SIGTERM, SIG_IGN); + signal(SIGBREAK, SIG_IGN); + + VS("Setting up to run child\n"); + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + GetStartupInfo(&si); + si.lpReserved = NULL; + si.lpDesktop = NULL; + si.lpTitle = NULL; + si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + si.wShowWindow = SW_NORMAL; + si.hStdInput = (void*)_get_osfhandle(fileno(stdin)); + si.hStdOutput = (void*)_get_osfhandle(fileno(stdout)); + si.hStdError = (void*)_get_osfhandle(fileno(stderr)); + /* tell pass 2 where we extracted to */ + VS("Setting magic environment var\n"); + strcpy(envvar, "_MEIPASS2="); + strcat(envvar, workpath); + _putenv(envvar); + VS("Creating child process\n"); + if (CreateProcess( + thisfile, // pointer to name of executable module + GetCommandLine(), // pointer to command line string + &sa, // pointer to process security attributes + NULL, // pointer to thread security attributes + TRUE, // handle inheritance flag + 0, // creation flags + NULL, // pointer to new environment block + NULL, // pointer to current directory name + &si, // pointer to STARTUPINFO + &pi // pointer to PROCESS_INFORMATION + )) { + VS("Waiting for child process to finish...\n"); + WaitForSingleObject(pi.hProcess, INFINITE); + GetExitCodeProcess(pi.hProcess, (unsigned long *)&rc); + } + else { + FATALERROR("Error creating child process!\n"); + rc = -1; + } + return rc; +} + + +#ifdef _CONSOLE +int main(int argc, char* argv[]) +#else +int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPSTR lpCmdLine, int nCmdShow ) +#endif +{ + char here[_MAX_PATH + 1]; + char thisfile[_MAX_PATH + 1]; + int rc = 0; + char *workpath = NULL; + char *p; + int len; +#ifndef _CONSOLE + int argc = __argc; + char **argv = __argv; +#endif + + // Initialize common controls (needed to link with commctrl32.dll and + // obtain native XP look & feel). + InitCommonControls(); + + // fill in thisfile + if (!GetModuleFileNameA(NULL, thisfile, _MAX_PATH)) { + FATALERROR("System error - unable to load!"); + return -1; + } + p = thisfile+strlen(thisfile) - 4; + if (strnicmp(p, ".exe", 4) != 0) + strcat(thisfile, ".exe"); + + // fill in here (directory of thisfile) + //GetModuleFileName returns an absolute path + strcpy(here, thisfile); + for (p=here+strlen(here); *p != '\\' && p >= here+2; --p); + *++p = '\0'; + len = p - here; + + workpath = getenv( "_MEIPASS2" ); + rc = init(here, &thisfile[len], workpath); + if (rc) + return rc; + if (workpath) { + // we're the "child" process + rc = doIt(argc, argv); + finalizePython(); + } + else { + if (extractBinaries(&workpath)) { + VS("Error extracting binaries"); + return -1; + } + // if workpath got set to non-NULL, we've extracted stuff + if (workpath) { + // run the "child" process, then clean up + rc = relaunch(thisfile, workpath); + } + else { + // no "child" process necessary + rc = doIt(argc, argv); + finalizePython(); + } + cleanUp(); + } + return rc; +}