- Compressor type listed in summary

- SetOutPath now sets the current directory (RegDLL no longer does)
- File names are now validated for commands that need normal files, the directory selection dialog, and every variable that contains a file/dir name
- Fixed a distortion of the MUI's branding text with ClearType
- $INSTDIR is now right in the custom page after the directory selection dialog
- No more squares in the automatically appended directory name in the directory selection dialog
- Size optimizations


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2121 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-02-07 23:04:25 +00:00
parent 91906c55e3
commit ae16cbfe3f
14 changed files with 248 additions and 199 deletions

View file

@ -515,8 +515,6 @@ int CEXEBuild::datablock_optimize(int start_offset)
int CEXEBuild::add_data(const char *data, int length, IGrowBuf *dblock) // returns offset int CEXEBuild::add_data(const char *data, int length, IGrowBuf *dblock) // returns offset
{ {
// Changed by Amir Szekely 31st July 2002
// Ability to change compression methods from within the script
build_compressor_set=true; build_compressor_set=true;
int done=0; int done=0;
@ -1777,8 +1775,9 @@ int CEXEBuild::write_output(void)
INFO_MSG("Datablock optimizer saved %d bytes (~%d.%d%%).\n",db_opt_save, INFO_MSG("Datablock optimizer saved %d bytes (~%d.%d%%).\n",db_opt_save,
pc/10,pc%10); pc/10,pc%10);
} }
INFO_MSG("\nUsing %s%s compression.\n\n", compressor->GetName(), build_compress_whole?" (compress whole)":"");
INFO_MSG("\n");
int total_usize=exeheader_size; int total_usize=exeheader_size;
INFO_MSG("EXE header size: %10d / %d bytes\n",exeheader_size_new,exeheader_size); INFO_MSG("EXE header size: %10d / %d bytes\n",exeheader_size_new,exeheader_size);
@ -1917,8 +1916,6 @@ int CEXEBuild::write_output(void)
#ifdef NSIS_CONFIG_COMPRESSION_SUPPORT #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT
int CEXEBuild::deflateToFile(FILE *fp, char *buf, int len) // len==0 to flush int CEXEBuild::deflateToFile(FILE *fp, char *buf, int len) // len==0 to flush
{ {
// Changed by Amir Szekely 31st July 2002
// Ability to change compression methods from within the script
build_compressor_set=true; build_compressor_set=true;
char obuf[32768]; char obuf[32768];
@ -2073,7 +2070,7 @@ int CEXEBuild::uninstall_generate()
firstheader *_fh=(firstheader *)udata.get(); firstheader *_fh=(firstheader *)udata.get();
_fh->length_of_all_following_data=udata.getlen()+(build_crcchk?sizeof(int):0); _fh->length_of_all_following_data=udata.getlen()+(build_crcchk?sizeof(int):0);
} }
else else
#endif//NSIS_CONFIG_COMPRESSION_SUPPORT #endif//NSIS_CONFIG_COMPRESSION_SUPPORT
{ {
udata.add(&fh,sizeof(fh)); udata.add(&fh,sizeof(fh));

View file

@ -49,7 +49,7 @@ enum {
}; };
class CEXEBuild { class CEXEBuild {
public: public:
CEXEBuild(); CEXEBuild();
~CEXEBuild(); ~CEXEBuild();

View file

@ -44,6 +44,10 @@ class CBzip2 : public ICompressor {
return stream->avail_out; return stream->avail_out;
} }
char* GetName() {
return "bzip2";
}
private: private:
bz_stream *stream; bz_stream *stream;
}; };

View file

@ -17,6 +17,8 @@ class ICompressor {
virtual unsigned int GetAvailIn() = 0; virtual unsigned int GetAvailIn() = 0;
virtual unsigned int GetAvailOut() = 0; virtual unsigned int GetAvailOut() = 0;
virtual char* GetName() = 0;
}; };
#endif #endif

View file

@ -44,6 +44,10 @@ class CZlib : public ICompressor {
return stream->avail_out; return stream->avail_out;
} }
char* GetName() {
return "zlib";
}
private: private:
z_stream *stream; z_stream *stream;
}; };

View file

