Back to former exehead overheads (zlib, bzip2 - 34, lzma - 34.5)
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3299 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
6542144aba
commit
c385a40332
7 changed files with 146 additions and 257 deletions
150
Source/build.cpp
150
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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue