diff --git a/Source/build.cpp b/Source/build.cpp index 1eb4823d..dbeefa22 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -415,43 +415,32 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS"); m_UserVarNames.add("EXEDIR",1); // 23 m_UserVarNames.add("LANGUAGE",1); // 24 m_UserVarNames.add("TEMP",-1); // 25 - m_UserVarNames.add("_CLICK",-1); // 26 - m_UserVarNames.add("PLUGINSDIR",-1); // 27 + m_UserVarNames.add("PLUGINSDIR",-1); // 26 + m_UserVarNames.add("HWNDPARENT",-1); // 27 + m_UserVarNames.add("_CLICK",-1); // 28 -#ifndef NSIS_SUPPORT_SHELLFOLDERS_CONST - m_UserVarNames.add("PROGRAMFILES",-1); // 28 - m_UserVarNames.add("SMPROGRAMS",-1); // 29 - m_UserVarNames.add("SMSTARTUP",-1); // 30 - m_UserVarNames.add("DESKTOP",-1); // 31 - m_UserVarNames.add("STARTMENU",-1); // 32 - m_UserVarNames.add("QUICKLAUNCH",-1); // 33 -#endif - // (if not using shell codes) - m_UserVarNames.add("WINDIR",-1); // 34 (28) - m_UserVarNames.add("SYSDIR",-1); // 35 (29) everything after here doesn't have trailing slash removal - m_UserVarNames.add("HWNDPARENT",-1); // 36 (30) - -#ifdef NSIS_SUPPORT_SHELLFOLDERS_CONST - m_ShellConstants.add("PROGRAMFILES",CSIDL_CONTROLS, CSIDL_CONTROLS); // Special for virtual "Program Files" - m_ShellConstants.add("SMPROGRAMS",CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS ); - m_ShellConstants.add("SMSTARTUP",CSIDL_STARTUP, CSIDL_COMMON_STARTUP ); + m_ShellConstants.add("WINDIR",CSIDL_WINDOWS,CSIDL_WINDOWS); + m_ShellConstants.add("SYSDIR",CSIDL_SYSTEM,CSIDL_SYSTEM); + m_ShellConstants.add("PROGRAMFILES",CSIDL_PROGRAM_FILES, CSIDL_PROGRAM_FILES); + m_ShellConstants.add("SMPROGRAMS",CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS); + m_ShellConstants.add("SMSTARTUP",CSIDL_STARTUP, CSIDL_COMMON_STARTUP); m_ShellConstants.add("DESKTOP",CSIDL_DESKTOPDIRECTORY, CSIDL_COMMON_DESKTOPDIRECTORY); - m_ShellConstants.add("STARTMENU",CSIDL_STARTMENU, CSIDL_COMMON_STARTMENU ); - m_ShellConstants.add("QUICKLAUNCH", CSIDL_DESKTOP, CSIDL_DESKTOP ); // Special for virtual quick launch (needed for compatibility) - m_ShellConstants.add("COMMONFILES",CSIDL_BITBUCKET, CSIDL_BITBUCKET ); // Special for virtual "Commmon Files" - m_ShellConstants.add("DOCUMENTS",CSIDL_PERSONAL, CSIDL_COMMON_DOCUMENTS ); - m_ShellConstants.add("SENDTO",CSIDL_SENDTO, CSIDL_SENDTO ); - m_ShellConstants.add("RECENT",CSIDL_RECENT, CSIDL_RECENT ); - m_ShellConstants.add("FAVORITES",CSIDL_FAVORITES, CSIDL_COMMON_FAVORITES ); - m_ShellConstants.add("MUSIC",CSIDL_MYMUSIC, CSIDL_COMMON_MUSIC ); - m_ShellConstants.add("PICTURES",CSIDL_MYPICTURES, CSIDL_COMMON_PICTURES ); - m_ShellConstants.add("VIDEOS",CSIDL_MYVIDEO, CSIDL_COMMON_VIDEO ); - m_ShellConstants.add("NETHOOD", CSIDL_NETHOOD, CSIDL_NETHOOD ); - m_ShellConstants.add("FONTS", CSIDL_FONTS, CSIDL_FONTS ); - m_ShellConstants.add("TEMPLATES", CSIDL_TEMPLATES, CSIDL_COMMON_TEMPLATES ); - m_ShellConstants.add("APPDATA", CSIDL_APPDATA, CSIDL_COMMON_APPDATA ); - m_ShellConstants.add("PRINTHOOD", CSIDL_PRINTHOOD, CSIDL_PRINTHOOD ); - //m_ShellConstants.add("ALTSTARTUP", CSIDL_ALTSTARTUP, CSIDL_COMMON_ALTSTARTUP ); + m_ShellConstants.add("STARTMENU",CSIDL_STARTMENU, CSIDL_COMMON_STARTMENU); + m_ShellConstants.add("QUICKLAUNCH", CSIDL_APPDATA, CSIDL_PRINTERS); + m_ShellConstants.add("COMMONFILES",CSIDL_PROGRAM_FILES_COMMON, CSIDL_PROGRAM_FILES_COMMON); + m_ShellConstants.add("DOCUMENTS",CSIDL_PERSONAL, CSIDL_COMMON_DOCUMENTS); + m_ShellConstants.add("SENDTO",CSIDL_SENDTO, CSIDL_SENDTO); + m_ShellConstants.add("RECENT",CSIDL_RECENT, CSIDL_RECENT); + m_ShellConstants.add("FAVORITES",CSIDL_FAVORITES, CSIDL_COMMON_FAVORITES); + m_ShellConstants.add("MUSIC",CSIDL_MYMUSIC, CSIDL_COMMON_MUSIC); + m_ShellConstants.add("PICTURES",CSIDL_MYPICTURES, CSIDL_COMMON_PICTURES); + m_ShellConstants.add("VIDEOS",CSIDL_MYVIDEO, CSIDL_COMMON_VIDEO); + m_ShellConstants.add("NETHOOD", CSIDL_NETHOOD, CSIDL_NETHOOD); + m_ShellConstants.add("FONTS", CSIDL_FONTS, CSIDL_FONTS); + m_ShellConstants.add("TEMPLATES", CSIDL_TEMPLATES, CSIDL_COMMON_TEMPLATES); + m_ShellConstants.add("APPDATA", CSIDL_APPDATA, CSIDL_COMMON_APPDATA); + m_ShellConstants.add("PRINTHOOD", CSIDL_PRINTHOOD, CSIDL_PRINTHOOD); + //m_ShellConstants.add("ALTSTARTUP", CSIDL_ALTSTARTUP, CSIDL_COMMON_ALTSTARTUP); m_ShellConstants.add("INTERNET_CACHE", CSIDL_INTERNET_CACHE, CSIDL_INTERNET_CACHE); m_ShellConstants.add("COOKIES", CSIDL_COOKIES, CSIDL_COOKIES); m_ShellConstants.add("HISTORY", CSIDL_HISTORY, CSIDL_HISTORY); @@ -460,7 +449,6 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS"); m_ShellConstants.add("RESOURCES", CSIDL_RESOURCES, CSIDL_RESOURCES); m_ShellConstants.add("RESOURCES_LOCALIZED", CSIDL_RESOURCES_LOCALIZED, CSIDL_RESOURCES_LOCALIZED); m_ShellConstants.add("CDBURN_AREA", CSIDL_CDBURN_AREA, CSIDL_CDBURN_AREA); -#endif } int CEXEBuild::getcurdbsize() { return cur_datablock->getlen(); } @@ -537,61 +525,55 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A if ( *p ) { const char *pUserVarName = p; - while ( isSimpleChar(*pUserVarName) ) + while (isSimpleChar(*pUserVarName)) pUserVarName++; - while ( pUserVarName > p ) + while (pUserVarName > p) { -#ifdef NSIS_SUPPORT_SHELLFOLDERS_CONST - if ( m_ShellConstants.get((char*)p, pUserVarName-p) >= 0 ) - break; // Upps it's a shell constant -#endif + if (m_ShellConstants.get((char*)p, pUserVarName-p) >= 0) + break; // Upps it's a shell constant - int idxUserVar = m_UserVarNames.get((char*)p, pUserVarName-p); - if ( idxUserVar >= 0 ) - { - // Well, using variables inside string formating doens't mean - // using the variable, beacuse it will be always an empty string - // which is also memory wasting - // So the line below must be commented !?? - //m_UserVarNames.inc_reference(idxUserVar); - *out++=(unsigned int)VAR_CODES_START; // Named user variable; - *(WORD*)out=((WORD)idxUserVar+1) | 0xF000; - out += sizeof(WORD); - p += pUserVarName-p; - bProceced = true; - break; - } - pUserVarName--; + int idxUserVar = m_UserVarNames.get((char*)p, pUserVarName-p); + if (idxUserVar >= 0) + { + // Well, using variables inside string formating doens't mean + // using the variable, beacuse it will be always an empty string + // which is also memory wasting + // So the line below must be commented !?? + //m_UserVarNames.inc_reference(idxUserVar); + *out++ = (unsigned int) VAR_CODES_START; // Named user variable; + *(WORD*)out = (WORD) ((idxUserVar + 1) | 0x8000); + out += sizeof(WORD); + p += pUserVarName-p; + bProceced = true; + break; + } + pUserVarName--; } } -#ifdef NSIS_SUPPORT_SHELLFOLDERS_CONST - if ( !bProceced && *p ) + if (!bProceced && *p) { const char *pShellConstName = p; - while ( isSimpleChar(*pShellConstName) ) + while (isSimpleChar(*pShellConstName)) pShellConstName++; - while ( pShellConstName > p ) + while (pShellConstName > p) { - int idxConst = m_ShellConstants.get((char*)p, pShellConstName-p); - if ( idxConst >= 0 ) - { - int CSIDL_Value_current = m_ShellConstants.get_value1(idxConst); - int CSIDL_Value_all = m_ShellConstants.get_value2(idxConst); - *out++=(unsigned int)SHELL_CODES_START; // Constant code identifier - *(WORD*)out=((WORD)CSIDL_Value_current+1) | 0xF000; - out += sizeof(WORD); - *(WORD*)out=((WORD)CSIDL_Value_all+1) | 0xF000; - out += sizeof(WORD); - p += pShellConstName-p; - bProceced = true; - break; - } - pShellConstName--; + int idxConst = m_ShellConstants.get((char*)p, pShellConstName - p); + if (idxConst >= 0) + { + int CSIDL_Value_current = m_ShellConstants.get_value1(idxConst); + int CSIDL_Value_all = m_ShellConstants.get_value2(idxConst); + *out++=(unsigned int)SHELL_CODES_START; // Constant code identifier + *out++=(char)CSIDL_Value_current; + *out++=(char)CSIDL_Value_all; + p = pShellConstName; + bProceced = true; + break; + } + pShellConstName--; } } -#endif //NSIS_SUPPORT_SHELLFOLDERS_CONST if ( !bProceced && *p == '(' ) { int idx = -1; @@ -601,12 +583,12 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A { *pos = 0; idx = DefineLangString(cp); - if ( idx < 0 ) + if (idx < 0) { - *out++=(unsigned int)LANG_CODES_START; // Next word is lang-string Identifier - *(WORD*)out=(WORD)idx; + *out++ = (unsigned int)LANG_CODES_START; // Next word is lang-string Identifier + *(WORD*)out= (WORD) idx; out += sizeof(WORD); - p += strlen(cp)+2; + p += strlen(cp) + 2; bProceced = true; } } @@ -3211,13 +3193,11 @@ void CEXEBuild::close_res_editor() int CEXEBuild::DeclaredUserVar(const char *szVarName) { -#ifdef NSIS_SUPPORT_SHELLFOLDERS_CONST if ( m_ShellConstants.get((char*)szVarName) >= 0 ) { ERROR_MSG("Error: name \"%s\" in use by constant\n", szVarName); return PS_ERROR; } -#endif int idxUserVar = m_UserVarNames.get((char*)szVarName); if ( idxUserVar >= 0 ) @@ -3272,7 +3252,6 @@ int CEXEBuild::GetUserVarIndex(LineParser &line, int token) m_UserVarNames.inc_reference(idxUserVar); return idxUserVar; } -#ifdef NSIS_SUPPORT_SHELLFOLDERS_CONST else { int idxConst = m_ShellConstants.get((char *)p+1); @@ -3281,7 +3260,6 @@ int CEXEBuild::GetUserVarIndex(LineParser &line, int token) ERROR_MSG("Error: cannot change constants : %s\n", p); } } -#endif } return -1; } diff --git a/Source/build.h b/Source/build.h index 7aaacdc7..665a0b25 100644 --- a/Source/build.h +++ b/Source/build.h @@ -258,9 +258,7 @@ class CEXEBuild { int DeclaredUserVar(const char *VarName); void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList); -#ifdef NSIS_SUPPORT_SHELLFOLDERS_CONST ConstantsStringList m_ShellConstants; -#endif // a whole bunch O data. diff --git a/Source/exehead/Ui.c b/Source/exehead/Ui.c index 1a107329..fa3120de 100644 --- a/Source/exehead/Ui.c +++ b/Source/exehead/Ui.c @@ -807,7 +807,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar if (idlist) { // Get and free idlist - my_PIDL2Path(name, idlist, 1); + my_PIDL2Path(name, idlist); if (g_header->install_directory_auto_append) { diff --git a/Source/exehead/config.h b/Source/exehead/config.h index 4081b066..baeee928 100644 --- a/Source/exehead/config.h +++ b/Source/exehead/config.h @@ -216,9 +216,6 @@ // NSIS_FIX_DEFINES_IN_STRINGS fixes defines inside defines and handles chars $ perfectly // #define NSIS_FIX_DEFINES_IN_STRINGS -// NSIS_SUPPORT_SHELLFOLDERS_CONST enable support for common shell folder codes -#define NSIS_SUPPORT_SHELLFOLDERS_CONST - // NSIS_SUPPORT_STANDARD_PREDEFINES enables standard predefines in NSIS. // The defines enabled are: // __FILE__ - current script name diff --git a/Source/exehead/state.h b/Source/exehead/state.h index a3107773..3eb6a122 100644 --- a/Source/exehead/state.h +++ b/Source/exehead/state.h @@ -6,10 +6,10 @@ extern NSIS_STRING g_usrvars[TOTAL_COMPATIBLE_STATIC_VARS_COUNT]; #define state_exe_directory g_usrvars[23] #define state_language g_usrvars[24] #define state_temp_dir g_usrvars[25] -#define state_click_next g_usrvars[26] #ifdef NSIS_CONFIG_PLUGIN_SUPPORT -#define state_plugins_dir g_usrvars[27] +# define state_plugins_dir g_usrvars[26] #endif +#define state_click_next g_usrvars[28] extern char g_caption[NSIS_MAX_STRLEN*2]; #ifdef NSIS_CONFIG_VISIBLE_SUPPORT diff --git a/Source/exehead/util.c b/Source/exehead/util.c index 2661bc26..51444765 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -31,14 +31,15 @@ NSIS_STRING g_usrvars[TOTAL_COMPATIBLE_STATIC_VARS_COUNT]; #define INVALID_FILE_ATTRIBUTES ((DWORD)-1) #endif -int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl, int bFree) +int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl) { int Res; IMalloc *m; SHGetMalloc(&m); Res = SHGetPathFromIDList(idl, out); - if (m && bFree) + if (m) { + m->lpVtbl->Free(m, idl); m->lpVtbl->Release(m); } return Res; @@ -57,10 +58,10 @@ HANDLE NSISCALL myCreateProcess(char *cmd, char *dir) 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); -}*/ +} BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val) { @@ -457,24 +458,18 @@ int NSISCALL mystrlen(const char *in) char ps_tmpbuf[NSIS_MAX_STRLEN*2]; +#define SYSREGKEY "Software\\Microsoft\\Windows\\CurrentVersion" + // Based on Dave Laundon's simplified process_string char * NSISCALL GetNSISString(char *outbuf, int strtab) { -#ifdef NSIS_SUPPORT_SHELLFOLDERS_CONST - static char smwcvesf[]="Software\\Microsoft\\Windows\\CurrentVersion"; -#else - static char smwcvesf[]="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; -#endif - char *in = (char*)GetNSISStringNP(GetNSISTab(strtab)); - char *out; - if (outbuf >= ps_tmpbuf && outbuf < ps_tmpbuf+sizeof(ps_tmpbuf)) + char *out = ps_tmpbuf; + if ((unsigned int) (outbuf - ps_tmpbuf) < sizeof(ps_tmpbuf)) { out = outbuf; outbuf = 0; } - else - out = ps_tmpbuf; while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN) { int nVarIdx = (unsigned char)*in++; @@ -482,180 +477,101 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab) { *out++ = *in++; } -#ifdef NSIS_SUPPORT_SHELLFOLDERS_CONST else if (nVarIdx == SHELL_CODES_START) { - // NOTE 1: the code CSIDL_DESKTOP, is used for QUICKLAUNCH + // NOTE 1: the code CSIDL_PRINTERS, is used for QUICKLAUNCH // NOTE 2: the code CSIDL_BITBUCKET is used for COMMONFILES // NOTE 3: the code CSIDL_CONTROLS is used for PROGRAMFILES LPITEMIDLIST idl; - int qLaunch=0; - int nCreateFlag = CSIDL_FLAG_CREATE; - int nFolderCurUser; + char *append = 0; - nFolderCurUser = (*(WORD*)in & 0x0FFF)-1; // Read code for current user - in+=sizeof(WORD); - nVarIdx = nFolderCurUser; - if ( g_exec_flags.all_user_var ) + int fldrs[4] = { + in[0], // current user + in[0] | CSIDL_FLAG_CREATE, + in[1], // all users + in[1] | CSIDL_FLAG_CREATE + }; + + int x = 0; + + *out = 0; + + in += 2; + + if (fldrs[2] == CSIDL_PRINTERS) // QUICKLAUNCH { - nVarIdx = (*(WORD*)in & 0x0FFF)-1; // Use code for All users instead + append = "\\Microsoft\\Internet Explorer\\Quick Launch"; + x = 2; } - else - nFolderCurUser=-1; // Already using current user - - in+=sizeof(WORD); - - *out=0; - - while (TRUE) + if (fldrs[0] == CSIDL_PROGRAM_FILES_COMMON) { - switch ( nVarIdx ) + myRegGetStr(HKEY_LOCAL_MACHINE, SYSREGKEY, "CommonFilesDir", out); + } + if (fldrs[0] == CSIDL_PROGRAM_FILES) + { + myRegGetStr(HKEY_LOCAL_MACHINE, SYSREGKEY, "ProgramFilesDir", out); + if (!*out) + mystrcpy(out, "C:\\Program Files"); + } + if (fldrs[0] == CSIDL_SYSTEM) + { + GetSystemDirectory(out, NSIS_MAX_STRLEN); + } + if (fldrs[0] == CSIDL_WINDOWS) + { + GetWindowsDirectory(out, NSIS_MAX_STRLEN); + } + + if (!*out) + { + x = 4; + if (!g_exec_flags.all_user_var) + x = 2; + } + + while (x--) + { + if (!SHGetSpecialFolderLocation(g_hwnd, fldrs[x], &idl)) { - case CSIDL_BITBUCKET: // COMMONFILES - myRegGetStr(HKEY_LOCAL_MACHINE, smwcvesf, "CommonFilesDir", out); - break; - case CSIDL_CONTROLS: // PROGRAMFILES - myRegGetStr(HKEY_LOCAL_MACHINE, smwcvesf, "ProgramFilesDir", out); - if (!*out) - mystrcpy(out, "C:\\Program Files"); - break; - case CSIDL_DESKTOP: // QUICKLAUNCH - nVarIdx = CSIDL_APPDATA; - qLaunch = 1; - // dont break - default: - // Get and force path creation - if ( !SHGetSpecialFolderLocation(g_hwnd, nVarIdx | nCreateFlag, &idl) ) + if (my_PIDL2Path(out, idl)) { - if (my_PIDL2Path(out, idl, 1)) - { - if (qLaunch) - lstrcat(out,"\\Microsoft\\Internet Explorer\\Quick Launch"); - } - } - break; - } - - if ( *out ) - break; // Found something - - if ( nCreateFlag == 0 ) - { - if ( nFolderCurUser == -1 ) // Already dropped to current user??? break; - else - { - nVarIdx = nFolderCurUser; // Drop to current user if fail - nFolderCurUser = -1; } } else - nCreateFlag = 0; // remove create flag if it fails + *out=0; + } + + if (*out && append) + { + lstrcat(out, append); } validate_filename(out); - out+=mystrlen(out); + out += mystrlen(out); } -#endif else if (nVarIdx == VAR_CODES_START) { - nVarIdx = (*(WORD*)in & 0x0FFF)-1; in+=sizeof(WORD); - switch (nVarIdx) // The order of this list must match that in ..\strlist.cpp (err, build.cpp -J) - { -#ifndef NSIS_SUPPORT_SHELLFOLDERS_CONST - case 28: // PROGRAMFILES - smwcvesf[41]=0; - myRegGetStr(HKEY_LOCAL_MACHINE, smwcvesf, "ProgramFilesDir", out); - if (!*out) - mystrcpy(out, "C:\\Program Files"); - break; - - case 29: // SMPROGRAMS - case 30: // SMSTARTUP - case 31: // DESKTOP - case 32: // STARTMENU - case 33: // QUICKLAUNCH - { - DWORD f; - static const char *tab[]={ - "Programs", - "Startup", - "Desktop", - "Start Menu", - "AppData" - }; - static char name[20]="Common "; - const char *name_=tab[nVarIdx-29]; - mystrcpy(name+7,name_); - f=g_exec_flags.all_user_var & (nVarIdx != 33); - - again: - - smwcvesf[41]='\\'; - myRegGetStr(f?HKEY_LOCAL_MACHINE:HKEY_CURRENT_USER, - smwcvesf, - f?name:name_,out); - if (!out[0]) - { - if (f) - { - f=0; goto again; - } - mystrcpy(out,state_temp_dir); - } - - if (nVarIdx == 33) { - lstrcat(out, "\\Microsoft\\Internet Explorer\\Quick Launch"); - f = GetFileAttributes(out); - if (f != (DWORD)-1 && (f & FILE_ATTRIBUTE_DIRECTORY)) - break; - } - else break; - } - - case 34: // WINDIR - GetWindowsDirectory(out, NSIS_MAX_STRLEN); - break; - - case 35: // SYSDIR - GetSystemDirectory(out, NSIS_MAX_STRLEN); - break; - - case 36: // HWNDPARENT - myitoa(out, (unsigned int)g_hwnd); - break; - -#else // when NSIS_SUPPORT_SHELLFOLDERS_CONST is defined - - case 28: // WINDIR - GetWindowsDirectory(out, NSIS_MAX_STRLEN); - break; - - case 29: // SYSDIR - GetSystemDirectory(out, NSIS_MAX_STRLEN); - break; - - case 30: // HWNDPARENT - myitoa(out, (unsigned int)g_hwnd); - break; - -#endif - default: - mystrcpy(out, g_usrvars[nVarIdx]); - } // switch + nVarIdx = (*(WORD*)in - 1) & 0x7FFF; + in += sizeof(WORD); + if (nVarIdx == 27) // HWNDPARENT + myitoa(out, (unsigned int) g_hwnd); + else + mystrcpy(out, g_usrvars[nVarIdx]); // validate the directory name - if (nVarIdx > 20 && nVarIdx < TOTAL_COMPATIBLE_STATIC_VARS_COUNT && nVarIdx != 26) { - // only if not $0 to $R9, $CMDLINE or $_CLICK and not great than $HWNDPARENT - // ($LANGUAGE can't have trailing backslash anyway...) + if ((unsigned int)(nVarIdx - 21) < 6) { + // validate paths for $INSTDIR, $OUTDIR, $EXEDIR, $LANGUAGE, $TEMP and $PLUGINSDIR + // $LANGUAGE is just a number anyway... validate_filename(out); } - out+=mystrlen(out); + out += mystrlen(out); } // == VAR_CODES_START else if (nVarIdx == LANG_CODES_START) { - nVarIdx = *(short*)in; in+=sizeof(short); + nVarIdx = *(short*)in; + in += sizeof(short); GetNSISString(out, nVarIdx); - out+=mystrlen(out); + out += mystrlen(out); } else // Normal char { diff --git a/Source/exehead/util.h b/Source/exehead/util.h index ab1ba335..cf559469 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -14,10 +14,10 @@ int NSISCALL mystrlen(const char *in); char * NSISCALL mystrstr(char *a, char *b); WIN32_FIND_DATA * NSISCALL file_exists(char *buf); char * NSISCALL my_GetTempFileName(char *buf, const char *dir); -int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl, int bFree); +int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl); -//BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val); -#define my_SetWindowText SetWindowText +BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val); +//#define my_SetWindowText SetWindowText BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val); //int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size); #define my_GetWindowText GetWindowText