2002-08-19 21:24:44 +00:00
|
|
|
/*
|
2002-08-02 10:01:35 +00:00
|
|
|
Nullsoft "SuperPimp" Installation System - main.c - executable header main code
|
|
|
|
|
2003-02-09 15:56:29 +00:00
|
|
|
Copyright (C) 1999-2003 Nullsoft, Inc.
|
2002-08-19 21:24:44 +00:00
|
|
|
|
2002-08-02 10:01:35 +00:00
|
|
|
This software is provided 'as-is', without any express or implied
|
|
|
|
warranty. In no event will the authors be held liable for any damages
|
|
|
|
arising from the use of this software.
|
|
|
|
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
including commercial applications, and to alter it and redistribute it
|
|
|
|
freely, subject to the following restrictions:
|
|
|
|
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
|
|
claim that you wrote the original software. If you use this software
|
|
|
|
in a product, an acknowledgment in the product documentation would be
|
|
|
|
appreciated but is not required.
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
|
|
misrepresented as being the original software.
|
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
|
2002-08-19 21:24:44 +00:00
|
|
|
This source distribution includes portions of zlib. see zlib/zlib.h for
|
2002-08-02 10:01:35 +00:00
|
|
|
its license and so forth. Note that this license is also borrowed from zlib.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
#include <commctrl.h>
|
2003-09-04 18:25:57 +00:00
|
|
|
#include <shlobj.h>
|
2002-08-02 10:01:35 +00:00
|
|
|
#include "resource.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "fileform.h"
|
|
|
|
#include "state.h"
|
|
|
|
#include "ui.h"
|
|
|
|
#include "lang.h"
|
2003-03-18 20:36:52 +00:00
|
|
|
#include "state.h"
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
#if !defined(NSIS_CONFIG_VISIBLE_SUPPORT) && !defined(NSIS_CONFIG_SILENT_SUPPORT)
|
|
|
|
#error One of NSIS_CONFIG_SILENT_SUPPORT or NSIS_CONFIG_VISIBLE_SUPPORT must be defined.
|
|
|
|
#endif
|
|
|
|
#ifdef NSIS_COMPRESS_WHOLE
|
|
|
|
extern HANDLE dbd_hFile;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
char g_caption[NSIS_MAX_STRLEN*2];
|
|
|
|
int g_filehdrsize;
|
2003-09-10 16:39:06 +00:00
|
|
|
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
|
2002-08-02 10:01:35 +00:00
|
|
|
HWND g_hwnd;
|
2003-09-10 16:39:06 +00:00
|
|
|
HANDLE g_hInstance;
|
|
|
|
#endif
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow)
|
|
|
|
{
|
2003-03-29 17:16:09 +00:00
|
|
|
int ret;
|
|
|
|
const char *m_Err = 0;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-07-18 14:22:17 +00:00
|
|
|
int cl_flags = 0;
|
|
|
|
|
2002-08-02 10:01:35 +00:00
|
|
|
char *realcmds;
|
|
|
|
char seekchar=' ';
|
2003-06-17 23:59:13 +00:00
|
|
|
char *cmdline;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
InitCommonControls();
|
2002-11-30 13:15:49 +00:00
|
|
|
|
2003-09-04 18:25:57 +00:00
|
|
|
#if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT)
|
|
|
|
{
|
|
|
|
extern HRESULT g_hres;
|
|
|
|
g_hres=OleInitialize(NULL);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2003-06-23 22:40:11 +00:00
|
|
|
GetTempPath(sizeof(state_temp_dir), state_temp_dir);
|
2003-07-08 23:18:47 +00:00
|
|
|
validate_filename(state_temp_dir);
|
2003-07-18 14:22:17 +00:00
|
|
|
CreateDirectory(state_temp_dir, NULL);
|
2003-07-08 23:18:47 +00:00
|
|
|
|
2003-07-18 14:22:17 +00:00
|
|
|
// g_caption is used as a temp var here
|
|
|
|
if (!my_GetTempFileName(g_caption, state_temp_dir))
|
2003-07-08 23:18:47 +00:00
|
|
|
{
|
2003-09-05 10:40:31 +00:00
|
|
|
GetWindowsDirectory(state_temp_dir, sizeof(state_temp_dir));
|
|
|
|
lstrcat(state_temp_dir, "\\Temp");
|
2003-07-18 14:22:17 +00:00
|
|
|
validate_filename(state_temp_dir);
|
|
|
|
CreateDirectory(state_temp_dir, NULL);
|
|
|
|
if (!my_GetTempFileName(g_caption, state_temp_dir))
|
2003-07-08 23:18:47 +00:00
|
|
|
{
|
|
|
|
m_Err = _LANG_ERRORWRITINGTEMP;
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
2003-07-18 14:22:17 +00:00
|
|
|
DeleteFile(g_caption);
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-07-18 14:22:17 +00:00
|
|
|
mystrcpy(g_caption,_LANG_GENERIC_ERROR);
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-07-18 14:22:17 +00:00
|
|
|
lstrcpyn(state_command_line, GetCommandLine(), NSIS_MAX_STRLEN);
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-09-10 16:39:06 +00:00
|
|
|
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
|
2003-07-18 14:22:17 +00:00
|
|
|
g_hInstance = GetModuleHandle(NULL);
|
2003-09-10 16:39:06 +00:00
|
|
|
#endif//NSIS_CONFIG_VISIBLE_SUPPORT
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-17 23:59:13 +00:00
|
|
|
cmdline = state_command_line;
|
|
|
|
if (*cmdline == '\"') seekchar = *cmdline++;
|
|
|
|
|
|
|
|
while (*cmdline && *cmdline != seekchar) cmdline=CharNext(cmdline);
|
|
|
|
cmdline=CharNext(cmdline);
|
|
|
|
realcmds=cmdline;
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
// skip over any spaces
|
|
|
|
while (*cmdline == ' ') cmdline=CharNext(cmdline);
|
|
|
|
if (cmdline[0] != '/') break;
|
|
|
|
cmdline++;
|
|
|
|
|
|
|
|
#define END_OF_ARG(c) (((c)|' ')==' ')
|
|
|
|
|
|
|
|
#if defined(NSIS_CONFIG_VISIBLE_SUPPORT) && defined(NSIS_CONFIG_SILENT_SUPPORT)
|
2003-09-07 08:53:22 +00:00
|
|
|
if (cmdline[0] == 'S' && END_OF_ARG(cmdline[1]))
|
|
|
|
cl_flags |= FH_FLAGS_SILENT;
|
2003-06-17 23:59:13 +00:00
|
|
|
#endif//NSIS_CONFIG_SILENT_SUPPORT && NSIS_CONFIG_VISIBLE_SUPPORT
|
|
|
|
#ifdef NSIS_CONFIG_CRC_SUPPORT
|
2003-09-07 08:53:22 +00:00
|
|
|
if (*(DWORD*)cmdline == CHAR4_TO_DWORD('N','C','R','C') && END_OF_ARG(cmdline[4]))
|
|
|
|
cl_flags |= FH_FLAGS_NO_CRC;
|
2003-06-17 23:59:13 +00:00
|
|
|
#endif//NSIS_CONFIG_CRC_SUPPORT
|
|
|
|
|
|
|
|
if (*(WORD*)cmdline == CHAR2_TO_WORD('D','='))
|
|
|
|
{
|
|
|
|
cmdline[-2]=0; // keep this from being passed to uninstaller if necessary
|
|
|
|
mystrcpy(state_install_directory,cmdline+2);
|
|
|
|
cmdline=""; // prevent further processing of cmdline
|
|
|
|
break; // not necessary, but for some reason makes smaller exe :)
|
|
|
|
}
|
|
|
|
|
|
|
|
// skip over our parm
|
|
|
|
while (!END_OF_ARG(*cmdline)) cmdline=CharNext(cmdline);
|
|
|
|
}
|
|
|
|
|
2003-07-18 14:22:17 +00:00
|
|
|
m_Err = loadHeaders(cl_flags);
|
|
|
|
if (m_Err) goto end;
|
|
|
|
|
2002-08-02 10:01:35 +00:00
|
|
|
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
|
|
|
|
if (g_is_uninstaller)
|
|
|
|
{
|
2002-09-13 18:00:11 +00:00
|
|
|
char *p=cmdline;
|
2002-09-22 19:05:43 +00:00
|
|
|
while (*p) p++;
|
2002-09-13 18:00:11 +00:00
|
|
|
|
2003-09-07 08:53:22 +00:00
|
|
|
while (p >= cmdline && (p[0] != '_' || p[1] != '?' || p[2] != '=')) p--;
|
2003-09-04 18:25:57 +00:00
|
|
|
|
2003-09-10 16:39:06 +00:00
|
|
|
m_Err = _LANG_UNINSTINITERROR;
|
|
|
|
|
2002-09-13 18:00:11 +00:00
|
|
|
if (p >= cmdline)
|
2002-08-02 10:01:35 +00:00
|
|
|
{
|
2003-01-08 20:06:22 +00:00
|
|
|
*(p-1)=0; // terminate before the " _?="
|
2002-09-13 18:00:11 +00:00
|
|
|
p+=3; // skip over _?=
|
|
|
|
if (is_valid_instpath(p))
|
2002-08-02 10:01:35 +00:00
|
|
|
{
|
2003-07-18 14:22:17 +00:00
|
|
|
mystrcpy(state_install_directory, p);
|
|
|
|
mystrcpy(state_output_directory, p);
|
2003-09-10 16:39:06 +00:00
|
|
|
m_Err = 0;
|
2002-08-02 10:01:35 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-09-10 16:39:06 +00:00
|
|
|
int x;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
for (x = 0; x < 26; x ++)
|
|
|
|
{
|
2003-09-10 16:39:06 +00:00
|
|
|
// File name need slash before because temp dir was changed by validate_filename
|
2003-07-08 23:18:47 +00:00
|
|
|
static char s[]="\\A~NSISu_.exe";
|
2003-07-19 12:29:36 +00:00
|
|
|
static char buf2[NSIS_MAX_STRLEN*2];
|
2002-08-02 10:01:35 +00:00
|
|
|
static char ibuf[NSIS_MAX_STRLEN];
|
2002-08-19 21:24:44 +00:00
|
|
|
|
2003-07-19 12:29:36 +00:00
|
|
|
buf2[0]='\"';
|
2003-06-23 22:40:11 +00:00
|
|
|
mystrcpy(buf2+1,state_temp_dir);
|
2002-08-02 10:01:35 +00:00
|
|
|
lstrcat(buf2,s);
|
|
|
|
|
|
|
|
DeleteFile(buf2+1); // clean up after all the other ones if they are there
|
2002-08-19 21:24:44 +00:00
|
|
|
|
2003-09-10 16:39:06 +00:00
|
|
|
if (m_Err) // not done yet
|
2002-08-02 10:01:35 +00:00
|
|
|
{
|
|
|
|
// get current name
|
|
|
|
int l=GetModuleFileName(g_hInstance,ibuf,sizeof(ibuf));
|
|
|
|
// check if it is ?~NSISu_.exe - if so, fuck it
|
|
|
|
if (!lstrcmpi(ibuf+l-(sizeof(s)-2),s+1)) break;
|
|
|
|
|
|
|
|
// copy file
|
|
|
|
if (CopyFile(ibuf,buf2+1,FALSE))
|
|
|
|
{
|
|
|
|
HANDLE hProc;
|
|
|
|
#ifdef NSIS_SUPPORT_MOVEONREBOOT
|
|
|
|
MoveFileOnReboot(buf2+1,NULL);
|
|
|
|
#endif
|
2002-08-19 21:24:44 +00:00
|
|
|
if (state_install_directory[0]) mystrcpy(ibuf,state_install_directory);
|
2002-08-02 10:01:35 +00:00
|
|
|
else trimslashtoend(ibuf);
|
|
|
|
lstrcat(buf2,"\" ");
|
|
|
|
lstrcat(buf2,realcmds);
|
2002-09-13 18:00:11 +00:00
|
|
|
lstrcat(buf2," _?=");
|
2002-08-02 10:01:35 +00:00
|
|
|
lstrcat(buf2,ibuf);
|
2003-09-10 16:39:06 +00:00
|
|
|
// add a trailing backslash to make sure is_valid_instpath will not fail when it shouldn't
|
|
|
|
lstrcat(buf2,"\\");
|
2003-06-23 22:40:11 +00:00
|
|
|
hProc=myCreateProcess(buf2,state_temp_dir);
|
2003-09-10 16:39:06 +00:00
|
|
|
if (hProc)
|
|
|
|
{
|
|
|
|
CloseHandle(hProc);
|
|
|
|
// success
|
|
|
|
m_Err = 0;
|
|
|
|
}
|
2002-08-02 10:01:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
s[0]++;
|
|
|
|
}
|
2002-08-19 21:24:44 +00:00
|
|
|
goto end;
|
2002-08-02 10:01:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif//NSIS_CONFIG_UNINSTALL_SUPPORT
|
|
|
|
|
2003-07-18 14:22:17 +00:00
|
|
|
ret = ui_doinstall();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
#ifdef NSIS_CONFIG_LOG
|
|
|
|
log_write(1);
|
|
|
|
#endif//NSIS_CONFIG_LOG
|
|
|
|
end:
|
2003-09-04 18:25:57 +00:00
|
|
|
|
|
|
|
#if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT)
|
|
|
|
OleUninitialize();
|
|
|
|
#endif
|
|
|
|
|
2003-07-18 14:22:17 +00:00
|
|
|
if (g_db_hFile != INVALID_HANDLE_VALUE) CloseHandle(g_db_hFile);
|
2002-08-02 10:01:35 +00:00
|
|
|
#ifdef NSIS_COMPRESS_WHOLE
|
2003-07-18 14:22:17 +00:00
|
|
|
if (dbd_hFile != INVALID_HANDLE_VALUE) CloseHandle(dbd_hFile);
|
2002-08-02 10:01:35 +00:00
|
|
|
#endif
|
2003-07-18 14:22:17 +00:00
|
|
|
if (m_Err) my_MessageBox(m_Err, MB_OK | MB_ICONSTOP);
|
2002-08-05 02:05:00 +00:00
|
|
|
|
|
|
|
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
|
2002-08-08 15:04:45 +00:00
|
|
|
// Clean up after plug-ins
|
2003-07-18 14:22:17 +00:00
|
|
|
if (state_plugins_dir[0]) doRMDir(state_plugins_dir, 1);
|
2002-08-05 02:05:00 +00:00
|
|
|
#endif // NSIS_CONFIG_PLUGIN_SUPPORT
|
2002-09-25 03:06:36 +00:00
|
|
|
if (g_hIcon) DeleteObject(g_hIcon);
|
2002-08-05 02:05:00 +00:00
|
|
|
|
2002-08-02 10:01:35 +00:00
|
|
|
ExitProcess(ret);
|
|
|
|
}
|