@ -51,7 +51,7 @@ int g_quit_flag; // set when Quit has been called (meaning bail out ASAP)
#error invalid value for NSIS_MAX_INST_TYPES #error invalid value for NSIS_MAX_INST_TYPES
#endif #endif
int g_autoclose; //int g_autoclose;
int progress_bar_pos, progress_bar_len; int progress_bar_pos, progress_bar_len;
int g_is_uninstaller; int g_is_uninstaller;
@ -70,6 +70,9 @@ static int num_sections;
// sent to the outer window to tell it to go to the next inner window // sent to the outer window to tell it to go to the next inner window
#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) #define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
// sent to every child window to tell it it is closing soon
#define WM_NOTIFY_INIGO_MONTOYA (WM_USER+0xb)
// update message used by DirProc and SelProc for space display // update message used by DirProc and SelProc for space display
#define WM_IN_UPDATEMSG (WM_USER+0xf) #define WM_IN_UPDATEMSG (WM_USER+0xf)
@ -129,8 +132,9 @@ static BOOL NSISCALL _HandleStaticBkColor(UINT uMsg, WPARAM wParam, LPARAM lPara
if (uMsg == WM_CTLCOLORSTATIC) { if (uMsg == WM_CTLCOLORSTATIC) {
BOOL brush = (BOOL)GetWindowLong((HWND)lParam, GWL_USERDATA); BOOL brush = (BOOL)GetWindowLong((HWND)lParam, GWL_USERDATA);
if (brush == -1) { if (brush == -1) {
SetBkColor((HDC)wParam, GetSysColor(COLOR_BTNFACE)); COLORREF dlgColor = GetSysColor(COLOR_BTNFACE);
SetTextColor((HDC)wParam, GetSysColor(COLOR_BTNFACE)); SetBkColor((HDC)wParam, dlgColor);
SetTextColor((HDC)wParam, dlgColor);
return (BOOL)GetStockObject(NULL_BRUSH); return (BOOL)GetStockObject(NULL_BRUSH);
} }
SetBkMode((HDC)wParam, TRANSPARENT); SetBkMode((HDC)wParam, TRANSPARENT);
@ -290,7 +294,7 @@ lang_again:
int NSISCALL ui_doinstall(void) int NSISCALL ui_doinstall(void)
{ {
num_sections=g_inst_header->num_sections; num_sections=g_inst_header->num_sections;
g_autoclose=g_inst_cmnheader->misc_flags&1; g_flags.autoclose=g_inst_cmnheader->misc_flags&1;
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (!g_is_uninstaller) if (!g_is_uninstaller)
#endif #endif
@ -549,6 +553,8 @@ nextPage:
process_string_fromtab(g_tmp+mystrlen(g_tmp),this_page->caption); process_string_fromtab(g_tmp+mystrlen(g_tmp),this_page->caption);
my_SetWindowText(hwndDlg,g_tmp); my_SetWindowText(hwndDlg,g_tmp);
SendMessage(m_curwnd, WM_NOTIFY_INIGO_MONTOYA, 0, 0);
#ifdef NSIS_SUPPORT_CODECALLBACKS #ifdef NSIS_SUPPORT_CODECALLBACKS
if (ExecuteCodeSegment(this_page->prefunc,NULL) || this_page->id<0) if (ExecuteCodeSegment(this_page->prefunc,NULL) || this_page->id<0)
goto nextPage; goto nextPage;
@ -556,7 +562,7 @@ nextPage:
if (this_page->id!=NSIS_PAGE_COMPLETED) DestroyWindow(m_curwnd); if (this_page->id!=NSIS_PAGE_COMPLETED) DestroyWindow(m_curwnd);
else { else {
if (g_autoclose) goto nextPage; if (g_flags.autoclose) goto nextPage;
return 0; return 0;
} }
@ -708,9 +714,6 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
#undef enlink #undef enlink
#undef msgfilter #undef msgfilter
} }
if (uMsg == WM_CLOSE) {
SendMessage(g_hwnd,WM_CLOSE,0,0);
}
return HandleStaticBkColor(); return HandleStaticBkColor();
} }
#endif #endif
@ -743,9 +746,10 @@ static char * NSISCALL inttosizestr(int kb, char *str)
static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
if (uMsg == WM_DESTROY) if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
{ {
GetUIText(IDC_DIR,state_install_directory,NSIS_MAX_STRLEN); GetUIText(IDC_DIR,state_install_directory,NSIS_MAX_STRLEN);
validate_filename(state_install_directory);
#ifdef NSIS_CONFIG_LOG #ifdef NSIS_CONFIG_LOG
build_g_logfile(); build_g_logfile();
log_dolog = IsDlgButtonChecked(hwndDlg,IDC_CHECK1); log_dolog = IsDlgButtonChecked(hwndDlg,IDC_CHECK1);
@ -808,7 +812,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
p=scanendslash(post_str); p=scanendslash(post_str);
if (p >= post_str && *++p) if (p >= post_str && *++p)
{ {
post_str=process_string(ps_tmpbuf,p); post_str=process_string(p);
p=name+mystrlen(name)-mystrlen(post_str); p=name+mystrlen(name)-mystrlen(post_str);
if (p <= name || *CharPrev(name,p)!='\\' || lstrcmpi(p,post_str)) if (p <= name || *CharPrev(name,p)!='\\' || lstrcmpi(p,post_str))
{ {
@ -1010,7 +1014,8 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
tv.hInsertAfter=TVI_LAST; tv.hInsertAfter=TVI_LAST;
tv.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_STATE; tv.item.mask=TVIF_PARAM|TVIF_TEXT|TVIF_STATE;
tv.item.lParam=x; tv.item.lParam=x;
tv.item.pszText=process_string_fromtab(ps_tmpbuf,sec->name_ptr); process_string_fromtab(0,sec->name_ptr);
tv.item.pszText=ps_tmpbuf;
tv.item.stateMask=TVIS_STATEIMAGEMASK|TVIS_EXPANDED; tv.item.stateMask=TVIS_STATEIMAGEMASK|TVIS_EXPANDED;
{ {
@ -1072,7 +1077,8 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
TVITEM tv; TVITEM tv;
tv.hItem=hTreeItems[x]; tv.hItem=hTreeItems[x];
tv.mask=TVIF_TEXT; tv.mask=TVIF_TEXT;
tv.pszText=process_string_fromtab(ps_tmpbuf,ns); process_string_fromtab(0,ns);
tv.pszText=ps_tmpbuf;
TreeView_SetItem(hwndTree1,&tv); TreeView_SetItem(hwndTree1,&tv);
} }
uMsg = WM_USER+0x18; uMsg = WM_USER+0x18;
@ -1184,7 +1190,7 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
} }
} }
} }
if (uMsg == WM_DESTROY) if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
{ {
if (hImageList) ImageList_Destroy(hImageList); if (hImageList) ImageList_Destroy(hImageList);
if (hTreeItems) GlobalFree(hTreeItems); if (hTreeItems) GlobalFree(hTreeItems);

View file

@ -24,10 +24,7 @@ typedef struct _stack_t {
static stack_t *g_st; static stack_t *g_st;
#endif #endif
static int exec_errorflag; union flags g_flags;
#ifdef NSIS_SUPPORT_REBOOT
static int exec_rebootflag;
#endif
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT #ifdef NSIS_CONFIG_PLUGIN_SUPPORT
char plugins_temp_dir[NSIS_MAX_STRLEN]=""; char plugins_temp_dir[NSIS_MAX_STRLEN]="";
@ -76,8 +73,6 @@ static LONG NSISCALL myRegDeleteKeyEx(HKEY thiskey, LPCTSTR lpSubKey, int onlyif
} }
#endif//NSIS_SUPPORT_REGISTRYFUNCTIONS #endif//NSIS_SUPPORT_REGISTRYFUNCTIONS
extern char g_all_user_var_flag;
static int NSISCALL ExecuteEntry(entry *entry_); static int NSISCALL ExecuteEntry(entry *entry_);
static int NSISCALL resolveaddr(int v) static int NSISCALL resolveaddr(int v)
@ -121,14 +116,18 @@ static int *parms;
static int NSISCALL process_string_fromparm_toint(int id_) static int NSISCALL process_string_fromparm_toint(int id_)
{ {
return myatoi(process_string(ps_tmpbuf,GetStringFromStringTab(parms[id_]))); return myatoi(process_string(GetStringFromStringTab(parms[id_])));
} }
// NB - USE CAUTION when rearranging code to make use of the new return value of // NB - USE CAUTION when rearranging code to make use of the new return value of
// this function - be sure the parm being accessed is not modified before the call. // this function - be sure the parm being accessed is not modified before the call.
// Use a negative number to get the string validated as a file name
static char * NSISCALL process_string_fromparm_tobuf(int id_) static char * NSISCALL process_string_fromparm_tobuf(int id_)
{ {
return process_string_fromtab(bufs[id_ >> 4], parms[id_ & 0xF]); int id = id_ < 0 ? -id_ : id_;
char *result = process_string_fromtab(bufs[id_ >> 4], parms[id_ & 0xF]);
if (id_ < 0) validate_filename(result);
return result;
} }
// returns EXEC_ERROR on error // returns EXEC_ERROR on error
@ -201,9 +200,6 @@ static int NSISCALL ExecuteEntry(entry *entry_)
Sleep(x); Sleep(x);
} }
return 0; return 0;
case EW_SETSFCONTEXT:
g_all_user_var_flag=parm0;
return 0;
case EW_HIDEWINDOW: case EW_HIDEWINDOW:
log_printf("HideWindow"); log_printf("HideWindow");
ShowWindow(g_hwnd,SW_HIDE); ShowWindow(g_hwnd,SW_HIDE);
@ -213,30 +209,31 @@ static int NSISCALL ExecuteEntry(entry *entry_)
ShowWindow(g_hwnd,SW_SHOW); ShowWindow(g_hwnd,SW_SHOW);
SetForegroundWindow(g_hwnd); SetForegroundWindow(g_hwnd);
return 0; return 0;
case EW_SETWINDOWCLOSE: case EW_SETFLAG:
g_autoclose=parm0; g_flags.flags[parm0]=parm1;
return 0; return 0;
case EW_CHDETAILSVIEW: case EW_CHDETAILSVIEW:
if (insthwndbutton) ShowWindow(insthwndbutton,parm1); if (insthwndbutton) ShowWindow(insthwndbutton,parm1);
if (insthwnd) ShowWindow(insthwnd,parm0); if (insthwnd) ShowWindow(insthwnd,parm0);
return 0; return 0;
case EW_SETFILEATTRIBUTES: { case EW_SETFILEATTRIBUTES: {
char *buf0=process_string_fromparm_tobuf(0x00); char *buf1=process_string_fromparm_tobuf(-0x10);
log_printf3("SetFileAttributes: \"%s\":%08X",buf0,parm1); log_printf3("SetFileAttributes: \"%s\":%08X",buf1,parm1);
if (!SetFileAttributes(buf0,parm1)) if (!SetFileAttributes(buf1,parm1))
{ {
exec_errorflag++; g_flags.exec_error++;
log_printf("SetFileAttributes failed."); log_printf("SetFileAttributes failed.");
} }
} }
return 0; return 0;
case EW_CREATEDIR: { case EW_CREATEDIR: {
char *buf1=process_string_fromparm_tobuf(0x10); char *buf1=process_string_fromparm_tobuf(-0x10);
log_printf3("CreateDirectory: \"%s\" (%d)",buf1,parm1); log_printf3("CreateDirectory: \"%s\" (%d)",buf1,parm1);
if (parm1) if (parm1)
{ {
update_status_text_from_lang(LANG_OUTPUTDIR,buf1); update_status_text_from_lang(LANG_OUTPUTDIR,buf1);
mystrcpy(state_output_directory,buf1); mystrcpy(state_output_directory,buf1);
SetCurrentDirectory(state_output_directory);
} }
else update_status_text_from_lang(LANG_CREATEDIR,buf1); else update_status_text_from_lang(LANG_CREATEDIR,buf1);
{ {
@ -273,7 +270,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
} }
return 0; return 0;
case EW_IFFILEEXISTS: { case EW_IFFILEEXISTS:
{
char *buf0=process_string_fromparm_tobuf(0x00); char *buf0=process_string_fromparm_tobuf(0x00);
if (file_exists(buf0)) if (file_exists(buf0))
{ {
@ -284,47 +282,40 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
return parm2; return parm2;
case EW_IFERRORS: case EW_IFERRORS:
{ if (g_flags.exec_error) return parm0;
int f=exec_errorflag;
exec_errorflag=parm2;
if (f)
{
return parm0;
}
}
return parm1; return parm1;
#ifdef NSIS_SUPPORT_RENAME #ifdef NSIS_SUPPORT_RENAME
case EW_RENAME: case EW_RENAME:
{ {
char *buf0=process_string_fromparm_tobuf(0x00); char *buf1=process_string_fromparm_tobuf(-0x10);
char *buf1=process_string_fromparm_tobuf(0x11); char *buf2=process_string_fromparm_tobuf(-0x21);
mystrcpy(buf3,buf0); mystrcpy(buf3,buf1);
if (mystrlen(buf0)+mystrlen(buf1) < NSIS_MAX_STRLEN-3) if (mystrlen(buf1)+mystrlen(buf2) < NSIS_MAX_STRLEN-3)
{ {
lstrcat(buf3,"->"); lstrcat(buf3,"->");
lstrcat(buf3,buf1); lstrcat(buf3,buf2);
} }
log_printf2("Rename: %s",buf3); log_printf2("Rename: %s",buf3);
if (MoveFile(buf0,buf1)) if (MoveFile(buf1,buf2))
{ {
update_status_text_from_lang(LANG_RENAME,buf3); update_status_text_from_lang(LANG_RENAME,buf3);
} }
else else
{ {
#ifdef NSIS_SUPPORT_MOVEONREBOOT #ifdef NSIS_SUPPORT_MOVEONREBOOT
if (parm2 && file_exists(buf0)) if (parm2 && file_exists(buf1))
{ {
#ifdef NSIS_SUPPORT_REBOOT #ifdef NSIS_SUPPORT_REBOOT
exec_rebootflag++; g_flags.exec_reboot++;
#endif #endif
MoveFileOnReboot(buf0,buf1); MoveFileOnReboot(buf1,buf2);
update_status_text_from_lang(LANG_RENAMEONREBOOT,buf3); update_status_text_from_lang(LANG_RENAMEONREBOOT,buf3);
log_printf2("Rename on reboot: %s",buf3); log_printf2("Rename on reboot: %s",buf3);
} }
else else
#endif #endif
{ {
exec_errorflag++; g_flags.exec_error++;
log_printf2("Rename failed: %s",buf3); log_printf2("Rename failed: %s",buf3);
} }
} }
@ -339,7 +330,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
char *buf0=process_string_fromparm_tobuf(0x01); char *buf0=process_string_fromparm_tobuf(0x01);
if (!GetFullPathName(buf0,NSIS_MAX_STRLEN,p,&fp)) if (!GetFullPathName(buf0,NSIS_MAX_STRLEN,p,&fp))
{ {
exec_errorflag++; g_flags.exec_error++;
*p=0; *p=0;
} }
else if (fp>buf0 && *fp) else if (fp>buf0 && *fp)
@ -351,7 +342,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
else else
{ {
exec_errorflag++; g_flags.exec_error++;
*p=0; *p=0;
} }
} }
@ -362,10 +353,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
char *fp; char *fp;
char *p=var0; char *p=var0;
char *buf0=process_string_fromparm_tobuf(0x01); char *buf0=process_string_fromparm_tobuf(-0x01);
if (!SearchPath(NULL,buf0,NULL,NSIS_MAX_STRLEN,p,&fp)) if (!SearchPath(NULL,buf0,NULL,NSIS_MAX_STRLEN,p,&fp))
{ {
exec_errorflag++; g_flags.exec_error++;
p[0]=0; p[0]=0;
} }
} }
@ -375,7 +366,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
char *textout=var0; char *textout=var0;
if (!GetTempFileName(temp_directory,"nst",0,textout)) if (!GetTempFileName(temp_directory,"nst",0,textout))
{ {
exec_errorflag++; g_flags.exec_error++;
*textout=0; *textout=0;
} }
} }
@ -395,6 +386,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
mystrcpy(buf0,buf3); mystrcpy(buf0,buf3);
} }
else lstrcat(addtrailingslash(mystrcpy(buf0,state_output_directory)),buf3); else lstrcat(addtrailingslash(mystrcpy(buf0,state_output_directory)),buf3);
validate_filename(buf0);
_tryagain: _tryagain:
if (!overwriteflag) if (!overwriteflag)
{ {
@ -417,7 +409,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (overwriteflag) if (overwriteflag)
{ {
update_status_text_from_lang(LANG_SKIPPED,buf3); update_status_text_from_lang(LANG_SKIPPED,buf3);
if (overwriteflag==2) exec_errorflag++; if (overwriteflag==2) g_flags.exec_error++;
log_printf3("File: skipped: \"%s\" (overwriteflag=%d)",buf0,overwriteflag); log_printf3("File: skipped: \"%s\" (overwriteflag=%d)",buf0,overwriteflag);
return 0; return 0;
} }
@ -435,7 +427,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
goto _tryagain; goto _tryagain;
case IDIGNORE: case IDIGNORE:
log_printf("File: error, user cancel"); log_printf("File: error, user cancel");
exec_errorflag++; g_flags.exec_error++;
return 0; return 0;
default: default:
log_printf("File: error, user abort"); log_printf("File: error, user abort");
@ -503,7 +495,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (parm1) if (parm1)
{ {
#ifdef NSIS_SUPPORT_REBOOT #ifdef NSIS_SUPPORT_REBOOT
exec_rebootflag++; g_flags.exec_reboot++;
#endif #endif
log_printf2("Delete: DeleteFile on Reboot(\"%s\")",buf1); log_printf2("Delete: DeleteFile on Reboot(\"%s\")",buf1);
update_status_text_from_lang(LANG_DELETEONREBOOT,buf1); update_status_text_from_lang(LANG_DELETEONREBOOT,buf1);
@ -512,7 +504,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
else else
#endif #endif
{ {
exec_errorflag++; g_flags.exec_error++;
} }
} }
} }
@ -540,7 +532,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
return parm4; return parm4;
} }
} }
else exec_errorflag++; else g_flags.exec_error++;
} }
return 0; return 0;
#endif//NSIS_SUPPORT_MESSAGEBOX #endif//NSIS_SUPPORT_MESSAGEBOX
@ -553,7 +545,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (lastchar(buf0)=='\\') trimslashtoend(buf0); if (lastchar(buf0)=='\\') trimslashtoend(buf0);
doRMDir(buf0,parm1); doRMDir(buf0,parm1);
if (file_exists(buf0)) exec_errorflag++; if (file_exists(buf0)) g_flags.exec_error++;
} }
return 0; return 0;
#endif//NSIS_SUPPORT_RMDIR #endif//NSIS_SUPPORT_RMDIR
@ -606,7 +598,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
if (!GetEnvironmentVariable(buf0,p,NSIS_MAX_STRLEN)) if (!GetEnvironmentVariable(buf0,p,NSIS_MAX_STRLEN))
{ {
exec_errorflag++; g_flags.exec_error++;
*p=0; *p=0;
} }
} }
@ -648,7 +640,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case 0: v+=v2; break; case 0: v+=v2; break;
case 1: v-=v2; break; case 1: v-=v2; break;
case 2: v*=v2; break; case 2: v*=v2; break;
case 3: if (v2) v/=v2; else { v=0; exec_errorflag++; } break; case 3: if (v2) v/=v2; else { v=0; g_flags.exec_error++; } break;
case 4: v|=v2; break; case 4: v|=v2; break;
case 5: v&=v2; break; case 5: v&=v2; break;
case 6: v^=v2; break; case 6: v^=v2; break;
@ -656,7 +648,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case 8: v=!v; break; case 8: v=!v; break;
case 9: v=v||v2; break; case 9: v=v||v2; break;
case 10: v=v&&v2; break; case 10: v=v&&v2; break;
case 11: if (v2) v%=v2; else { v=0; exec_errorflag++; } break; case 11: if (v2) v%=v2; else { v=0; g_flags.exec_error++; } break;
} }
myitoa(p,v); myitoa(p,v);
} }
@ -691,7 +683,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (!s) if (!s)
{ {
log_printf("Pop: stack empty"); log_printf("Pop: stack empty");
exec_errorflag++; g_flags.exec_error++;
return 0; return 0;
} }
mystrcpy(var0,s->text); mystrcpy(var0,s->text);
@ -729,7 +721,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
b4=(int)process_string_fromparm_tobuf(0x14); b4=(int)process_string_fromparm_tobuf(0x14);
} }
if (parm5>>2) exec_errorflag += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(LPDWORD)&v); if (parm5>>2) g_flags.exec_error += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(LPDWORD)&v);
else v=SendMessage(hwnd,msg,b3,b4); else v=SendMessage(hwnd,msg,b3,b4);
} }
else else
@ -818,7 +810,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
int x; int x;
char *buf0=process_string_fromparm_tobuf(0x00); char *buf0=process_string_fromparm_tobuf(0x00);
char *buf1=process_string_fromparm_tobuf(0x11); char *buf1=process_string_fromparm_tobuf(-0x11);
char *buf2=process_string_fromparm_tobuf(0x22); char *buf2=process_string_fromparm_tobuf(0x22);
wsprintf(buf3,"%s %s",buf0,buf1); wsprintf(buf3,"%s %s",buf0,buf1);
update_status_text_from_lang(LANG_EXECSHELL, buf3); update_status_text_from_lang(LANG_EXECSHELL, buf3);
@ -826,7 +818,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (x < 33) if (x < 33)
{ {
log_printf5("ExecShell: warning: error (\"%s\": file:\"%s\" params:\"%s\")=%d",buf0,buf1,buf2,x); log_printf5("ExecShell: warning: error (\"%s\": file:\"%s\" params:\"%s\")=%d",buf0,buf1,buf2,x);
exec_errorflag++; g_flags.exec_error++;
} }
else else
{ {
@ -860,13 +852,13 @@ static int NSISCALL ExecuteEntry(entry *entry_)
GetExitCodeProcess(hProc, &lExitCode); GetExitCodeProcess(hProc, &lExitCode);
if (parm2>=0) myitoa(var2,lExitCode); if (parm2>=0) myitoa(var2,lExitCode);
else if (lExitCode) exec_errorflag++; else if (lExitCode) g_flags.exec_error++;
} }
CloseHandle( hProc ); CloseHandle( hProc );
} }
else else
{ {
exec_errorflag++; g_flags.exec_error++;
log_printf2("Exec: failed createprocess (\"%s\")",buf0); log_printf2("Exec: failed createprocess (\"%s\")",buf0);
} }
} }
@ -892,7 +884,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
else else
{ {
*lowout=*highout=0; *lowout=*highout=0;
exec_errorflag++; g_flags.exec_error++;
} }
} }
return 0; return 0;
@ -906,10 +898,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
DWORD t[4]; // our two members are the 3rd and 4th.. DWORD t[4]; // our two members are the 3rd and 4th..
VS_FIXEDFILEINFO *pvsf1=(VS_FIXEDFILEINFO*)t; VS_FIXEDFILEINFO *pvsf1=(VS_FIXEDFILEINFO*)t;
DWORD d; DWORD d;
char *buf0=process_string_fromparm_tobuf(0x00); char *buf1=process_string_fromparm_tobuf(-0x10);
s1=GetFileVersionInfoSize(buf0,&d); s1=GetFileVersionInfoSize(buf1,&d);
*lowout=*highout=0; *lowout=*highout=0;
exec_errorflag++; g_flags.exec_error++;
if (s1) if (s1)
{ {
void *b1; void *b1;
@ -917,12 +909,12 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (b1) if (b1)
{ {
UINT uLen; UINT uLen;
if (GetFileVersionInfo(buf0,0,s1,b1) && VerQueryValue(b1,"\\",(void*)&pvsf1,&uLen)) if (GetFileVersionInfo(buf1,0,s1,b1) && VerQueryValue(b1,"\\",(void*)&pvsf1,&uLen))
{ {
myitoa(highout,pvsf1->dwFileVersionMS); myitoa(highout,pvsf1->dwFileVersionMS);
myitoa(lowout,pvsf1->dwFileVersionLS); myitoa(lowout,pvsf1->dwFileVersionLS);
exec_errorflag--; g_flags.exec_error--;
} }
GlobalFree(b1); GlobalFree(b1);
} }
@ -934,33 +926,25 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_REGISTERDLL: case EW_REGISTERDLL:
{ {
HRESULT hres=OleInitialize(NULL); HRESULT hres=OleInitialize(NULL);
exec_errorflag++; g_flags.exec_error++;
if (hres == S_FALSE || hres == S_OK) if (hres == S_FALSE || hres == S_OK)
{ {
HANDLE h; HANDLE h;
char *buf0=process_string_fromparm_tobuf(0x00); char *buf1=process_string_fromparm_tobuf(-0x10);
char *buf1=process_string_fromparm_tobuf(0x11); char *buf0=process_string_fromparm_tobuf(0x01);
h=LoadLibrary(buf0); h=LoadLibrary(buf1);
if (h) if (h)
{ {
FARPROC funke = GetProcAddress(h,buf1); FARPROC funke = GetProcAddress(h,buf0);
if (funke) if (funke)
{ {
exec_errorflag--; g_flags.exec_error--;
if (parm2) if (parm2)
{ {
char *buf2=process_string_fromparm_tobuf(0x22); char *buf2=process_string_fromparm_tobuf(0x22);
update_status_text(buf2,buf1);
// suggested by Kevin Gadd (janusfury) if (funke()) g_flags.exec_error++;
mystrcpy(buf3, buf0);
trimslashtoend(buf3);
SetCurrentDirectory(buf3);
update_status_text(buf2,buf0);
if (funke()) exec_errorflag++;
SetCurrentDirectory(state_exe_directory);
} }
else else
{ {
@ -976,22 +960,22 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
else else
{ {
update_status_text_from_lang(LANG_CANNOTFINDSYMBOL,buf1); update_status_text_from_lang(LANG_CANNOTFINDSYMBOL,buf0);
log_printf3("Error registering DLL: %s not found in %s",buf1,buf0); log_printf3("Error registering DLL: %s not found in %s",buf0,buf1);
} }
if (!parm3) while (FreeLibrary(h)); if (!parm3) while (FreeLibrary(h));
// saves 2 bytes - FreeLibrary((HANDLE)((unsigned long)h&(unsigned long)parm3)); // saves 2 bytes - FreeLibrary((HANDLE)((unsigned long)h&(unsigned long)parm3));
} }
else else
{ {
update_status_text_from_lang(LANG_COULDNOTLOAD,buf0); update_status_text_from_lang(LANG_COULDNOTLOAD,buf1);
log_printf2("Error registering DLL: Could not load %s",buf0); log_printf2("Error registering DLL: Could not load %s",buf1);
} }
OleUninitialize(); OleUninitialize();
} }
else else
{ {
update_status_text_from_lang(LANG_NOOLE,buf0); update_status_text_from_lang(LANG_NOOLE,buf1);
log_printf("Error registering DLL: Could not initialize OLE"); log_printf("Error registering DLL: Could not initialize OLE");
} }
} }
@ -999,10 +983,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#endif #endif
#ifdef NSIS_SUPPORT_CREATESHORTCUT #ifdef NSIS_SUPPORT_CREATESHORTCUT
case EW_CREATESHORTCUT: { case EW_CREATESHORTCUT: {
char *buf2=process_string_fromparm_tobuf(0x20); char *buf2=process_string_fromparm_tobuf(-0x20);
char *buf1=process_string_fromparm_tobuf(0x11); char *buf1=process_string_fromparm_tobuf(-0x11);
char *buf0=process_string_fromparm_tobuf(0x02); char *buf0=process_string_fromparm_tobuf(0x02);
char *buf3=process_string_fromparm_tobuf(0x33); char *buf3=process_string_fromparm_tobuf(-0x33);
char *buf4=process_string_fromparm_tobuf(0x45); char *buf4=process_string_fromparm_tobuf(0x45);
HRESULT hres; HRESULT hres;
@ -1049,7 +1033,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (rv) if (rv)
{ {
exec_errorflag++; g_flags.exec_error++;
update_status_text_from_lang(LANG_ERRORCREATINGSHORTCUT,buf2); update_status_text_from_lang(LANG_ERRORCREATINGSHORTCUT,buf2);
} }
else else
@ -1083,14 +1067,14 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (res) if (res)
{ // some of these changes were from Edgewise (wiked_edge@yahoo.com) { // some of these changes were from Edgewise (wiked_edge@yahoo.com)
update_status_text_from_lang(LANG_COPYFAILED,""); update_status_text_from_lang(LANG_COPYFAILED,"");
exec_errorflag++; g_flags.exec_error++;
} }
} }
return 0; return 0;
#endif//NSIS_SUPPORT_COPYFILES #endif//NSIS_SUPPORT_COPYFILES
#ifdef NSIS_SUPPORT_REBOOT #ifdef NSIS_SUPPORT_REBOOT
case EW_REBOOT: case EW_REBOOT:
exec_errorflag++; g_flags.exec_error++;
{ {
HANDLE h=LoadLibrary("advapi32.dll"); HANDLE h=LoadLibrary("advapi32.dll");
if (h) if (h)
@ -1122,8 +1106,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
return 0; return 0;
} }
break; break;
case EW_IFREBOOTFLAG: return parms[!exec_rebootflag]; case EW_IFREBOOTFLAG: return parms[!g_flags.exec_reboot];
case EW_SETREBOOTFLAG: exec_rebootflag=parm0; return 0;
#endif//NSIS_SUPPORT_REBOOT #endif//NSIS_SUPPORT_REBOOT
#ifdef NSIS_SUPPORT_INIFILES #ifdef NSIS_SUPPORT_INIFILES
case EW_WRITEINI: case EW_WRITEINI:
@ -1145,9 +1128,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
str=process_string_fromparm_tobuf(0x22); str=process_string_fromparm_tobuf(0x22);
} }
buf3=process_string_fromparm_tobuf(0x33); buf3=process_string_fromparm_tobuf(-0x33);
log_printf5("WriteINIStr: wrote [%s] %s=%s in %s",buf0,buf1,buf2,buf3); log_printf5("WriteINIStr: wrote [%s] %s=%s in %s",buf0,buf1,buf2,buf3);
if (!WritePrivateProfileString(sec,key,str,buf3)) exec_errorflag++; if (!WritePrivateProfileString(sec,key,str,buf3)) g_flags.exec_error++;
} }
return 0; return 0;
case EW_READINISTR: case EW_READINISTR:
@ -1156,11 +1139,11 @@ static int NSISCALL ExecuteEntry(entry *entry_)
char *p=var0; char *p=var0;
char *buf0=process_string_fromparm_tobuf(0x01); char *buf0=process_string_fromparm_tobuf(0x01);
char *buf1=process_string_fromparm_tobuf(0x12); char *buf1=process_string_fromparm_tobuf(0x12);
char *buf2=process_string_fromparm_tobuf(0x23); char *buf2=process_string_fromparm_tobuf(-0x23);
GetPrivateProfileString(buf0,buf1,errstr,p,NSIS_MAX_STRLEN-1,buf2); GetPrivateProfileString(buf0,buf1,errstr,p,NSIS_MAX_STRLEN-1,buf2);
if (*((int*)errstr) == *((int*)p)) if (*((int*)errstr) == *((int*)p))
{ {
exec_errorflag++; g_flags.exec_error++;
p[0]=0; p[0]=0;
} }
} }
@ -1171,7 +1154,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
int rootkey=parm0; int rootkey=parm0;
char *buf3=process_string_fromparm_tobuf(0x31); char *buf3=process_string_fromparm_tobuf(0x31);
exec_errorflag++; g_flags.exec_error++;
if (!parm3) if (!parm3)
{ {
HKEY hKey; HKEY hKey;
@ -1179,14 +1162,14 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
char *buf0=process_string_fromparm_tobuf(0x02); char *buf0=process_string_fromparm_tobuf(0x02);
log_printf4("DeleteRegValue: %d\\%s\\%s",rootkey,buf3,buf0); log_printf4("DeleteRegValue: %d\\%s\\%s",rootkey,buf3,buf0);
if (RegDeleteValue(hKey,buf0) == ERROR_SUCCESS) exec_errorflag--; if (RegDeleteValue(hKey,buf0) == ERROR_SUCCESS) g_flags.exec_error--;
RegCloseKey(hKey); RegCloseKey(hKey);
} }
} }
else else
{ {
log_printf3("DeleteRegKey: %d\\%s",rootkey,buf3); log_printf3("DeleteRegKey: %d\\%s",rootkey,buf3);
if (myRegDeleteKeyEx((HKEY)rootkey,buf3,parm3&2) == ERROR_SUCCESS) exec_errorflag--; if (myRegDeleteKeyEx((HKEY)rootkey,buf3,parm3&2) == ERROR_SUCCESS) g_flags.exec_error--;
} }
} }
return 0; return 0;
@ -1197,20 +1180,20 @@ static int NSISCALL ExecuteEntry(entry *entry_)
int type=parm4; int type=parm4;
char *buf1=process_string_fromparm_tobuf(0x12); char *buf1=process_string_fromparm_tobuf(0x12);
char *buf3=process_string_fromparm_tobuf(0x31); char *buf3=process_string_fromparm_tobuf(0x31);
exec_errorflag++; g_flags.exec_error++;
if (RegCreateKey((HKEY)rootkey,buf3,&hKey) == ERROR_SUCCESS) if (RegCreateKey((HKEY)rootkey,buf3,&hKey) == ERROR_SUCCESS)
{ {
if (type <= 1) if (type <= 1)
{ {
char *buf2=process_string_fromparm_tobuf(0x23); char *buf2=process_string_fromparm_tobuf(0x23);
if (RegSetValueEx(hKey,buf1,0,type==1?REG_SZ:REG_EXPAND_SZ,buf2,mystrlen(buf2)+1) == ERROR_SUCCESS) exec_errorflag--; if (RegSetValueEx(hKey,buf1,0,type==1?REG_SZ:REG_EXPAND_SZ,buf2,mystrlen(buf2)+1) == ERROR_SUCCESS) g_flags.exec_error--;
log_printf5("WriteRegStr: set %d\\%s\\%s to %s",rootkey,buf3,buf1,buf2); log_printf5("WriteRegStr: set %d\\%s\\%s to %s",rootkey,buf3,buf1,buf2);
} }
else if (type == 2) else if (type == 2)
{ {
DWORD l; DWORD l;
l=process_string_fromparm_toint(3); l=process_string_fromparm_toint(3);
if (RegSetValueEx(hKey,buf1,0,REG_DWORD,(unsigned char*)&l,4) == ERROR_SUCCESS) exec_errorflag--; if (RegSetValueEx(hKey,buf1,0,REG_DWORD,(unsigned char*)&l,4) == ERROR_SUCCESS) g_flags.exec_error--;
log_printf5("WriteRegDWORD: set %d\\%s\\%s to %d",rootkey,buf3,buf1,l); log_printf5("WriteRegDWORD: set %d\\%s\\%s to %d",rootkey,buf3,buf1,l);
} }
else if (type == 3) else if (type == 3)
@ -1218,7 +1201,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
int len=GetCompressedDataFromDataBlockToMemory(parm3, buf2, NSIS_MAX_STRLEN); int len=GetCompressedDataFromDataBlockToMemory(parm3, buf2, NSIS_MAX_STRLEN);
if (len >= 0) if (len >= 0)
{ {
if (RegSetValueEx(hKey,buf1,0,REG_BINARY,buf2,len) == ERROR_SUCCESS) exec_errorflag--; if (RegSetValueEx(hKey,buf1,0,REG_BINARY,buf2,len) == ERROR_SUCCESS) g_flags.exec_error--;
} }
log_printf5("WriteRegBin: set %d\\%s\\%s with %d bytes",rootkey,buf3,buf1,len); log_printf5("WriteRegBin: set %d\\%s\\%s with %d bytes",rootkey,buf3,buf1,len);
@ -1245,20 +1228,20 @@ static int NSISCALL ExecuteEntry(entry *entry_)
(t != REG_DWORD && t != REG_SZ && t != REG_EXPAND_SZ)) (t != REG_DWORD && t != REG_SZ && t != REG_EXPAND_SZ))
{ {
p[0]=0; p[0]=0;
exec_errorflag++; g_flags.exec_error++;
} }
else else
{ {
if (t==REG_DWORD) if (t==REG_DWORD)
{ {
if (!parm4) exec_errorflag++; if (!parm4) g_flags.exec_error++;
myitoa(p,*((DWORD*)p)); myitoa(p,*((DWORD*)p));
} }
else if (parm4) exec_errorflag++; else if (parm4) g_flags.exec_error++;
} }
RegCloseKey(hKey); RegCloseKey(hKey);
} }
else exec_errorflag++; else g_flags.exec_error++;
} }
return 0; return 0;
case EW_REGENUM: case EW_REGENUM:
@ -1276,7 +1259,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
p[NSIS_MAX_STRLEN-1]=0; p[NSIS_MAX_STRLEN-1]=0;
RegCloseKey(key); RegCloseKey(key);
} }
else exec_errorflag++; else g_flags.exec_error++;
} }
return 0; return 0;
@ -1292,12 +1275,12 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
HANDLE h; HANDLE h;
char *handleout=var3; char *handleout=var3;
char *buf0=process_string_fromparm_tobuf(0x00); char *buf1=process_string_fromparm_tobuf(-0x10);
h=myOpenFile(buf0,parm1,parm2); h=myOpenFile(buf1,parm1,parm2);
if (h == INVALID_HANDLE_VALUE) if (h == INVALID_HANDLE_VALUE)
{ {
*handleout=0; *handleout=0;
exec_errorflag++; g_flags.exec_error++;
} }
else else
{ {
@ -1321,7 +1304,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
if (!*t || !WriteFile((HANDLE)myatoi(t),buf1,l,&dw,NULL)) if (!*t || !WriteFile((HANDLE)myatoi(t),buf1,l,&dw,NULL))
{ {
exec_errorflag++; g_flags.exec_error++;
} }
} }
return 0; return 0;
@ -1360,7 +1343,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
} }
textout[rpos]=0; textout[rpos]=0;
if (!rpos) exec_errorflag++; if (!rpos) g_flags.exec_error++;
} }
return 0; return 0;
case EW_FSEEK: case EW_FSEEK:
@ -1396,7 +1379,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
else else
{ {
exec_errorflag++; g_flags.exec_error++;
*textout=0; *textout=0;
} }
@ -1414,7 +1397,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
*handleout=0; *handleout=0;
*textout=0; *textout=0;
exec_errorflag++; g_flags.exec_error++;
} }
else else
{ {
@ -1439,6 +1422,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
lstrcat(addtrailingslash(mystrcpy(buf1,state_install_directory)),buf0); lstrcat(addtrailingslash(mystrcpy(buf1,state_install_directory)),buf0);
} }
validate_filename(buf1);
hFile=myOpenFile(buf1,GENERIC_WRITE,CREATE_ALWAYS); hFile=myOpenFile(buf1,GENERIC_WRITE,CREATE_ALWAYS);
@ -1454,13 +1438,11 @@ static int NSISCALL ExecuteEntry(entry *entry_)
ReadSelfFile((char*)filebuf,g_filehdrsize); ReadSelfFile((char*)filebuf,g_filehdrsize);
if (g_inst_header->uninstdata_offset != -1) if (g_inst_header->uninstdata_offset != -1)
{ {
// Changed by Amir Szekely 11th July 2002
unsigned char* seeker; unsigned char* seeker;
unsigned char* unicon_data = seeker = (unsigned char*)my_GlobalAlloc(g_inst_header->uninsticon_size); unsigned char* unicon_data = seeker = (unsigned char*)my_GlobalAlloc(g_inst_header->uninsticon_size);
if (unicon_data) { if (unicon_data) {
GetCompressedDataFromDataBlockToMemory(g_inst_header->uninstdata_offset, GetCompressedDataFromDataBlockToMemory(g_inst_header->uninstdata_offset,
unicon_data,g_inst_header->uninsticon_size); unicon_data,g_inst_header->uninsticon_size);
//for (i = 0; i < *(DWORD*)unicon_data; i++) {
while (*seeker) { while (*seeker) {
DWORD dwSize, dwOffset; DWORD dwSize, dwOffset;
dwSize = *(DWORD*)seeker; dwSize = *(DWORD*)seeker;
@ -1484,7 +1466,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
update_status_text_from_lang(LANG_ERRORCREATING,buf0); update_status_text_from_lang(LANG_ERRORCREATING,buf0);
DeleteFile(buf1); DeleteFile(buf1);
exec_errorflag++; g_flags.exec_error++;
} }
else else
update_status_text_from_lang(LANG_CREATEDUNINST,buf0); update_status_text_from_lang(LANG_CREATEDUNINST,buf0);
@ -1507,6 +1489,13 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
return 0; return 0;
#endif//NSIS_CONFIG_LOG #endif//NSIS_CONFIG_LOG
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
// Added by Ximon Eighteen 5th August 2002
case EW_PLUGINCOMMANDPREP:
// $0 temp plug-ins dir
if (!*plugins_temp_dir) mystrcpy(plugins_temp_dir,g_usrvars[0]);
return 0;
#endif // NSIS_CONFIG_PLUGIN_SUPPORT
#ifdef NSIS_CONFIG_COMPONENTPAGE #ifdef NSIS_CONFIG_COMPONENTPAGE
case EW_SECTIONSET: case EW_SECTIONSET:
{ {
@ -1545,18 +1534,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
myitoa(var2,g_inst_section[x].flags); myitoa(var2,g_inst_section[x].flags);
} }
} }
else exec_errorflag++; else g_flags.exec_error++;
} }
return 0; return 0;
#endif//NSIS_CONFIG_COMPONENTPAGE #endif//NSIS_CONFIG_COMPONENTPAGE
// Added by Ximon Eighteen 5th August 2002
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
case EW_PLUGINCOMMANDPREP:
// $0 temp plug-ins dir
if (!*plugins_temp_dir) mystrcpy(plugins_temp_dir,g_usrvars[0]);
return 0;
#endif // NSIS_CONFIG_PLUGIN_SUPPORT
} }
my_MessageBox(LANG_STR(LANG_INSTCORRUPTED),MB_OK|MB_ICONSTOP); my_MessageBox(LANG_STR(LANG_INSTCORRUPTED),MB_OK|MB_ICONSTOP);
return EXEC_ERROR; return EXEC_ERROR;

View file

@ -1,7 +1,18 @@
#ifndef _EXEC_H_ #ifndef _EXEC_H_
#define _EXEC_H_ #define _EXEC_H_
extern union flags {
struct {
int autoclose;
int all_user_var;
int exec_error;
#ifdef NSIS_SUPPORT_REBOOT
int exec_reboot;
#endif
};
int flags[1];
} g_flags;
int NSISCALL ExecuteCodeSegment(int pos, HWND hwndProgress); // returns 0 on success int NSISCALL ExecuteCodeSegment(int pos, HWND hwndProgress); // returns 0 on success
#endif//_EXEC_H_ #endif//_EXEC_H_

View file

@ -39,15 +39,14 @@ enum
EW_CALL, // Call: 1 [new address+1] EW_CALL, // Call: 1 [new address+1]
EW_UPDATETEXT, // Update status text: 2 [update str, ui_st_updateflag=?ui_st_updateflag:this] EW_UPDATETEXT, // Update status text: 2 [update str, ui_st_updateflag=?ui_st_updateflag:this]
EW_SLEEP, // Sleep: 1 [sleep time in milliseconds] EW_SLEEP, // Sleep: 1 [sleep time in milliseconds]
EW_SETSFCONTEXT, // SetShellVarContext: 1: [isAll]
EW_HIDEWINDOW, // HideWindow: 0 EW_HIDEWINDOW, // HideWindow: 0
EW_BRINGTOFRONT, // BringToFront: 0 EW_BRINGTOFRONT, // BringToFront: 0
EW_SETWINDOWCLOSE, // SetWindowClose: 1 [0: no window close at end, 1: window close at end]
EW_CHDETAILSVIEW, // SetDetailsView: 2 [listaction,buttonaction] EW_CHDETAILSVIEW, // SetDetailsView: 2 [listaction,buttonaction]
EW_SETFILEATTRIBUTES, // SetFileAttributes: 2 [filename, attributes] EW_SETFILEATTRIBUTES, // SetFileAttributes: 2 [filename, attributes]
EW_CREATEDIR, // Create directory: 2, [path, ?update$INSTDIR] EW_CREATEDIR, // Create directory: 2, [path, ?update$INSTDIR]
EW_IFFILEEXISTS, // IfFileExists: 3, [file name, jump amount if exists, jump amount if not exists] EW_IFFILEEXISTS, // IfFileExists: 3, [file name, jump amount if exists, jump amount if not exists]
EW_IFERRORS, //a IfErrors: 3 [jump if error, jump if not error, new_erflag] EW_IFERRORS, // IfErrors: 2 [jump if error, jump if not error]
EW_SETFLAG, // Sets a flag: 2 [id, data]
#ifdef NSIS_SUPPORT_RENAME #ifdef NSIS_SUPPORT_RENAME
EW_RENAME, // Rename: 3 [old, new, rebootok] EW_RENAME, // Rename: 3 [old, new, rebootok]
#endif #endif
@ -132,7 +131,6 @@ enum
#ifdef NSIS_SUPPORT_REBOOT #ifdef NSIS_SUPPORT_REBOOT
EW_REBOOT, // Reboot: 0 EW_REBOOT, // Reboot: 0
EW_IFREBOOTFLAG, // IfRebootFlag: 2 [if reboot flag set, if not reboot flag] EW_IFREBOOTFLAG, // IfRebootFlag: 2 [if reboot flag set, if not reboot flag]
EW_SETREBOOTFLAG, // SetRebootFlag: 1 [new value]
#endif #endif
#ifdef NSIS_SUPPORT_INIFILES #ifdef NSIS_SUPPORT_INIFILES
@ -181,8 +179,14 @@ enum
EW_GETLABELADDR, // both of these get converted to EW_ASSIGNVAR EW_GETLABELADDR, // both of these get converted to EW_ASSIGNVAR
EW_GETFUNCTIONADDR, EW_GETFUNCTIONADDR,
EW_PLUGINCOMMANDPREP // Saves 56 bytes, don't ask me how
EW_DUMMY,
EW_DUMMY2,
EW_DUMMY3,
EW_DUMMY4,
EW_DUMMY5,
EW_PLUGINCOMMANDPREP,
}; };
#define FH_FLAGS_MASK 15 #define FH_FLAGS_MASK 15
@ -191,7 +195,6 @@ enum
#ifdef NSIS_CONFIG_SILENT_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT
#define FH_FLAGS_SILENT 4 #define FH_FLAGS_SILENT 4
#endif #endif
// Added by Amir Szekely 23rd July 2002
#define FH_FLAGS_FORCE_CRC 8 #define FH_FLAGS_FORCE_CRC 8
#define FH_SIG 0xDEADBEEF #define FH_SIG 0xDEADBEEF

View file

@ -10,7 +10,7 @@ void NSISCALL update_status_text_from_lang(int id, const char *text2);
void NSISCALL update_status_text(const char *text1, const char *text2); void NSISCALL update_status_text(const char *text1, const char *text2);
extern int ui_st_updateflag; extern int ui_st_updateflag;
extern int g_autoclose; //extern int g_autoclose;
extern void *g_inst_combinedheader; extern void *g_inst_combinedheader;
extern page *g_inst_page; extern page *g_inst_page;
extern section *g_inst_section; extern section *g_inst_section;

View file

@ -5,6 +5,7 @@
#include "state.h" #include "state.h"
#include "config.h" #include "config.h"
#include "lang.h" #include "lang.h"
#include "exec.h"
#include "fileform.h" #include "fileform.h"
#include "ui.h" #include "ui.h"
@ -42,17 +43,18 @@ HANDLE NSISCALL myCreateProcess(char *cmd, char *dir)
return ProcInfo.hProcess; return ProcInfo.hProcess;
} }
BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val) /*BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val)
{ {
return SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)val); return SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)val);
} }*/
BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val) BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val)
{ {
return my_SetWindowText(GetDlgItem(dlg,idx),val); return SetDlgItemText(dlg,idx,val);
//return my_SetWindowText(GetDlgItem(dlg,idx),val);
} }
int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size) /*int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size)
{ {
return SendMessage(hWnd,WM_GETTEXT,size,(LPARAM)val); return SendMessage(hWnd,WM_GETTEXT,size,(LPARAM)val);
} }
@ -60,7 +62,7 @@ int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size)
int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size) int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size)
{ {
return my_GetWindowText(GetDlgItem(dlg,idx),val,size); return my_GetWindowText(GetDlgItem(dlg,idx),val,size);
} }*/
int NSISCALL my_MessageBox(const char *text, UINT type) { int NSISCALL my_MessageBox(const char *text, UINT type) {
return MessageBox(g_hwnd, text, g_caption, type); return MessageBox(g_hwnd, text, g_caption, type);
@ -163,10 +165,9 @@ int NSISCALL is_valid_instpath(char *s)
return ivp; return ivp;
} }
static char * NSISCALL findinmem(char *a, char *b, int len_of_a) char * NSISCALL mystrstr(char *a, char *b)
{ {
if (len_of_a<0) len_of_a=mystrlen(a); int len_of_a = mystrlen(a) - mystrlen(b);
len_of_a -= mystrlen(b);
while (*a && len_of_a >= 0) while (*a && len_of_a >= 0)
{ {
char *t=a,*u=b; char *t=a,*u=b;
@ -255,7 +256,7 @@ BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
if (pszWinInit != NULL) if (pszWinInit != NULL)
{ {
LPSTR pszRenameSecInFile = findinmem(pszWinInit, szRenameSec,-1); LPSTR pszRenameSecInFile = mystrstr(pszWinInit, szRenameSec);
if (pszRenameSecInFile == NULL) if (pszRenameSecInFile == NULL)
{ {
mystrcpy(pszWinInit+dwFileSize, szRenameSec); mystrcpy(pszWinInit+dwFileSize, szRenameSec);
@ -265,7 +266,7 @@ BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
else else
{ {
char *pszFirstRenameLine = pszRenameSecInFile+10; char *pszFirstRenameLine = pszRenameSecInFile+10;
char *pszNextSec = findinmem(pszFirstRenameLine,"\n[",-1); char *pszNextSec = mystrstr(pszFirstRenameLine,"\n[");
if (pszNextSec) if (pszNextSec)
{ {
int l=dwFileSize - (pszNextSec - pszWinInit); int l=dwFileSize - (pszNextSec - pszWinInit);
@ -314,14 +315,14 @@ void NSISCALL myRegGetStr(HKEY root, const char *sub, const char *name, char *ou
static char smwcvesf[]="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; static char smwcvesf[]="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
char g_all_user_var_flag; //int g_all_user_var_flag;
static void NSISCALL queryShellFolders(const char *name_, char *out) static void NSISCALL queryShellFolders(const char *name_, char *out)
{ {
static char name[20] = "Common "; static char name[20] = "Common ";
mystrcpy(name + 7, name_); mystrcpy(name + 7, name_);
{ {
char f=g_all_user_var_flag; char f=g_flags.all_user_var;
again: again:
@ -345,7 +346,7 @@ char ps_tmpbuf[NSIS_MAX_STRLEN*2];
char * NSISCALL process_string_fromtab(char *out, int offs) char * NSISCALL process_string_fromtab(char *out, int offs)
{ {
return lstrcpyn(out,process_string(ps_tmpbuf,GetStringFromStringTab(offs)),NSIS_MAX_STRLEN); return lstrcpyn(out,process_string(GetStringFromStringTab(offs)),NSIS_MAX_STRLEN);
} }
void NSISCALL myitoa(char *s, int d) { wsprintf(s,"%d",d); } void NSISCALL myitoa(char *s, int d) { wsprintf(s,"%d",d); }
@ -405,10 +406,10 @@ int NSISCALL mystrlen(const char *in)
} }
// Dave Laundon's simplified process_string // Dave Laundon's simplified process_string
char * NSISCALL process_string(char *out, const char *in) char * NSISCALL process_string(const char *in)
{ {
char *outsave = out; char *out = ps_tmpbuf;
while (*in && out - outsave < NSIS_MAX_STRLEN) while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN)
{ {
int nVarIdx = (unsigned char)*in++; int nVarIdx = (unsigned char)*in++;
if (nVarIdx < VAR_CODES_START) if (nVarIdx < VAR_CODES_START)
@ -426,7 +427,7 @@ char * NSISCALL process_string(char *out, const char *in)
{ {
case VAR_CODES_START + 0: // HWNDPARENT case VAR_CODES_START + 0: // HWNDPARENT
myitoa(out, (unsigned int)g_hwnd); myitoa(out, (unsigned int)g_hwnd);
break; break;
case VAR_CODES_START + 1: // 0 case VAR_CODES_START + 1: // 0
case VAR_CODES_START + 2: // 1 case VAR_CODES_START + 2: // 1
case VAR_CODES_START + 3: // 2 case VAR_CODES_START + 3: // 2
@ -511,18 +512,40 @@ char * NSISCALL process_string(char *out, const char *in)
#endif #endif
#endif //NSIS_CONFIG_PLUGIN_SUPPORT #endif //NSIS_CONFIG_PLUGIN_SUPPORT
} // switch } // switch
// remove trailing slash // validate the directory name
while (*out && *CharNext(out)) out++; if (nVarIdx > 21+VAR_CODES_START) { // only if not $0 to $R9, $CMDLINE, or $HWNDPARENT
if (nVarIdx > 21+VAR_CODES_START && nVarIdx != VAR_CODES_START+25 && *out == '\\') // only if not $0 to $R9, $CMDLINE, $LANGUAGE, or $HWNDPARENT // ($LANGUAGE can't have trailing backslash anyway...)
*out = 0; validate_filename(out);
out=CharNext(out); }
out+=mystrlen(out);
} // >= VAR_CODES_START } // >= VAR_CODES_START
} // while } // while
*out = 0; *out = 0;
return outsave; return ps_tmpbuf;
;
} }
#ifdef NSIS_CONFIG_LOG
char * NSISCALL validate_filename(char *in) {
char *nono = "*?|<>/\":";
char *cur_char = " ";
char *out = in;
char *out_save = out;
int i = 0;
while (*cur_char = *in++) {
if (!mystrstr(nono, cur_char) ||
(i == 1 && *(WORD*)out == CHAR2_TO_WORD(':','\\')) ||
(i == 2 && *cur_char == '?' && *(DWORD*)in == CHAR4_TO_DWORD('\\','\\','?','\\'))
)
*out++ = *cur_char;
i++;
}
do {
*out = 0;
} while (i && (*(--out) == ' ' || *out == '\\'));
return out_save;
}
#ifdef NSIS_CONFIG_LOG
char log_text[4096]; char log_text[4096];
int log_dolog; int log_dolog;
void NSISCALL log_write(int close) void NSISCALL log_write(int close)
@ -554,6 +577,4 @@ void NSISCALL log_write(int close)
} }
} }
} }
#endif #endif

View file

@ -1,17 +1,22 @@
#include "config.h" #include "config.h"
extern char ps_tmpbuf[NSIS_MAX_STRLEN*2]; extern char ps_tmpbuf[NSIS_MAX_STRLEN*2];
char * NSISCALL process_string(char *out, const char *in); char * NSISCALL process_string(const char *in);
char * NSISCALL process_string_fromtab(char *out, int offs); char * NSISCALL process_string_fromtab(char *out, int offs);
void NSISCALL myRegGetStr(HKEY root, const char *sub, const char *name, char *out); void NSISCALL myRegGetStr(HKEY root, const char *sub, const char *name, char *out);
int NSISCALL myatoi(char *s); int NSISCALL myatoi(char *s);
void NSISCALL myitoa(char *s, int d); void NSISCALL myitoa(char *s, int d);
char * NSISCALL mystrcpy(char *out, const char *in); char * NSISCALL mystrcpy(char *out, const char *in);
int NSISCALL mystrlen(const char *in); int NSISCALL mystrlen(const char *in);
BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val); char * NSISCALL mystrstr(char *a, char *b);
//BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val);
#define my_SetWindowText SetWindowText
BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val); BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val);
int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size); //int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size);
int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size); #define my_GetWindowText GetWindowText
//int NSISCALL my_GetDialogItemText(HWND dlg, UINT idx, char *val, int size);
#define my_GetDialogItemText GetDlgItemText
#ifdef NSIS_CONFIG_LOG #ifdef NSIS_CONFIG_LOG
extern char log_text[NSIS_MAX_STRLEN*4]; extern char log_text[NSIS_MAX_STRLEN*4];
@ -48,6 +53,7 @@ char NSISCALL lastchar(const char *str);
void NSISCALL trimslashtoend(char *buf); void NSISCALL trimslashtoend(char *buf);
char * NSISCALL scanendslash(const char *str); char * NSISCALL scanendslash(const char *str);
int NSISCALL is_valid_instpath(char *s); int NSISCALL is_valid_instpath(char *s);
char * NSISCALL validate_filename(char *fn);
BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew); BOOL NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew);
void * NSISCALL mini_memcpy(void *out, const void *in, int len); void * NSISCALL mini_memcpy(void *out, const void *in, int len);

View file

@ -784,7 +784,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG(" (%s:%s)", k?"pre":"creator", line.gettoken_str(2)); SCRIPT_MSG(" (%s:%s)", k?"pre":"creator", line.gettoken_str(2));
if (p.showfunc>=0 && k) if (p.showfunc>=0 && k)
SCRIPT_MSG(" (show:%s)", line.gettoken_str(3)); SCRIPT_MSG(" (show:%s)", line.gettoken_str(3));
if (p.showfunc>=0 && k) if (p.leavefunc>=0 && k)
SCRIPT_MSG(" (leave:%s)", line.gettoken_str(4)); SCRIPT_MSG(" (leave:%s)", line.gettoken_str(4));
else if (p.caption && !k) else if (p.caption && !k)
SCRIPT_MSG(" (caption:%s)", line.gettoken_str(3)); SCRIPT_MSG(" (caption:%s)", line.gettoken_str(3));
@ -2241,9 +2241,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG("Goto: %s\n",line.gettoken_str(1)); SCRIPT_MSG("Goto: %s\n",line.gettoken_str(1));
return add_entry(&ent); return add_entry(&ent);
case TOK_SETSHELLVARCONTEXT: case TOK_SETSHELLVARCONTEXT:
ent.which=EW_SETSFCONTEXT; ent.which=EW_SETFLAG;
ent.offsets[0]=line.gettoken_enum(1,"current\0all\0"); ent.offsets[0]=1;
if (ent.offsets[0]<0) PRINTHELP() ent.offsets[1]=line.gettoken_enum(1,"current\0all\0");
if (ent.offsets[1]<0) PRINTHELP()
SCRIPT_MSG("SetShellVarContext: %s\n",line.gettoken_str(1)); SCRIPT_MSG("SetShellVarContext: %s\n",line.gettoken_str(1));
return add_entry(&ent); return add_entry(&ent);
case TOK_RET: case TOK_RET:
@ -2989,9 +2990,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG("SetDetailsPrint: %s\n",line.gettoken_str(1)); SCRIPT_MSG("SetDetailsPrint: %s\n",line.gettoken_str(1));
return add_entry(&ent); return add_entry(&ent);
case TOK_SETAUTOCLOSE: case TOK_SETAUTOCLOSE:
ent.which=EW_SETWINDOWCLOSE; ent.which=EW_SETFLAG;
ent.offsets[0] = line.gettoken_enum(1,"false\0true\0"); ent.offsets[0]=0;
if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[1]=line.gettoken_enum(1,"false\0true\0");
if (ent.offsets[1] < 0) PRINTHELP()
SCRIPT_MSG("SetAutoClose: %s\n",line.gettoken_str(1)); SCRIPT_MSG("SetAutoClose: %s\n",line.gettoken_str(1));
return add_entry(&ent); return add_entry(&ent);
case TOK_IFERRORS: case TOK_IFERRORS:
@ -3001,12 +3003,15 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG("IfErrors ?%s:%s\n",line.gettoken_str(1),line.gettoken_str(2)); SCRIPT_MSG("IfErrors ?%s:%s\n",line.gettoken_str(1),line.gettoken_str(2));
return add_entry(&ent); return add_entry(&ent);
case TOK_CLEARERRORS: case TOK_CLEARERRORS:
ent.which=EW_IFERRORS; ent.which=EW_SETFLAG;
ent.offsets[0]=2;
ent.offsets[1]=0;
SCRIPT_MSG("ClearErrors\n"); SCRIPT_MSG("ClearErrors\n");
return add_entry(&ent); return add_entry(&ent);
case TOK_SETERRORS: case TOK_SETERRORS:
ent.which=EW_IFERRORS; ent.which=EW_SETFLAG;
ent.offsets[2]=1; ent.offsets[0]=2;
ent.offsets[1]=1;
SCRIPT_MSG("SetErrors\n"); SCRIPT_MSG("SetErrors\n");
return add_entry(&ent); return add_entry(&ent);
#ifdef NSIS_SUPPORT_STROPTS #ifdef NSIS_SUPPORT_STROPTS
@ -3726,9 +3731,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char
SCRIPT_MSG("IfRebootFlag ?%s:%s\n",line.gettoken_str(1),line.gettoken_str(2)); SCRIPT_MSG("IfRebootFlag ?%s:%s\n",line.gettoken_str(1),line.gettoken_str(2));
return add_entry(&ent); return add_entry(&ent);
case TOK_SETREBOOTFLAG: case TOK_SETREBOOTFLAG:
ent.which=EW_SETREBOOTFLAG; ent.which=EW_SETFLAG;
ent.offsets[0]=line.gettoken_enum(1,"false\0true\0"); ent.offsets[0]=3;
if (ent.offsets[0] < 0) PRINTHELP() ent.offsets[1]=line.gettoken_enum(1,"false\0true\0");
if (ent.offsets[1] < 0) PRINTHELP()
return add_entry(&ent); return add_entry(&ent);
#else//!NSIS_SUPPORT_REBOOT #else//!NSIS_SUPPORT_REBOOT
case TOK_REBOOT: case TOK_REBOOT:

View file

@ -4,12 +4,18 @@ TODO
NSIS NSIS
* check for invalid chars/spaces in folder input * fix $QUICKLAUNCH with all context
* avaiable size not showing when directory doesn't exist
-- NSIS 2 Beta 2 -- -- NSIS 2 Beta 2 --
NSIS NSIS
* move more ui changes to compile time.
make progress bar flags be written directly in the UI (PBS_SMOOTH)
inst details could be changed in compile time too
* component page for uninstaller, multiple sections * component page for uninstaller, multiple sections
* more default texts in NLF language files * more default texts in NLF language files
@ -18,6 +24,8 @@ NSIS
* different color for the drive space when there is not enough space * different color for the drive space when there is not enough space
* all installer strings should be language strings
DOCUMENTATION DOCUMENTATION
* user_vars should link to the user_vars section as in the old docs callbacks and * user_vars should link to the user_vars section as in the old docs callbacks and