Jim Park's Unicode NSIS merging - Step 2 : merge TCHARs changes into trunk

Compiler output is identical before & after this step

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6037 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
wizou 2010-03-26 17:18:17 +00:00
commit cdf7735a77
206 changed files with 8437 additions and 6403 deletions

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/22/2007
*/
#include "../Platform.h"
@ -34,7 +36,7 @@
extern HANDLE dbd_hFile;
#endif
char g_caption[NSIS_MAX_STRLEN*2];
TCHAR g_caption[NSIS_MAX_STRLEN*2];
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
HWND g_hwnd;
HANDLE g_hInstance;
@ -42,7 +44,7 @@ HANDLE g_hInstance;
void NSISCALL CleanUp();
char *ValidateTempDir()
TCHAR *ValidateTempDir()
{
validate_filename(state_temp_dir);
if (!validpathspec(state_temp_dir))
@ -55,16 +57,16 @@ char *ValidateTempDir()
void *g_SHGetFolderPath;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow)
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPTSTR lpszCmdParam, int nCmdShow)
{
int ret = 0;
const char *m_Err = _LANG_ERRORWRITINGTEMP;
const TCHAR *m_Err = _LANG_ERRORWRITINGTEMP;
int cl_flags = 0;
char *realcmds;
char seekchar=' ';
char *cmdline;
TCHAR *realcmds;
TCHAR seekchar=_T(' ');
TCHAR *cmdline;
InitCommonControls();
@ -88,7 +90,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
// Delete $PROGRAMFILES\shfolder.dll # can't be deleted, as the
// # new shfolder.dll is used
// # to find its own path.
g_SHGetFolderPath = myGetProcAddress(MGA_SHGetFolderPathA);
g_SHGetFolderPath = myGetProcAddress(MGA_SHGetFolderPath);
{
// workaround for bug #1008632
@ -108,7 +110,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
// of special folders (CSIDL_*).
SHFILEINFO shfi;
SHGetFileInfo("", 0, &shfi, sizeof(SHFILEINFO), 0);
SHGetFileInfo(_T(""), 0, &shfi, sizeof(SHFILEINFO), 0);
}
mystrcpy(g_caption,_LANG_GENERIC_ERROR);
@ -120,7 +122,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
#endif//NSIS_CONFIG_VISIBLE_SUPPORT
cmdline = state_command_line;
if (*cmdline == '\"') seekchar = *cmdline++;
if (*cmdline == _T('\"')) seekchar = *cmdline++;
cmdline=findchar(cmdline, seekchar);
cmdline=CharNext(cmdline);
@ -129,34 +131,34 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
while (*cmdline)
{
// skip over any spaces
while (*cmdline == ' ') cmdline++;
while (*cmdline == _T(' ')) cmdline++;
// get char we should look for to get the next parm
seekchar = ' ';
if (cmdline[0] == '\"')
seekchar = _T(' ');
if (cmdline[0] == _T('\"'))
{
cmdline++;
seekchar = '\"';
seekchar = _T('\"');
}
// is it a switch?
if (cmdline[0] == '/')
if (cmdline[0] == _T('/'))
{
cmdline++;
// this only works with spaces because they have just one bit on
#define END_OF_ARG(c) (((c)|' ')==' ')
#define END_OF_ARG(c) (((c)|_T(' '))==_T(' '))
#if defined(NSIS_CONFIG_VISIBLE_SUPPORT) && defined(NSIS_CONFIG_SILENT_SUPPORT)
if (cmdline[0] == 'S' && END_OF_ARG(cmdline[1]))
if (cmdline[0] == _T('S') && END_OF_ARG(cmdline[1]))
cl_flags |= FH_FLAGS_SILENT;
#endif//NSIS_CONFIG_SILENT_SUPPORT && NSIS_CONFIG_VISIBLE_SUPPORT
#ifdef NSIS_CONFIG_CRC_SUPPORT
if (*(LPDWORD)cmdline == CHAR4_TO_DWORD('N','C','R','C') && END_OF_ARG(cmdline[4]))
if (*(LPDWORD)cmdline == CHAR4_TO_DWORD(_T('N'),_T('C'),_T('R'),_T('C')) && END_OF_ARG(cmdline[4]))
cl_flags |= FH_FLAGS_NO_CRC;
#endif//NSIS_CONFIG_CRC_SUPPORT
if (*(LPDWORD)(cmdline-2) == CHAR4_TO_DWORD(' ', '/', 'D','='))
if (*(LPDWORD)(cmdline-2) == CHAR4_TO_DWORD(_T(' '), _T('/'), _T('D'),_T('=')))
{
*(LPDWORD)(cmdline-2)=0; // keep this from being passed to uninstaller if necessary
mystrcpy(state_install_directory,cmdline+2);
@ -167,7 +169,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
// skip over our parm
cmdline = findchar(cmdline, seekchar);
// skip the quote
if (*cmdline == '\"')
if (*cmdline == _T('\"'))
cmdline++;
}
@ -175,7 +177,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
if (!ValidateTempDir())
{
GetWindowsDirectory(state_temp_dir, NSIS_MAX_STRLEN - 5); // leave space for \Temp
mystrcat(state_temp_dir, "\\Temp");
mystrcat(state_temp_dir, _T("\\Temp"));
if (!ValidateTempDir())
{
goto end;
@ -189,11 +191,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (g_is_uninstaller)
{
char *p = findchar(state_command_line, 0);
TCHAR *p = findchar(state_command_line, 0);
// state_command_line has state_install_directory right after it in memory, so reading
// a bit over state_command_line won't do any harm
while (p >= state_command_line && *(LPDWORD)p != CHAR4_TO_DWORD(' ', '_', '?', '=')) p--;
while (p >= state_command_line && *(LPDWORD)p != CHAR4_TO_DWORD(_T(' '), _T('_'), _T('?'), _T('='))) p--;
m_Err = _LANG_UNINSTINITERROR;
@ -216,7 +218,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
{
int x;
mystrcat(state_temp_dir,"~nsu.tmp");
mystrcat(state_temp_dir,_T("~nsu.tmp"));
// check if already running from uninstaller temp dir
// this prevents recursive uninstaller calls
@ -230,11 +232,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam,
mystrcpy(state_install_directory,state_exe_directory);
mystrcpy(g_usrvars[0], realcmds);
*(LPWORD)g_usrvars[1] = CHAR2_TO_WORD('A',0);
*(LPWORD)g_usrvars[1] = CHAR2_TO_WORD(_T('A'),0);
for (x = 0; x < 26; x ++)
{
static char buf2[NSIS_MAX_STRLEN];
static TCHAR buf2[NSIS_MAX_STRLEN];
GetNSISString(buf2,g_header->str_uninstchild); // $TEMP\$1u_.exe
@ -301,7 +303,7 @@ end:
BOOL (WINAPI *LPV)(LPCTSTR,LPCTSTR,PLUID);
BOOL (WINAPI *ATP)(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD);
OPT=myGetProcAddress(MGA_OpenProcessToken);
LPV=myGetProcAddress(MGA_LookupPrivilegeValueA);
LPV=myGetProcAddress(MGA_LookupPrivilegeValue);
ATP=myGetProcAddress(MGA_AdjustTokenPrivileges);
if (OPT && LPV && ATP)
{

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/10/2007
*/
#include <windowsx.h>
@ -48,9 +50,9 @@ int g_quit_flag; // set when Quit has been called (meaning bail out ASAP)
int progress_bar_pos, progress_bar_len;
#if NSIS_MAX_STRLEN < 1024
static char g_tmp[4096];
static TCHAR g_tmp[4096];
#else
static char g_tmp[NSIS_MAX_STRLEN * 4];
static TCHAR g_tmp[NSIS_MAX_STRLEN * 4];
#endif
static int m_page=-1,m_retcode,m_delta;
@ -162,7 +164,7 @@ static BOOL NSISCALL _HandleStaticBkColor(UINT uMsg, WPARAM wParam, LPARAM lPara
#if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
void NSISCALL build_g_logfile()
{
mystrcat(addtrailingslash(mystrcpy(g_log_file,state_install_directory)),"install.log");
mystrcat(addtrailingslash(mystrcpy(g_log_file,state_install_directory)),_T("install.log"));
}
#endif
#endif
@ -177,6 +179,8 @@ static void NSISCALL set_language()
int lang_num;
int *selected_langtable=0;
// Jim Park: We are doing byte offsets to get to various data structures so
// no TCHARs here.
lang_again:
lang_num=g_blocks[NB_LANGTABLES].num;
while (lang_num--) {
@ -200,7 +204,7 @@ lang_again:
myitoa(state_language, *(LANGID*)language_table);
{
char *caption = GetNSISString(g_caption,LANG_CAPTION);
TCHAR *caption = GetNSISString(g_caption,LANG_CAPTION);
#ifdef NSIS_SUPPORT_BGBG
my_SetWindowText(m_bgwnd, caption);
#endif
@ -241,11 +245,11 @@ FORCE_INLINE int NSISCALL ui_doinstall(void)
}
else
{
static const char reg_9x_locale[] = "Control Panel\\Desktop\\ResourceLocale";
static const char reg_nt_locale_key[] = ".DEFAULT\\Control Panel\\International";
const char *reg_nt_locale_val = &reg_9x_locale[30]; // = "Locale" with opt
static const TCHAR reg_9x_locale[] = _T("Control Panel\\Desktop\\ResourceLocale");
static const TCHAR reg_nt_locale_key[] = _T(".DEFAULT\\Control Panel\\International");
const TCHAR *reg_nt_locale_val = &reg_9x_locale[30]; // = _T("Locale") with opt
*(DWORD*)state_language = CHAR4_TO_DWORD('0', 'x', 0, 0);
*(DWORD*)state_language = CHAR4_TO_DWORD(_T('0'), _T('x'), 0, 0);
{
// Windows 9x
@ -287,13 +291,13 @@ FORCE_INLINE int NSISCALL ui_doinstall(void)
);
if (ps_tmpbuf[0])
{
char *p=ps_tmpbuf;
char *e;
if (p[0]=='\"')
TCHAR *p=ps_tmpbuf;
TCHAR *e;
if (p[0]==_T('\"'))
{
char *p2;
TCHAR *p2;
p++;
p2 = findchar(p, '"');
p2 = findchar(p, _T('"'));
*p2 = 0;
}
// p is the path now, check for .exe extension
@ -302,7 +306,7 @@ FORCE_INLINE int NSISCALL ui_doinstall(void)
if (e > p)
{
// if filename ends in .exe, and is not a directory, remove the filename
if (!lstrcmpi(e, ".exe")) // check extension
if (!lstrcmpi(e, _T(".exe"))) // check extension
{
DWORD d;
d=GetFileAttributes(p);
@ -339,20 +343,20 @@ FORCE_INLINE int NSISCALL ui_doinstall(void)
#ifdef NSIS_SUPPORT_BGBG
if (header->bg_color1 != -1)
{
DWORD cn = CHAR4_TO_DWORD('_', 'N', 'b', 0);
DWORD cn = CHAR4_TO_DWORD(_T('_'), _T('N'), _T('b'), 0);
RECT vp;
extern LRESULT CALLBACK BG_WndProc(HWND, UINT, WPARAM, LPARAM);
wc.lpfnWndProc = BG_WndProc;
wc.hInstance = g_hInstance;
wc.hIcon = g_hIcon;
//wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.lpszClassName = (LPCSTR)&cn;
wc.lpszClassName = (LPCTSTR)&cn;
if (!RegisterClass(&wc)) return 0;
SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0);
m_bgwnd = CreateWindowEx(WS_EX_TOOLWINDOW,(LPCSTR)&cn,0,WS_POPUP,
m_bgwnd = CreateWindowEx(WS_EX_TOOLWINDOW,(LPCTSTR)&cn,0,WS_POPUP,
vp.left,vp.top,vp.right-vp.left,vp.bottom-vp.top,0,NULL,g_hInstance,NULL);
}
@ -378,10 +382,10 @@ FORCE_INLINE int NSISCALL ui_doinstall(void)
#ifdef NSIS_CONFIG_LICENSEPAGE
{ // load richedit DLL
static const char riched20[]="RichEd20";
static const char riched32[]="RichEd32";
static const char richedit20a[]="RichEdit20A";
static const char richedit[]="RichEdit";
static const TCHAR riched20[]=_T("RichEd20");
static const TCHAR riched32[]=_T("RichEd32");
static const TCHAR richedit20a[]=_T("RichEdit20A");
static const TCHAR richedit[]=_T("RichEdit");
if (!LoadLibrary(riched20))
{
LoadLibrary(riched32);
@ -434,9 +438,10 @@ FORCE_INLINE int NSISCALL ui_doinstall(void)
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
static int CALLBACK WINAPI BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
// lpData has the TCHAR* to 'dir'.
if (uMsg==BFFM_INITIALIZED)
{
my_GetDialogItemText(IDC_DIR,(char*)lpData);
my_GetDialogItemText(IDC_DIR,(TCHAR*)lpData);
SendMessage(hwnd,BFFM_SETSELECTION,(WPARAM)1,lpData);
}
if (uMsg==BFFM_SELCHANGED)
@ -445,7 +450,7 @@ static int CALLBACK WINAPI BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lPara
hwnd,
BFFM_ENABLEOK,
0,
SHGetPathFromIDList((LPITEMIDLIST)lParam,(char*)lpData)
SHGetPathFromIDList((LPITEMIDLIST)lParam,(TCHAR*)lpData)
#ifdef NSIS_SUPPORT_CODECALLBACKS
&& !ExecuteCallbackFunction(CB_ONVERIFYINSTDIR)
#endif
@ -710,7 +715,7 @@ skipPage:
static DWORD dwRead;
DWORD CALLBACK StreamLicense(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
lstrcpyn(pbBuff,(char*)dwCookie+dwRead,cb);
lstrcpyn(pbBuff,(TCHAR*)dwCookie+dwRead,cb);
*pcb=mystrlen(pbBuff);
dwRead+=*pcb;
return 0;
@ -724,7 +729,7 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
if (uMsg == WM_INITDIALOG)
{
char *l = (char *)GetNSISStringNP(GetNSISTab(this_page->parms[1]));
TCHAR *l = (TCHAR *)GetNSISStringNP(GetNSISTab(this_page->parms[1]));
int lt = *l;
EDITSTREAM es = {
(DWORD)(++l),
@ -778,7 +783,7 @@ static BOOL CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
if (tr.chrg.cpMax-tr.chrg.cpMin < sizeof(ps_tmpbuf)) {
SendMessage(hwLicense,EM_GETTEXTRANGE,0,(LPARAM)&tr);
SetCursor(LoadCursor(0, IDC_WAIT));
ShellExecute(hwndDlg,"open",tr.lpstrText,NULL,NULL,SW_SHOWNORMAL);
ShellExecute(hwndDlg,_T("open"),tr.lpstrText,NULL,NULL,SW_SHOWNORMAL);
SetCursor(LoadCursor(0, IDC_ARROW));
}
}
@ -835,7 +840,7 @@ static BOOL CALLBACK UninstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
static void NSISCALL SetSizeText(int dlgItem, int prefix, unsigned kb)
{
char scalestr[32], byte[32];
TCHAR scalestr[32], byte[32];
unsigned sh = 20;
int scale = LANG_GIGA;
@ -853,7 +858,7 @@ static void NSISCALL SetSizeText(int dlgItem, int prefix, unsigned kb)
wsprintf(
g_tmp + mystrlen(g_tmp),
#endif
"%u.%u%s%s",
_T("%u.%u%s%s"),
kb >> sh,
(((kb & 0x00FFFFFF) * 10) >> sh) % 10, // 0x00FFFFFF mask is used to
// prevent overflow that causes
@ -887,7 +892,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
{
static int dontsetdefstyle;
page *thispage = g_this_page;
char *dir = g_usrvars[thispage->parms[4]];
TCHAR *dir = g_usrvars[thispage->parms[4]];
int browse_text = thispage->parms[3];
if (uMsg == WM_NOTIFY_INIGO_MONTOYA)
{
@ -955,7 +960,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
}
if (id == IDC_BROWSE)
{
static char bt[NSIS_MAX_STRLEN];
static TCHAR bt[NSIS_MAX_STRLEN];
BROWSEINFO bi = {0,};
ITEMIDLIST *idlist;
bi.hwndOwner = hwndDlg;
@ -975,7 +980,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
if (g_header->install_directory_auto_append &&
dir == state_install_directory) // only append to $INSTDIR (bug #1174184)
{
const char *post_str = ps_tmpbuf;
const TCHAR *post_str = ps_tmpbuf;
GetNSISStringTT(g_header->install_directory_auto_append);
// display name gives just the folder name
if (lstrcmpi(post_str, g_tmp))
@ -995,7 +1000,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
}
if (uMsg == WM_IN_UPDATEMSG || uMsg == WM_NOTIFY_START)
{
static char s[NSIS_MAX_STRLEN];
static TCHAR s[NSIS_MAX_STRLEN];
int error = 0;
int available_set = 0;
unsigned total, available;
@ -1026,15 +1031,15 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
// Test for and use the GetDiskFreeSpaceEx API
{
BOOL (WINAPI *GDFSE)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) =
myGetProcAddress(MGA_GetDiskFreeSpaceExA);
BOOL (WINAPI *GDFSE)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) =
myGetProcAddress(MGA_GetDiskFreeSpaceEx);
if (GDFSE)
{
ULARGE_INTEGER available64;
ULARGE_INTEGER a, b;
char *p;
TCHAR *p;
WORD *pw = NULL;
while ((char *) pw != s) // trimslashtoend() cut the entire string
while ((TCHAR *) pw != s) // trimslashtoend() cut the entire string
{
if (GDFSE(s, &available64, &a, &b))
{
@ -1053,7 +1058,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
p = trimslashtoend(s); // trim last backslash
pw = (LPWORD) (p - 1);
*pw = CHAR2_TO_WORD('\\', 0); // bring it back, but make the next char null
*pw = CHAR2_TO_WORD(_T('\\'), 0); // bring it back, but make the next TCHAR null
}
}
}
@ -1061,7 +1066,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
if (!available_set)
{
DWORD spc, bps, fc, tc;
char *root;
TCHAR *root;
// GetDiskFreeSpaceEx accepts any path, but GetDiskFreeSpace accepts only the root
mystrcpy(s,dir);
@ -1087,7 +1092,7 @@ static BOOL CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
if (available_set)
SetSizeText(IDC_SPACEAVAILABLE,LANG_SPACE_AVAIL,available);
else
SetUITextNT(IDC_SPACEAVAILABLE,"");
SetUITextNT(IDC_SPACEAVAILABLE,_T(""));
}
g_exec_flags.instdir_error = error;
@ -1500,8 +1505,8 @@ static BOOL CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
#endif//NSIS_CONFIG_VISIBLE_SUPPORT
void NSISCALL update_status_text(int strtab, const char *text) {
static char tmp[NSIS_MAX_STRLEN*2];
void NSISCALL update_status_text(int strtab, const TCHAR *text) {
static TCHAR tmp[NSIS_MAX_STRLEN*2];
LVITEM new_item;
HWND linsthwnd = insthwnd;
if (linsthwnd)
@ -1567,7 +1572,7 @@ static DWORD WINAPI install_thread(LPVOID p)
if (s->flags&SF_SELECTED)
#endif
{
log_printf2("Section: \"%s\"",s->name);
log_printf2(_T("Section: \"%s\""),s->name);
if (ExecuteCodeSegment(s->code,progresswnd))
{
g_exec_flags.abort++;
@ -1577,7 +1582,7 @@ static DWORD WINAPI install_thread(LPVOID p)
#ifdef NSIS_CONFIG_COMPONENTPAGE
else
{
log_printf2("Skipping section: \"%s\"",s->name);
log_printf2(_T("Skipping section: \"%s\""),s->name);
}
#endif
s++;
@ -1611,7 +1616,7 @@ static BOOL CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
progress_bar_len=sumsecsfield(code_size);
progress_bar_pos=0;
log_printf3("New install of \"%s\" to \"%s\"",GetNSISStringTT(LANG_NAME),state_install_directory);
log_printf3(_T("New install of \"%s\" to \"%s\""),GetNSISStringTT(LANG_NAME),state_install_directory);
GetClientRect(linsthwnd, &r);
lvc.cx = r.right - GetSystemMetrics(SM_CXHSCROLL);
@ -1718,14 +1723,14 @@ static BOOL CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
// Clipboard MSDN docs say mem must be GMEM_MOVEABLE
OpenClipboard(0);
EmptyClipboard();
memory = GlobalAlloc(GHND,total);
memory = GlobalAlloc(GHND,total*sizeof(TCHAR));
ptr = GlobalLock(memory);
//endPtr = ptr+total-2; // -2 to allow for CR/LF
i = 0;
do {
item.pszText = ptr;
ptr += SendMessage(linsthwnd,LVM_GETITEMTEXT,i,(LPARAM)&item);
*(WORD*)ptr = CHAR2_TO_WORD('\r','\n');
*(WORD*)ptr = CHAR2_TO_WORD(_T('\r'),_T('\n'));
ptr+=2;
} while (++i < count);
// memory is auto zeroed when allocated with GHND - *ptr = 0;

View file

@ -64,7 +64,7 @@ typedef struct
typedef struct {
exec_flags_t *exec_flags;
int (NSISCALL *ExecuteCodeSegment)(int, HWND);
void (NSISCALL *validate_filename)(char *);
void (NSISCALL *validate_filename)(TCHAR *);
int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors
} extra_parameters;

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Reviewed for Unicode support by Jim Park -- 08/22/2007
*/
#include "../Platform.h"

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Reviewed for Unicode support by Jim Park -- 08/22/2007
*/
#include "../Platform.h"

View file

@ -12,6 +12,9 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
*
* Reviewed for Unicode support by Jim Park -- 08/22/2007
*/
#ifndef ___COMPONENTS_H___

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Reviewed for Unicode support by Jim Park -- 08/22/2007
*/
#ifndef NSIS_CONFIG_H

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/13/2007
*/
#include "../Platform.h"
@ -27,6 +29,7 @@
#include "lang.h"
#include "resource.h"
#include "api.h"
#include "../tchar.h"
#define EXEC_ERROR 0x7FFFFFFF
@ -37,7 +40,7 @@ HWND g_SectionHack;
#ifdef NSIS_SUPPORT_STACK
typedef struct _stack_t {
struct _stack_t *next;
char text[NSIS_MAX_STRLEN];
TCHAR text[NSIS_MAX_STRLEN];
} stack_t;
static stack_t *g_st;
@ -59,6 +62,11 @@ HRESULT g_hres;
static int NSISCALL ExecuteEntry(entry *entry_);
/**
* If v is negative, then the address to resolve is actually
* stored in the global user variables. Convert the value
* to integer and return.
*/
int NSISCALL resolveaddr(int v)
{
if (v < 0)
@ -107,7 +115,7 @@ int NSISCALL ExecuteCallbackFunction(int num)
#endif
static char bufs[5][NSIS_MAX_STRLEN];
static TCHAR bufs[5][NSIS_MAX_STRLEN];
static int *parms;
void NSISCALL update_status_text_buf1(int strtab)
@ -123,10 +131,14 @@ static int NSISCALL GetIntFromParm(int id_)
// 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.
// Use a negative number to get the string validated as a file name
static char * NSISCALL GetStringFromParm(int id_)
// Note: Calling GetNSISString has the side effect that the buffer holding
// the string to expand gets modified.
// When calling this function with numbers like 0x13, it means create the string
// from the string ID found in entry.offset[3] and put it into bufs[0].
static TCHAR * NSISCALL GetStringFromParm(int id_)
{
int id = id_ < 0 ? -id_ : id_;
char *result = GetNSISString(bufs[id >> 4], parms[id & 0xF]);
TCHAR *result = GetNSISString(bufs[id >> 4], parms[id & 0xF]);
if (id_ < 0) validate_filename(result);
return result;
}
@ -145,7 +157,7 @@ static LONG NSISCALL myRegDeleteKeyEx(HKEY thiskey, LPCTSTR lpSubKey, int onlyif
if (retval==ERROR_SUCCESS)
{
// NB - don't change this to static (recursive function)
char buffer[MAX_PATH+1];
TCHAR buffer[MAX_PATH+1];
while (RegEnumKey(key,0,buffer,MAX_PATH+1)==ERROR_SUCCESS)
{
if (onlyifempty)
@ -157,9 +169,9 @@ static LONG NSISCALL myRegDeleteKeyEx(HKEY thiskey, LPCTSTR lpSubKey, int onlyif
}
RegCloseKey(key);
{
typedef LONG (WINAPI * RegDeleteKeyExAPtr)(HKEY, LPCTSTR, REGSAM, DWORD);
RegDeleteKeyExAPtr RDKE = (RegDeleteKeyExAPtr)
myGetProcAddress(MGA_RegDeleteKeyExA);
typedef LONG (WINAPI * RegDeleteKeyExPtr)(HKEY, LPCTSTR, REGSAM, DWORD);
RegDeleteKeyExPtr RDKE = (RegDeleteKeyExPtr)
myGetProcAddress(MGA_RegDeleteKeyEx);
if (RDKE)
retval=RDKE(thiskey,lpSubKey,AlterRegistrySAM(0),0);
@ -195,14 +207,14 @@ static HKEY NSISCALL myRegOpenKey(REGSAM samDesired)
// otherwise, returns new_position+1
static int NSISCALL ExecuteEntry(entry *entry_)
{
char *buf0 = bufs[0];
char *buf1 = bufs[1];
char *buf2 = bufs[2];
char *buf3 = bufs[3];
TCHAR *buf0 = bufs[0];
TCHAR *buf1 = bufs[1];
TCHAR *buf2 = bufs[2];
TCHAR *buf3 = bufs[3];
//char *buf4 = bufs[4];
char *var0;
char *var1;
TCHAR *var0;
TCHAR *var1;
//char *var2;
//char *var3;
//char *var4;
@ -239,11 +251,11 @@ static int NSISCALL ExecuteEntry(entry *entry_)
switch (which)
{
case EW_NOP:
log_printf2("Jump: %d",parm0);
log_printf2(_T("Jump: %d"),parm0);
return parm0;
case EW_ABORT:
{
log_printf2("Aborting: \"%s\"",GetStringFromParm(0x00));
log_printf2(_T("Aborting: \"%s\""),GetStringFromParm(0x00));
update_status_text(parm0,0);
}
return EXEC_ERROR;
@ -254,23 +266,23 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_CALL:
{
int v=resolveaddr(parm0)-1; // address is -1, since we encode it as +1
log_printf2("Call: %d",v);
log_printf2(_T("Call: %d"),v);
return ExecuteCodeSegment(v,NULL);
}
case EW_UPDATETEXT:
log_printf2("detailprint: %s",GetStringFromParm(0x00));
log_printf2(_T("detailprint: %s"),GetStringFromParm(0x00));
update_status_text(parm0,0);
break;
case EW_SLEEP:
{
int x=GetIntFromParm(0);
log_printf2("Sleep(%d)",x);
log_printf2(_T("Sleep(%d)"),x);
Sleep(max(x,1));
}
break;
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
case EW_BRINGTOFRONT:
log_printf("BringToFront");
log_printf(_T("BringToFront"));
SetForegroundWindow(g_hwnd);
break;
#endif//NSIS_CONFIG_VISIBLE_SUPPORT
@ -302,44 +314,44 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#endif//NSIS_CONFIG_VISIBLE_SUPPORT
case EW_SETFILEATTRIBUTES:
{
char *buf1=GetStringFromParm(-0x10);
log_printf3("SetFileAttributes: \"%s\":%08X",buf1,parm1);
TCHAR *buf1=GetStringFromParm(-0x10);
log_printf3(_T("SetFileAttributes: \"%s\":%08X"),buf1,parm1);
if (!SetFileAttributes(buf1,parm1))
{
exec_error++;
log_printf("SetFileAttributes failed.");
log_printf(_T("SetFileAttributes failed."));
}
}
break;
case EW_CREATEDIR: {
char *buf1=GetStringFromParm(-0x10);
log_printf3("CreateDirectory: \"%s\" (%d)",buf1,parm1);
TCHAR *buf1=GetStringFromParm(-0x10);
log_printf3(_T("CreateDirectory: \"%s\" (%d)"),buf1,parm1);
{
char *p = skip_root(buf1);
char c = 'c';
TCHAR *p = skip_root(buf1);
TCHAR c = _T('c');
if (p)
{
while (c)
{
p = findchar(p, '\\');
p = findchar(p, _T('\\'));
c = *p;
*p = 0;
if (!CreateDirectory(buf1, NULL))
{
if (GetLastError() != ERROR_ALREADY_EXISTS)
{
log_printf3("CreateDirectory: can't create \"%s\" (err=%d)",buf1,GetLastError());
{
log_printf3(_T("CreateDirectory: can't create \"%s\" (err=%d)"),buf1,GetLastError());
exec_error++;
}
else if ((GetFileAttributes(buf1) & FILE_ATTRIBUTE_DIRECTORY) == 0)
{
log_printf2("CreateDirectory: can't create \"%s\" - a file already exists",buf1);
log_printf2(_T("CreateDirectory: can't create \"%s\" - a file already exists"),buf1);
exec_error++;
}
}
else
{
log_printf2("CreateDirectory: \"%s\" created",buf1);
log_printf2(_T("CreateDirectory: \"%s\" created"),buf1);
}
*p++ = c;
}
@ -360,22 +372,22 @@ static int NSISCALL ExecuteEntry(entry *entry_)
break;
case EW_IFFILEEXISTS:
{
char *buf0=GetStringFromParm(0x00);
TCHAR *buf0=GetStringFromParm(0x00);
if (file_exists(buf0))
{
log_printf3("IfFileExists: file \"%s\" exists, jumping %d",buf0,parm1);
log_printf3(_T("IfFileExists: file \"%s\" exists, jumping %d"),buf0,parm1);
return parm1;
}
log_printf3("IfFileExists: file \"%s\" does not exist, jumping %d",buf0,parm2);
log_printf3(_T("IfFileExists: file \"%s\" does not exist, jumping %d"),buf0,parm2);
}
return parm2;
#ifdef NSIS_SUPPORT_RENAME
case EW_RENAME:
{
char *buf3=GetStringFromParm(-0x30);
char *buf2=GetStringFromParm(-0x21);
char *buf1=GetStringFromParm(0x13);
log_printf2("Rename: %s",buf1);
TCHAR *buf3=GetStringFromParm(-0x30);
TCHAR *buf2=GetStringFromParm(-0x21);
TCHAR *buf1=GetStringFromParm(0x13);
log_printf2(_T("Rename: %s"),buf1);
if (MoveFile(buf3,buf2))
{
update_status_text_buf1(LANG_RENAME);
@ -387,13 +399,13 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
MoveFileOnReboot(buf3,buf2);
update_status_text_buf1(LANG_RENAMEONREBOOT);
log_printf2("Rename on reboot: %s",buf1);
log_printf2(_T("Rename on reboot: %s"),buf1);
}
else
#endif
{
exec_error++;
log_printf2("Rename failed: %s",buf1);
log_printf2(_T("Rename failed: %s"),buf1);
}
}
}
@ -402,9 +414,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_FNUTIL
case EW_GETFULLPATHNAME:
{
char *fp;
char *p=var1;
char *buf0=GetStringFromParm(0x00);
TCHAR *fp;
TCHAR *p=var1;
TCHAR *buf0=GetStringFromParm(0x00);
if (!GetFullPathName(buf0,NSIS_MAX_STRLEN,p,&fp))
{
exec_error++;
@ -428,9 +440,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
break;
case EW_SEARCHPATH:
{
char *fp;
char *p=var0;
char *buf0=GetStringFromParm(-0x01);
TCHAR *fp;
TCHAR *p=var0;
TCHAR *buf0=GetStringFromParm(-0x01);
if (!SearchPath(NULL,buf0,NULL,NSIS_MAX_STRLEN,p,&fp))
{
exec_error++;
@ -440,7 +452,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
break;
case EW_GETTEMPFILENAME:
{
char *textout=var0;
TCHAR *textout=var0;
if (!my_GetTempFileName(textout, GetStringFromParm(-0x11)))
exec_error++;
}
@ -451,10 +463,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
HANDLE hOut;
int ret;
char *buf3 = GetStringFromParm(0x31);
TCHAR *buf3 = GetStringFromParm(0x31);
int overwriteflag = parm0 & 7;
log_printf4("File: overwriteflag=%d, allowskipfilesflag=%d, name=\"%s\"",overwriteflag,(parm0>>3)&MB_ABORTRETRYIGNORE,buf3);
log_printf4(_T("File: overwriteflag=%d, allowskipfilesflag=%d, name=\"%s\""),overwriteflag,(parm0>>3)&MB_ABORTRETRYIGNORE,buf3);
if (validpathspec(buf3))
{
mystrcpy(buf0,buf3);
@ -485,10 +497,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
update_status_text(LANG_SKIPPED,buf3);
if (overwriteflag==2) exec_error++;
log_printf3("File: skipped: \"%s\" (overwriteflag=%d)",buf0,overwriteflag);
log_printf3(_T("File: skipped: \"%s\" (overwriteflag=%d)"),buf0,overwriteflag);
break;
}
log_printf2("File: error creating \"%s\"",buf0);
log_printf2(_T("File: error creating \"%s\""),buf0);
mystrcpy(buf2,g_usrvars[0]); // save $0
mystrcpy(g_usrvars[0],buf0); // copy file name to $0
@ -499,14 +511,14 @@ static int NSISCALL ExecuteEntry(entry *entry_)
switch (my_MessageBox(buf1, parm0>>3))
{
case IDRETRY:
log_printf("File: error, user retry");
log_printf(_T("File: error, user retry"));
goto _tryagain;
case IDIGNORE:
log_printf("File: error, user cancel");
log_printf(_T("File: error, user cancel"));
g_exec_flags.exec_error++;
return 0;
default:
log_printf("File: error, user abort");
log_printf(_T("File: error, user abort"));
update_status_text(LANG_CANTWRITE,buf0);
return EXEC_ERROR;
}
@ -519,7 +531,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
g_exec_flags.status_update--;
}
log_printf3("File: wrote %d to \"%s\"",ret,buf0);
log_printf3(_T("File: wrote %d to \"%s\""),ret,buf0);
if (parm3 != 0xffffffff || parm4 != 0xffffffff)
SetFileTime(hOut,(FILETIME*)(lent.offsets+3),NULL,(FILETIME*)(lent.offsets+3));
@ -537,7 +549,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
GetNSISString(buf0,LANG_ERRORDECOMPRESSING);
}
log_printf2("%s",buf0);
log_printf2(_T("%s"),buf0);
my_MessageBox(buf0,MB_OK|MB_ICONSTOP|(IDOK<<21));
return EXEC_ERROR;
}
@ -547,8 +559,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_DELETE
case EW_DELETEFILE:
{
char *buf0=GetStringFromParm(0x00);
log_printf2("Delete: \"%s\"",buf0);
TCHAR *buf0=GetStringFromParm(0x00);
log_printf2(_T("Delete: \"%s\""),buf0);
myDelete(buf0,parm1);
}
break;
@ -557,8 +569,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_MESSAGEBOX: // MessageBox
{
int v;
char *buf3=GetStringFromParm(0x31);
log_printf3("MessageBox: %d,\"%s\"",parm0,buf3);
TCHAR *buf3=GetStringFromParm(0x31);
log_printf3(_T("MessageBox: %d,\"%s\""),parm0,buf3);
v=my_MessageBox(buf3,parm0);
if (v)
{
@ -578,8 +590,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_RMDIR
case EW_RMDIR:
{
char *buf1=GetStringFromParm(-0x10);
log_printf2("RMDir: \"%s\"",buf1);
TCHAR *buf1=GetStringFromParm(-0x10);
log_printf2(_T("RMDir: \"%s\""),buf1);
myDelete(buf1,parm1);
}
@ -588,7 +600,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_STROPTS
case EW_STRLEN:
{
char *buf0=GetStringFromParm(0x01);
TCHAR *buf0=GetStringFromParm(0x01);
myitoa(var0,mystrlen(buf0));
}
break;
@ -597,8 +609,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
int newlen=GetIntFromParm(2);
int start=GetIntFromParm(3);
int l;
char *p=var0;
char *buf0=GetStringFromParm(0x01);
TCHAR *p=var0;
TCHAR *buf0=GetStringFromParm(0x01);
*p=0;
if (!parm2 || newlen)
{
@ -621,8 +633,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
break;
case EW_STRCMP:
{
char *buf2=GetStringFromParm(0x20);
char *buf3=GetStringFromParm(0x31);
TCHAR *buf2=GetStringFromParm(0x20);
TCHAR *buf3=GetStringFromParm(0x31);
if (!parm4) {
// case insensitive
if (!lstrcmpi(buf2,buf3)) return parm2;
@ -637,8 +649,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_ENVIRONMENT
case EW_READENVSTR:
{
char *p=var0;
char *buf0=GetStringFromParm(0x01);
TCHAR *p=var0;
TCHAR *buf0=GetStringFromParm(0x01);
if (!ExpandEnvironmentStrings(buf0,p,NSIS_MAX_STRLEN)
|| (parm2 && !lstrcmp(buf0, p)))
{
@ -670,7 +682,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_INTOP:
{
int v,v2;
char *p=var0;
TCHAR *p=var0;
v=GetIntFromParm(1);
v2=GetIntFromParm(2);
switch (parm3)
@ -693,7 +705,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
break;
case EW_INTFMT: {
char *buf0=GetStringFromParm(0x01);
TCHAR *buf0=GetStringFromParm(0x01);
wsprintf(var0,
buf0,
GetIntFromParm(2));
@ -710,7 +722,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
while (cnt--&&s) s=s->next;
if (!s)
{
log_printf2("Exch: stack < %d elements",parm2);
log_printf2(_T("Exch: stack < %d elements"),parm2);
my_MessageBox(GetNSISStringTT(LANG_INSTCORRUPTED),MB_OK|MB_ICONSTOP|(IDOK<<21));
return EXEC_ERROR;
}
@ -722,7 +734,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
if (!s)
{
log_printf("Pop: stack empty");
log_printf(_T("Pop: stack empty"));
exec_error++;
break;
}
@ -756,12 +768,15 @@ static int NSISCALL ExecuteEntry(entry *entry_)
int msg=GetIntFromParm(2);
if (parm5>>2) exec_error += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(LPDWORD)&v);
// Jim Park: This sends script messages. Some messages require
// settings for Unicode. This means the user's script may need
// to change for Unicode NSIS.
else v=SendMessage(hwnd,msg,b3,b4);
}
else
{
char *buf0=GetStringFromParm(0x01);
char *buf1=GetStringFromParm(0x12);
TCHAR *buf0=GetStringFromParm(0x01);
TCHAR *buf1=GetStringFromParm(0x12);
v=(int)FindWindowEx((HWND)b3,(HWND)b4,buf0[0]?buf0:NULL,buf1[0]?buf1:NULL);
}
@ -829,7 +844,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
HWND hw=(HWND)GetIntFromParm(0);
int a=GetIntFromParm(1);
if (parm2) log_printf("HideWindow");
if (parm2) log_printf(_T("HideWindow"));
if (!parm3)
ShowWindow(hw,a);
else
@ -842,20 +857,20 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_SHELLEXEC: // this uses improvements of Andras Varga
{
int x;
char *buf0=GetStringFromParm(0x00);
char *buf3=GetStringFromParm(0x31);
char *buf2=GetStringFromParm(0x22);
char *buf1=GetStringFromParm(0x15);
TCHAR *buf0=GetStringFromParm(0x00);
TCHAR *buf3=GetStringFromParm(0x31);
TCHAR *buf2=GetStringFromParm(0x22);
TCHAR *buf1=GetStringFromParm(0x15);
update_status_text_buf1(LANG_EXECSHELL);
x=(int)ShellExecute(g_hwnd,buf0[0]?buf0:NULL,buf3,buf2[0]?buf2:NULL,state_output_directory,parm3);
if (x < 33)
{
log_printf5("ExecShell: warning: error (\"%s\": file:\"%s\" params:\"%s\")=%d",buf0,buf3,buf2,x);
log_printf5(_T("ExecShell: warning: error (\"%s\": file:\"%s\" params:\"%s\")=%d"),buf0,buf3,buf2,x);
exec_error++;
}
else
{
log_printf4("ExecShell: success (\"%s\": file:\"%s\" params:\"%s\")",buf0,buf3,buf2);
log_printf4(_T("ExecShell: success (\"%s\": file:\"%s\" params:\"%s\")"),buf0,buf3,buf2);
}
}
break;
@ -864,15 +879,15 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_EXECUTE:
{
HANDLE hProc;
char *buf0=GetStringFromParm(0x00);
log_printf2("Exec: command=\"%s\"",buf0);
TCHAR *buf0=GetStringFromParm(0x00);
log_printf2(_T("Exec: command=\"%s\""),buf0);
update_status_text(LANG_EXECUTE,buf0);
hProc=myCreateProcess(buf0);
if (hProc)
{
log_printf2("Exec: success (\"%s\")",buf0);
log_printf2(_T("Exec: success (\"%s\")"),buf0);
if (parm2)
{
DWORD lExitCode;
@ -890,7 +905,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
else
{
exec_error++;
log_printf2("Exec: failed createprocess (\"%s\")",buf0);
log_printf2(_T("Exec: failed createprocess (\"%s\")"),buf0);
}
}
break;
@ -902,9 +917,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
// also allows GetFileTime to be passed a wildcard.
{
WIN32_FIND_DATA *ffd;
char *highout=var0;
char *lowout=var1;
char *buf0=GetStringFromParm(0x02);
TCHAR *highout=var0;
TCHAR *lowout=var1;
TCHAR *buf0=GetStringFromParm(0x02);
ffd=file_exists(buf0);
if (ffd)
@ -923,12 +938,12 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_GETDLLVERSION
case EW_GETDLLVERSION:
{
char *highout=var0;
char *lowout=var1;
TCHAR *highout=var0;
TCHAR *lowout=var1;
DWORD s1;
VS_FIXEDFILEINFO *pvsf1;
DWORD d;
char *buf1=GetStringFromParm(-0x12);
TCHAR *buf1=GetStringFromParm(-0x12);
s1=GetFileVersionInfoSize(buf1,&d);
*lowout=*highout=0;
exec_error++;
@ -939,7 +954,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (b1)
{
UINT uLen;
if (GetFileVersionInfo(buf1,0,s1,b1) && VerQueryValue(b1,"\\",(void*)&pvsf1,&uLen))
if (GetFileVersionInfo(buf1,0,s1,b1) && VerQueryValue(b1,_T("\\"),(void*)&pvsf1,&uLen))
{
myitoa(highout,pvsf1->dwFileVersionMS);
myitoa(lowout,pvsf1->dwFileVersionLS);
@ -959,8 +974,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (SUCCEEDED(g_hres))
{
HANDLE h=NULL;
char *buf1=GetStringFromParm(-0x10);
char *buf0=GetStringFromParm(0x01);
TCHAR *buf1=GetStringFromParm(-0x10);
TCHAR *buf0=GetStringFromParm(0x01);
if (parm4)
h=GetModuleHandle(buf1);
@ -979,12 +994,12 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
else
{
void (*func)(HWND,int,char*,void*,void*);
void (*func)(HWND,int,TCHAR*,void*,void*);
func=(void*)funke;
func(
g_hwnd,
NSIS_MAX_STRLEN,
(char*)g_usrvars,
(TCHAR*)g_usrvars,
#ifdef NSIS_SUPPORT_STACK
(void*)&g_st,
#else
@ -997,20 +1012,20 @@ static int NSISCALL ExecuteEntry(entry *entry_)
else
{
update_status_text(LANG_CANNOTFINDSYMBOL,buf0);
log_printf3("Error registering DLL: %s not found in %s",buf0,buf1);
log_printf3(_T("Error registering DLL: %s not found in %s"),buf0,buf1);
}
if (!parm3 && Plugins_CanUnload(h)) FreeLibrary(h);
}
else
{
update_status_text_buf1(LANG_COULDNOTLOAD);
log_printf2("Error registering DLL: Could not load %s",buf1);
log_printf2(_T("Error registering DLL: Could not load %s"),buf1);
}
}
else
{
update_status_text_buf1(LANG_NOOLE);
log_printf("Error registering DLL: Could not initialize OLE");
log_printf(_T("Error registering DLL: Could not initialize OLE"));
}
}
break;
@ -1018,11 +1033,11 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_CREATESHORTCUT
case EW_CREATESHORTCUT:
{
char *buf1=GetStringFromParm(-0x10);
char *buf2=GetStringFromParm(-0x21);
char *buf0=GetStringFromParm(0x02);
char *buf3=GetStringFromParm(-0x33);
char *buf4=GetStringFromParm(0x45);
TCHAR *buf1=GetStringFromParm(-0x10);
TCHAR *buf2=GetStringFromParm(-0x21);
TCHAR *buf0=GetStringFromParm(0x02);
TCHAR *buf3=GetStringFromParm(-0x33);
TCHAR *buf4=GetStringFromParm(0x45);
HRESULT hres;
IShellLink* psl;
@ -1030,7 +1045,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (!validpathspec(buf2))
GetStringFromParm(0x21);
log_printf8("CreateShortCut: out: \"%s\", in: \"%s %s\", icon: %s,%d, sw=%d, hk=%d",
log_printf8(_T("CreateShortCut: out: \"%s\", in: \"%s %s\", icon: %s,%d, sw=%d, hk=%d"),
buf1,buf2,buf0,buf3,parm4&0xff,(parm4&0xff00)>>8,parm4>>16);
hres = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
@ -1079,10 +1094,10 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
int res;
SHFILEOPSTRUCT op;
char *buf0=GetStringFromParm(0x00);
char *buf1=GetStringFromParm(0x11);
char *buf2=GetStringFromParm(0x23); // LANG_COPYTO + buf1
log_printf3("CopyFiles \"%s\"->\"%s\"",buf0,buf1);
TCHAR *buf0=GetStringFromParm(0x00);
TCHAR *buf1=GetStringFromParm(0x11);
TCHAR *buf2=GetStringFromParm(0x23); // LANG_COPYTO + buf1
log_printf3(_T("CopyFiles \"%s\"->\"%s\""),buf0,buf1);
if (!file_exists(buf0))
{
@ -1131,9 +1146,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_INIFILES
case EW_WRITEINI:
{
char *sec=0, *key=0, *str=0;
TCHAR *sec=0, *key=0, *str=0;
#ifdef NSIS_CONFIG_LOG
mystrcpy(buf1,"<RM>");
mystrcpy(buf1,_T("<RM>"));
mystrcpy(buf2,buf1);
#endif
if (parm0)
@ -1149,18 +1164,18 @@ static int NSISCALL ExecuteEntry(entry *entry_)
str=GetStringFromParm(0x22);
}
buf3=GetStringFromParm(-0x33);
log_printf5("WriteINIStr: wrote [%s] %s=%s in %s",buf0,buf1,buf2,buf3);
log_printf5(_T("WriteINIStr: wrote [%s] %s=%s in %s"),buf0,buf1,buf2,buf3);
if (!WritePrivateProfileString(sec,key,str,buf3)) exec_error++;
}
break;
case EW_READINISTR:
{
DWORD errstr = CHAR4_TO_DWORD('!', 'N', '~', 0);
char *p=var0;
char *buf0=GetStringFromParm(0x01);
char *buf1=GetStringFromParm(0x12);
char *buf2=GetStringFromParm(-0x23);
GetPrivateProfileString(buf0,buf1,(LPCSTR)&errstr,p,NSIS_MAX_STRLEN-1,buf2);
DWORD errstr = CHAR4_TO_DWORD(_T('!'), _T('N'), _T('~'), 0);
TCHAR *p=var0;
TCHAR *buf0=GetStringFromParm(0x01);
TCHAR *buf1=GetStringFromParm(0x12);
TCHAR *buf2=GetStringFromParm(-0x23);
GetPrivateProfileString(buf0,buf1,(LPCTSTR)&errstr,p,NSIS_MAX_STRLEN-1,buf2);
if (*(DWORD*)p == errstr)
{
exec_error++;
@ -1173,22 +1188,22 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_DELREG:
{
long res=!ERROR_SUCCESS;
const char *rkn UNUSED=RegKeyHandleToName((HKEY)parm1);
const TCHAR *rkn UNUSED=RegKeyHandleToName((HKEY)parm1);
if (!parm4)
{
HKEY hKey=myRegOpenKey(KEY_SET_VALUE);
if (hKey)
{
char *buf3=GetStringFromParm(0x33);
TCHAR *buf3=GetStringFromParm(0x33);
res = RegDeleteValue(hKey,buf3);
log_printf4("DeleteRegValue: \"%s\\%s\" \"%s\"",rkn,buf2,buf3);
log_printf4(_T("DeleteRegValue: \"%s\\%s\" \"%s\""),rkn,buf2,buf3);
RegCloseKey(hKey);
}
}
else
{
char *buf2=GetStringFromParm(0x22);
log_printf3("DeleteRegKey: \"%s\\%s\"",rkn,buf2);
TCHAR *buf2=GetStringFromParm(0x22);
log_printf3(_T("DeleteRegKey: \"%s\\%s\""),rkn,buf2);
res = myRegDeleteKeyEx(GetRegRootKey(parm1),buf2,parm4&2);
}
if (res != ERROR_SUCCESS)
@ -1201,9 +1216,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
HKEY rootkey=GetRegRootKey(parm0);
int type=parm4;
int rtype=parm5;
char *buf0=GetStringFromParm(0x02);
char *buf1=GetStringFromParm(0x11);
const char *rkn UNUSED=RegKeyHandleToName(rootkey);
TCHAR *buf0=GetStringFromParm(0x02);
TCHAR *buf1=GetStringFromParm(0x11);
const TCHAR *rkn UNUSED=RegKeyHandleToName(rootkey);
exec_error++;
if (RegCreateKeyEx(rootkey,buf1,0,0,0,AlterRegistrySAM(KEY_SET_VALUE),0,&hKey,0) == ERROR_SUCCESS)
@ -1213,31 +1228,31 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (type == REG_SZ)
{
GetStringFromParm(0x23);
size = mystrlen((char *) data) + 1;
size = (mystrlen((TCHAR *) data) + 1)*sizeof(TCHAR);
if (rtype == REG_SZ)
{
log_printf5("WriteRegStr: \"%s\\%s\" \"%s\"=\"%s\"",rkn,buf1,buf0,data);
log_printf5(_T("WriteRegStr: \"%s\\%s\" \"%s\"=\"%s\""),rkn,buf1,buf0,data);
}
else
{
log_printf5("WriteRegExpandStr: \"%s\\%s\" \"%s\"=\"%s\"",rkn,buf1,buf0,data);
log_printf5(_T("WriteRegExpandStr: \"%s\\%s\" \"%s\"=\"%s\""),rkn,buf1,buf0,data);
}
}
if (type == REG_DWORD)
{
*(LPDWORD) data = GetIntFromParm(3);
size = sizeof(DWORD);
log_printf5("WriteRegDWORD: \"%s\\%s\" \"%s\"=\"0x%08x\"",rkn,buf1,buf0,*(LPDWORD) data);
log_printf5(_T("WriteRegDWORD: \"%s\\%s\" \"%s\"=\"0x%08x\""),rkn,buf1,buf0,*(LPDWORD) data);
}
if (type == REG_BINARY)
{
#ifdef NSIS_CONFIG_LOG
char binbuf[128];
TCHAR binbuf[128];
#endif
// use buf2, buf3 and buf4
size = GetCompressedDataFromDataBlockToMemory(parm3, data, 3 * NSIS_MAX_STRLEN);
size = GetCompressedDataFromDataBlockToMemory(parm3, data, (3 * NSIS_MAX_STRLEN)*sizeof(TCHAR));
LogData2Hex(binbuf, sizeof(binbuf), data, size);
log_printf5("WriteRegBin: \"%s\\%s\" \"%s\"=\"%s\"",rkn,buf1,buf0,binbuf);
log_printf5(_T("WriteRegBin: \"%s\\%s\" \"%s\"=\"%s\""),rkn,buf1,buf0,binbuf);
}
if (size >= 0 && RegSetValueEx(hKey,buf0,0,rtype,data,size) == ERROR_SUCCESS)
@ -1246,19 +1261,19 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
else
{
log_printf4("WriteReg: error writing into \"%s\\%s\" \"%s\"",rkn,buf1,buf0);
log_printf4(_T("WriteReg: error writing into \"%s\\%s\" \"%s\""),rkn,buf1,buf0);
}
RegCloseKey(hKey);
}
else { log_printf3("WriteReg: error creating key \"%s\\%s\"",rkn,buf1); }
else { log_printf3(_T("WriteReg: error creating key \"%s\\%s\""),rkn,buf1); }
}
break;
case EW_READREGSTR: // read registry string
{
HKEY hKey=myRegOpenKey(KEY_READ);
char *p=var0;
char *buf3=GetStringFromParm(0x33); // buf3 == key name
TCHAR *p=var0;
TCHAR *buf3=GetStringFromParm(0x33); // buf3 == key name
p[0]=0;
if (hKey)
{
@ -1292,7 +1307,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_REGENUM:
{
HKEY key=myRegOpenKey(KEY_READ);
char *p=var0;
TCHAR *p=var0;
int b=GetIntFromParm(3);
p[0]=0;
if (key)
@ -1315,15 +1330,15 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_FILEFUNCTIONS
case EW_FCLOSE:
{
char *t=var0;
TCHAR *t=var0;
if (*t) CloseHandle((HANDLE)myatoi(t));
}
break;
case EW_FOPEN:
{
HANDLE h;
char *handleout=var0;
char *buf1=GetStringFromParm(-0x13);
TCHAR *handleout=var0;
TCHAR *buf1=GetStringFromParm(-0x13);
h=myOpenFile(buf1,parm1,parm2);
if (h == INVALID_HANDLE_VALUE)
{
@ -1340,8 +1355,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
DWORD dw;
int l;
char *t=var0;
if (parm2)
TCHAR *t=var0;
if (parm2) // WriteByte
{
((unsigned char *)buf1)[0]=GetIntFromParm(1)&0xff;
l=1;
@ -1372,7 +1387,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
while (rpos<maxlen)
{
char c;
if (!ReadFile(h,&c,1,&dw,NULL) || dw != 1) break;
if (!ReadFile(h,&c,sizeof(c),&dw,NULL) || dw != sizeof(c)) break;
if (parm3)
{
myitoa(textout,(unsigned int)(unsigned char)c);
@ -1380,7 +1395,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
if (lc == '\r' || lc == '\n')
{
if (lc == c || (c != '\r' && c != '\n')) SetFilePointer(h,-1,NULL,FILE_CURRENT);
if (lc == c || (c != '\r' && c != '\n')) SetFilePointer(h,-((int)(sizeof(c))),NULL,FILE_CURRENT);
else textout[rpos++]=c;
break;
}
@ -1395,7 +1410,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
break;
case EW_FSEEK:
{
char *t=var0;
TCHAR *t=var0;
if (*t)
{
DWORD v=SetFilePointer((HANDLE)myatoi(t),GetIntFromParm(2),NULL,parm3);
@ -1411,14 +1426,14 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef NSIS_SUPPORT_FINDFIRST
case EW_FINDCLOSE:
{
char *t=var0;
TCHAR *t=var0;
if (*t) FindClose((HANDLE)myatoi(t));
}
break;
case EW_FINDNEXT:
{
char *textout=var0;
char *t=var1;
TCHAR *textout=var0;
TCHAR *t=var1;
WIN32_FIND_DATA fd;
if (*t && FindNextFile((HANDLE)myatoi(t),&fd))
{
@ -1434,11 +1449,11 @@ static int NSISCALL ExecuteEntry(entry *entry_)
break;
case EW_FINDFIRST:
{
char *textout=var0;
char *handleout=var1;
TCHAR *textout=var0;
TCHAR *handleout=var1;
HANDLE h;
WIN32_FIND_DATA fd;
char *buf0=GetStringFromParm(0x02);
TCHAR *buf0=GetStringFromParm(0x02);
h=FindFirstFile(buf0,&fd);
if (h == INVALID_HANDLE_VALUE)
{
@ -1459,7 +1474,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
int ret=-666;
HANDLE hFile;
char *buf1=GetStringFromParm(-0x10);
TCHAR *buf1=GetStringFromParm(-0x10);
if (!validpathspec(buf1))
GetStringFromParm(-0x13);
@ -1477,6 +1492,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
SetSelfFilePointer(0);
ReadSelfFile((char*)filebuf,filehdrsize);
{
// parm1 = uninstdata_offset
// parm2 = m_unicon_size
unsigned char* seeker;
unsigned char* unicon_data = seeker = (unsigned char*)GlobalAlloc(GPTR,parm2);
if (unicon_data) {
@ -1499,7 +1516,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
CloseHandle(hFile);
}
log_printf3("created uninstaller: %d, \"%s\"",ret,buf1);
log_printf3(_T("created uninstaller: %d, \"%s\""),ret,buf1);
{
int str = LANG_CREATEDUNINST;
if (ret < 0)
@ -1517,9 +1534,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_LOG:
if (parm0)
{
log_printf2("settings logging to %d",parm1);
log_printf2(_T("settings logging to %d"),parm1);
log_dolog=parm1;
log_printf2("logging set to %d",parm1);
log_printf2(_T("logging set to %d"),parm1);
#if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
if (parm1)
build_g_logfile();
@ -1529,8 +1546,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
else
{
char *buf0=GetStringFromParm(0x01);
log_printf2("%s",buf0);
TCHAR *buf0=GetStringFromParm(0x01);
log_printf2(_T("%s"),buf0);
}
break;
#endif//NSIS_CONFIG_LOG

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Reviewed for Unicode support by Jim Park -- 08/22/2007
*/
#ifndef _EXEC_H_

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/13/2007
*/
#include "../Platform.h"
@ -23,6 +25,7 @@
#include "ui.h"
#include "exec.h"
#include "../crc32.h"
#include "../tchar.h"
#ifdef NSIS_CONFIG_COMPRESSION_SUPPORT
#ifdef NSIS_COMPRESS_USE_ZLIB
@ -89,12 +92,12 @@ BOOL CALLBACK verProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
if (uMsg == WM_TIMER)
{
char bt[64];
TCHAR bt[64];
int percent=calc_percent();
#ifdef NSIS_COMPRESS_WHOLE
char *msg=g_header?_LANG_UNPACKING:_LANG_VERIFYINGINST;
TCHAR *msg=g_header?_LANG_UNPACKING:_LANG_VERIFYINGINST;
#else
char *msg=_LANG_VERIFYINGINST;
TCHAR *msg=_LANG_VERIFYINGINST;
#endif
wsprintf(bt,msg,percent);
@ -130,8 +133,8 @@ void handle_ver_dlg(BOOL kill)
{
if (g_exec_flags.status_update & 1)
{
char bt[64];
wsprintf(bt, "... %d%%", calc_percent());
TCHAR bt[64];
wsprintf(bt, _T("... %d%%"), calc_percent());
update_status_text(0, bt);
}
}
@ -148,6 +151,7 @@ void handle_ver_dlg(BOOL kill)
}
}
}
#endif//NSIS_CONFIG_CRC_SUPPORT || NSIS_COMPRESS_WHOLE
#endif//NSIS_CONFIG_VISIBLE_SUPPORT
@ -155,7 +159,7 @@ void handle_ver_dlg(BOOL kill)
static z_stream g_inflate_stream;
#endif
const char * NSISCALL loadHeaders(int cl_flags)
const TCHAR * NSISCALL loadHeaders(int cl_flags)
{
int left;
#ifdef NSIS_CONFIG_CRC_SUPPORT
@ -234,7 +238,7 @@ const char * NSISCALL loadHeaders(int cl_flags)
#ifndef NSIS_CONFIG_CRC_ANAL
left = h.length_of_all_following_data - 4;
// end crc checking at crc :) this means you can tack shit on the end and it'll still work.
// end crc checking at crc :) this means you can tack stuff on the end and it'll still work.
#else //!NSIS_CONFIG_CRC_ANAL
left -= 4;
#endif//NSIS_CONFIG_CRC_ANAL
@ -292,7 +296,7 @@ const char * NSISCALL loadHeaders(int cl_flags)
inflateReset(&g_inflate_stream);
{
char fno[MAX_PATH];
TCHAR fno[MAX_PATH];
my_GetTempFileName(fno, state_temp_dir);
dbd_hFile=CreateFile(fno,GENERIC_WRITE|GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE,NULL);
if (dbd_hFile == INVALID_HANDLE_VALUE)
@ -345,6 +349,7 @@ const char * NSISCALL loadHeaders(int cl_flags)
#if !defined(NSIS_COMPRESS_WHOLE) || !defined(NSIS_CONFIG_COMPRESSION_SUPPORT)
// Decompress data.
int NSISCALL _dodecomp(int offset, HANDLE hFileOut, char *outbuf, int outbuflen)
{
static char inbuffer[IBUFSIZE+OBUFSIZE];
@ -365,7 +370,7 @@ int NSISCALL _dodecomp(int offset, HANDLE hFileOut, char *outbuf, int outbuflen)
#ifdef NSIS_CONFIG_COMPRESSION_SUPPORT
if (input_len & 0x80000000) // compressed
{
char progress[64];
TCHAR progress[64];
int input_len_total;
DWORD ltc = GetTickCount(), tc;
@ -400,7 +405,7 @@ int NSISCALL _dodecomp(int offset, HANDLE hFileOut, char *outbuf, int outbuflen)
tc = GetTickCount();
if (g_exec_flags.status_update & 1 && (tc - ltc > 200 || !input_len))
{
wsprintf(progress, "... %d%%", MulDiv(input_len_total - input_len, 100, input_len_total));
wsprintf(progress, _T("... %d%%"), MulDiv(input_len_total - input_len, 100, input_len_total));
update_status_text(0, progress);
ltc = tc;
}

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/13/2007
*/
#include "config.h"
@ -271,7 +273,7 @@ enum {
// nsis strings
typedef char NSIS_STRING[NSIS_MAX_STRLEN];
typedef TCHAR NSIS_STRING[NSIS_MAX_STRLEN];
// Settings common to both installers and uninstallers
typedef struct
@ -333,7 +335,7 @@ typedef struct
int str_uninstcmd;
#endif//NSIS_CONFIG_UNINSTALL_SUPPORT
#ifdef NSIS_SUPPORT_MOVEONREBOOT
int str_wininit;
int str_wininit; // Points to the path of wininit.ini
#endif//NSIS_SUPPORT_MOVEONREBOOT
} header;
@ -376,18 +378,22 @@ typedef struct
int name_ptr; // initial name pointer
int install_types; // bits set for each of the different install_types, if any.
int flags; // SF_* - defined above
int code;
int code_size;
// for labels, it looks like it's only used to track how often it is used.
int code; // The "address" of the start of the code in count of struct entries.
int code_size; // The size of the code in num of entries?
int size_kb;
char name[NSIS_MAX_STRLEN]; // '' for invisible sections
TCHAR name[NSIS_MAX_STRLEN]; // '' for invisible sections
} section;
#define SECTION_OFFSET(field) (FIELD_OFFSET(section, field)/sizeof(int))
typedef struct
{
int which;
int which; // EW_* enum. Look at the enum values to see what offsets mean.
int offsets[MAX_ENTRY_OFFSETS]; // count and meaning of offsets depend on 'which'
// sometimes they are just straight int values or bool
// values and sometimes they are indices into string
// tables.
} entry;
// page window proc
@ -478,8 +484,10 @@ typedef struct {
#define NS_LANG_CODE 255
#define NS_CODES_START NS_SKIP_CODE
// We are doing this to store an integer value into a char string and we
// don't want false end of string values so we shift then OR with 0x8080
#define CODE_SHORT(x) (WORD)((((WORD)(x) & 0x7F) | (((WORD)(x) & 0x3F80) << 1) | 0x8080))
#define MAX_CODED 16383
#define MAX_CODED 16383 // 0x3FFF
#define NSIS_INSTDIR_INVALID 1
#define NSIS_INSTDIR_NOT_ENOUGH_SPACE 2
@ -496,7 +504,7 @@ int NSISCALL isheader(firstheader *h); // returns 0 on not header, length_of_dat
// returns 0 on success
// on success, m_header will be set to a pointer that should eventually be GlobalFree()'d.
// (or m_uninstheader)
const char * NSISCALL loadHeaders(int cl_flags);
const TCHAR * NSISCALL loadHeaders(int cl_flags);
int NSISCALL _dodecomp(int offset, HANDLE hFileOut, char *outbuf, int outbuflen);

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/13/2007
*/
#ifndef _NSIS_LANG_H_
@ -19,24 +21,27 @@
// generic startup strings (these will never be overridable)
#define _LANG_INVALIDCRC "Installer integrity check has failed. Common causes include\n" \
"incomplete download and damaged media. Contact the\n" \
"installer's author to obtain a new copy.\n\n" \
"More information at:\n" \
"http://nsis.sf.net/NSIS_Error"
#define _LANG_INVALIDCRC _T("Installer integrity check has failed. Common causes include\n") \
_T("incomplete download and damaged media. Contact the\n") \
_T("installer's author to obtain a new copy.\n\n") \
_T("More information at:\n") \
_T("http://nsis.sf.net/NSIS_Error")
#define _LANG_ERRORWRITINGTEMP "Error writing temporary file. Make sure your temp folder is valid."
#define _LANG_ERRORWRITINGTEMP _T("Error writing temporary file. Make sure your temp folder is valid.")
#define _LANG_UNINSTINITERROR "Error launching installer"
#define _LANG_UNINSTINITERROR _T("Error launching installer")
#define _LANG_VERIFYINGINST "verifying installer: %d%%"
#define _LANG_VERIFYINGINST _T("verifying installer: %d%%")
#define _LANG_UNPACKING "unpacking data: %d%%"
#define _LANG_UNPACKING _T("unpacking data: %d%%")
#define _LANG_CANTOPENSELF "Error launching installer" // same as uninstiniterror for size
#define _LANG_CANTOPENSELF _T("Error launching installer") // same as uninstiniterror for size
#define _LANG_GENERIC_ERROR "NSIS Error"
#define _LANG_GENERIC_ERROR _T("NSIS Error")
// We store index to the current language table as a negative
// index value - 1. So this macro, undoes that into a valid
// index.
#define LANG_STR_TAB(x) cur_langtable[-((int)x+1)]
#define LANG_BRANDING -1

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/22/2007
*/
#include "fileform.h"
@ -31,7 +33,7 @@ extern NSIS_STRING g_usrvars[1];
#define state_exe_file g_usrvars[28]
#define state_click_next g_usrvars[30]
extern char g_caption[NSIS_MAX_STRLEN*2];
extern TCHAR g_caption[NSIS_MAX_STRLEN*2];
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
extern HWND g_hwnd;
extern HANDLE g_hInstance;

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/13/2007
*/
@ -21,7 +23,7 @@
extern int *cur_langtable;
extern int NSISCALL ui_doinstall(void);
void NSISCALL update_status_text(int strtab, const char *text2);
void NSISCALL update_status_text(int strtab, const TCHAR *text2);
extern int ui_dlg_visible;
extern HWND m_curwnd;

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/11/2007
*/
#include "../Platform.h"
@ -24,10 +26,11 @@
#include "exec.h"
#include "ui.h"
#include "resource.h"
#include "../tchar.h"
#ifdef NSIS_CONFIG_LOG
#if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
char g_log_file[1024];
TCHAR g_log_file[1024];
#endif
#endif
@ -50,7 +53,7 @@ NSIS_STRING g_usrvars[1] __attribute__((section (NSIS_VARS_SECTION)));
# endif
#endif
HANDLE NSISCALL myCreateProcess(char *cmd)
HANDLE NSISCALL myCreateProcess(TCHAR *cmd)
{
PROCESS_INFORMATION ProcInfo;
static STARTUPINFO StartUp;
@ -61,25 +64,25 @@ HANDLE NSISCALL myCreateProcess(char *cmd)
return ProcInfo.hProcess;
}
/*BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val)
/*BOOL NSISCALL my_SetWindowText(HWND hWnd, const TCHAR *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 TCHAR *val)
{
return SetDlgItemText(dlg,idx,val);
// return my_SetWindowText(GetDlgItem(dlg, idx), val);
}
int NSISCALL my_GetDialogItemText(UINT idx, char *val)
int NSISCALL my_GetDialogItemText(UINT idx, TCHAR *val)
{
extern HWND m_curwnd;
return GetDlgItemText(m_curwnd, idx, val, NSIS_MAX_STRLEN);
// return my_GetWindowText(GetDlgItem(m_curwnd, idx), val, NSIS_MAX_STRLEN);
}
int NSISCALL my_MessageBox(const char *text, UINT type) {
int NSISCALL my_MessageBox(const TCHAR *text, UINT type) {
int _type = type & 0x001FFFFF;
static MSGBOXPARAMS mbp = {
sizeof(MSGBOXPARAMS),
@ -112,13 +115,13 @@ int NSISCALL my_MessageBox(const char *text, UINT type) {
return MessageBoxIndirect(&mbp);
}
void NSISCALL myDelete(char *buf, int flags)
void NSISCALL myDelete(TCHAR *buf, int flags)
{
static char lbuf[NSIS_MAX_STRLEN];
static TCHAR lbuf[NSIS_MAX_STRLEN];
HANDLE h;
WIN32_FIND_DATA fd;
char *fn;
TCHAR *fn;
int valid_dir=is_valid_instpath(buf);
if ((flags & DEL_SIMPLE))
@ -134,14 +137,14 @@ void NSISCALL myDelete(char *buf, int flags)
mystrcpy(lbuf,buf);
#ifdef NSIS_SUPPORT_RMDIR
if (flags & DEL_DIR)
mystrcat(lbuf,"\\*.*");
mystrcat(lbuf,_T("\\*.*"));
else
#endif//NSIS_SUPPORT_RMDIR
trimslashtoend(buf);
// only append backslash if the path isn't relative to the working directory [bug #1851273]
if (*buf || *lbuf == '\\')
mystrcat(buf,"\\");
if (*buf || *lbuf == _T('\\'))
mystrcat(buf,_T("\\"));
fn=buf+mystrlen(buf);
@ -150,14 +153,14 @@ void NSISCALL myDelete(char *buf, int flags)
{
do
{
char *fdfn = fd.cFileName;
if (*findchar(fdfn, '?') && *fd.cAlternateFileName)
TCHAR *fdfn = fd.cFileName;
if (*findchar(fdfn, _T('?')) && *fd.cAlternateFileName)
// name contains unicode, use short name
fdfn = fd.cAlternateFileName;
#ifdef NSIS_SUPPORT_RMDIR
if (fdfn[0] == '.' && !fdfn[1]) continue;
if (fdfn[0] == '.' && fdfn[1] == '.' && !fdfn[2]) continue;
if (fdfn[0] == _T('.') && !fdfn[1]) continue;
if (fdfn[0] == _T('.') && fdfn[1] == _T('.') && !fdfn[2]) continue;
#endif//NSIS_SUPPORT_RMDIR
{
mystrcpy(fn,fdfn);
@ -172,21 +175,21 @@ void NSISCALL myDelete(char *buf, int flags)
}
else
{
log_printf2("Delete: DeleteFile(\"%s\")",buf);
log_printf2(_T("Delete: DeleteFile(\"%s\")"),buf);
remove_ro_attr(buf);
if (!DeleteFile(buf))
{
#ifdef NSIS_SUPPORT_MOVEONREBOOT
if (flags & DEL_REBOOT)
{
log_printf2("Delete: DeleteFile on Reboot(\"%s\")",buf);
log_printf2(_T("Delete: DeleteFile on Reboot(\"%s\")"),buf);
update_status_text(LANG_DELETEONREBOOT,buf);
MoveFileOnReboot(buf,NULL);
}
else
#endif//NSIS_SUPPORT_MOVEONREBOOT
{
log_printf2("Delete: DeleteFile failed(\"%s\")",buf);
log_printf2(_T("Delete: DeleteFile failed(\"%s\")"),buf);
g_exec_flags.exec_error++;
}
}
@ -209,27 +212,27 @@ void NSISCALL myDelete(char *buf, int flags)
{
if (!valid_dir)
{
log_printf2("RMDir: RemoveDirectory invalid input(\"%s\")",buf);
log_printf2(_T("RMDir: RemoveDirectory invalid input(\"%s\")"),buf);
g_exec_flags.exec_error++;
}
else if (file_exists(buf))
{
addtrailingslash(buf);
log_printf2("RMDir: RemoveDirectory(\"%s\")",buf);
log_printf2(_T("RMDir: RemoveDirectory(\"%s\")"),buf);
remove_ro_attr(buf);
if (!RemoveDirectory(buf))
{
#ifdef NSIS_SUPPORT_MOVEONREBOOT
if (flags & DEL_REBOOT)
{
log_printf2("RMDir: RemoveDirectory on Reboot(\"%s\")",buf);
log_printf2(_T("RMDir: RemoveDirectory on Reboot(\"%s\")"),buf);
update_status_text(LANG_DELETEONREBOOT,buf);
MoveFileOnReboot(buf,NULL);
}
else
#endif//NSIS_SUPPORT_MOVEONREBOOT
{
log_printf2("RMDir: RemoveDirectory failed(\"%s\")",buf);
log_printf2(_T("RMDir: RemoveDirectory failed(\"%s\")"),buf);
g_exec_flags.exec_error++;
}
}
@ -242,9 +245,9 @@ void NSISCALL myDelete(char *buf, int flags)
#endif//NSIS_SUPPORT_RMDIR
}
char *NSISCALL addtrailingslash(char *str)
TCHAR *NSISCALL addtrailingslash(TCHAR *str)
{
if (lastchar(str)!='\\') mystrcat(str,"\\");
if (lastchar(str)!=_T('\\')) mystrcat(str,_T("\\"));
return str;
}
@ -253,7 +256,7 @@ char *NSISCALL addtrailingslash(char *str)
return *CharPrev(str,str+mystrlen(str));
}*/
char * NSISCALL findchar(char *str, char c)
TCHAR * NSISCALL findchar(TCHAR *str, TCHAR c)
{
while (*str && *str != c)
{
@ -262,12 +265,14 @@ char * NSISCALL findchar(char *str, char c)
return str;
}
char * NSISCALL trimslashtoend(char *buf)
// Separates a full path to the directory portion and file name portion
// and returns the pointer to the filename portion.
TCHAR * NSISCALL trimslashtoend(TCHAR *buf)
{
char *p = buf + mystrlen(buf);
TCHAR *p = buf + mystrlen(buf);
do
{
if (*p == '\\')
if (*p == _T('\\'))
break;
p = CharPrev(buf, p);
} while (p > buf);
@ -277,28 +282,28 @@ char * NSISCALL trimslashtoend(char *buf)
return p + 1;
}
int NSISCALL validpathspec(char *ubuf)
int NSISCALL validpathspec(TCHAR *ubuf)
{
char dl = ubuf[0] | 0x20; // convert alleged drive letter to lower case
return ((*(WORD*)ubuf==CHAR2_TO_WORD('\\','\\')) || (dl >= 'a' && dl <= 'z' && ubuf[1]==':'));
TCHAR dl = ubuf[0] | 0x20; // convert alleged drive letter to lower case
return ((*(WORD*)ubuf==CHAR2_TO_WORD(_T('\\'),_T('\\'))) || (dl >= _T('a') && dl <= _T('z') && ubuf[1]==_T(':')));
}
char * NSISCALL skip_root(char *path)
TCHAR * NSISCALL skip_root(TCHAR *path)
{
char *p = CharNext(path);
char *p2 = CharNext(p);
TCHAR *p = CharNext(path);
TCHAR *p2 = CharNext(p);
if (*path && *(WORD*)p == CHAR2_TO_WORD(':', '\\'))
if (*path && *(WORD*)p == CHAR2_TO_WORD(_T(':'), _T('\\')))
{
return CharNext(p2);
}
else if (*(WORD*)path == CHAR2_TO_WORD('\\','\\'))
else if (*(WORD*)path == CHAR2_TO_WORD(_T('\\'),_T('\\')))
{
// skip host and share name
int x = 2;
while (x--)
{
p2 = findchar(p2, '\\');
p2 = findchar(p2, _T('\\'));
if (!*p2)
return NULL;
p2++; // skip backslash
@ -310,10 +315,10 @@ char * NSISCALL skip_root(char *path)
return NULL;
}
int NSISCALL is_valid_instpath(char *s)
int NSISCALL is_valid_instpath(TCHAR *s)
{
static char tmp[NSIS_MAX_STRLEN];
char *root;
static TCHAR tmp[NSIS_MAX_STRLEN];
TCHAR *root;
mystrcpy(tmp, s);
@ -330,7 +335,7 @@ int NSISCALL is_valid_instpath(char *s)
// not pass as a valid non-root directory.
validate_filename(root);
if ((g_flags & CH_FLAGS_NO_ROOT_DIR) && (!*root || *root == '\\'))
if ((g_flags & CH_FLAGS_NO_ROOT_DIR) && (!*root || *root == _T('\\')))
return 0;
while (mystrlen(tmp) > root - tmp)
@ -352,12 +357,12 @@ int NSISCALL is_valid_instpath(char *s)
return 1;
}
char * NSISCALL mystrstri(char *a, const char *b)
TCHAR * NSISCALL mystrstri(TCHAR *a, const TCHAR *b)
{
int l = mystrlen(b);
while (mystrlen(a) >= l)
{
char c = a[l];
TCHAR c = a[l];
a[l] = 0;
if (!lstrcmpi(a, b))
{
@ -370,6 +375,8 @@ char * NSISCALL mystrstri(char *a, const char *b)
return NULL;
}
// mini_memcpy takes the number of bytes to copy.
void NSISCALL mini_memcpy(void *out, const void *in, int len)
{
char *c_out=(char*)out;
@ -380,14 +387,14 @@ void NSISCALL mini_memcpy(void *out, const void *in, int len)
}
}
void NSISCALL remove_ro_attr(char *file)
void NSISCALL remove_ro_attr(TCHAR *file)
{
int attr = GetFileAttributes(file);
if (attr != INVALID_FILE_ATTRIBUTES)
SetFileAttributes(file,attr&(~FILE_ATTRIBUTE_READONLY));
}
HANDLE NSISCALL myOpenFile(const char *fn, DWORD da, DWORD cd)
HANDLE NSISCALL myOpenFile(const TCHAR *fn, DWORD da, DWORD cd)
{
int attr = GetFileAttributes(fn);
return CreateFile(
@ -401,14 +408,14 @@ HANDLE NSISCALL myOpenFile(const char *fn, DWORD da, DWORD cd)
);
}
char * NSISCALL my_GetTempFileName(char *buf, const char *dir)
TCHAR * NSISCALL my_GetTempFileName(TCHAR *buf, const TCHAR *dir)
{
int n = 100;
while (n--)
{
char prefix[4];
*(LPDWORD)prefix = CHAR4_TO_DWORD('n', 's', 'a', 0);
prefix[2] += (char)(GetTickCount() % 26);
TCHAR prefix[4];
*(LPDWORD)prefix = CHAR4_TO_DWORD(_T('n'), _T('s'), _T('a'), 0);
prefix[2] += (TCHAR)(GetTickCount() % 26);
if (GetTempFileName(dir, prefix, 0, buf))
return buf;
}
@ -420,9 +427,9 @@ char * NSISCALL my_GetTempFileName(char *buf, const char *dir)
void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
{
BOOL fOk = 0;
typedef BOOL (WINAPI *mfea_t)(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags);
typedef BOOL (WINAPI *mfea_t)(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,DWORD dwFlags);
mfea_t mfea;
mfea=(mfea_t) myGetProcAddress(MGA_MoveFileExA);
mfea=(mfea_t) myGetProcAddress(MGA_MoveFileEx);
if (mfea)
{
fOk=mfea(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING);
@ -430,20 +437,20 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
if (!fOk)
{
static char szRenameLine[1024];
static char wininit[1024];
static char tmpbuf[1024];
static TCHAR szRenameLine[1024];
static TCHAR wininit[1024];
static TCHAR tmpbuf[1024];
int cchRenameLine;
static const char szRenameSec[] = "[Rename]\r\n";
static const TCHAR szRenameSec[] = _T("[Rename]\r\n");
HANDLE hfile;
DWORD dwFileSize;
DWORD dwBytes;
DWORD dwRenameLinePos;
char *pszWinInit;
TCHAR *pszWinInit;
int spn;
*(DWORD*)tmpbuf = CHAR4_TO_DWORD('N', 'U', 'L', 0);
*(DWORD*)tmpbuf = CHAR4_TO_DWORD(_T('N'), _T('U'), _T('L'), 0);
if (pszNew) {
// create the file if it's not already there to prevent GetShortPathName from failing
@ -456,7 +463,7 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
spn = GetShortPathName(pszExisting,wininit,1024);
if (!spn || spn > 1024)
return;
cchRenameLine = wsprintf(szRenameLine,"%s=%s\r\n",tmpbuf,wininit);
cchRenameLine = wsprintf(szRenameLine,_T("%s=%s\r\n"),tmpbuf,wininit);
GetNSISString(wininit, g_header->str_wininit);
hfile = myOpenFile(wininit, GENERIC_READ | GENERIC_WRITE, OPEN_ALWAYS);
@ -470,7 +477,7 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
{
if (ReadFile(hfile, pszWinInit, dwFileSize, &dwBytes, NULL) && dwFileSize == dwBytes)
{
LPSTR pszRenameSecInFile = mystrstri(pszWinInit, szRenameSec);
LPTSTR pszRenameSecInFile = mystrstri(pszWinInit, szRenameSec);
if (pszRenameSecInFile == NULL)
{
mystrcpy(pszWinInit+dwFileSize, szRenameSec);
@ -479,11 +486,11 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
}
else
{
char *pszFirstRenameLine = pszRenameSecInFile+10;
char *pszNextSec = mystrstri(pszFirstRenameLine,"\n[");
TCHAR *pszFirstRenameLine = pszRenameSecInFile+10;
TCHAR *pszNextSec = mystrstri(pszFirstRenameLine,_T("\n["));
if (pszNextSec)
{
char *p = ++pszNextSec;
TCHAR *p = ++pszNextSec;
while (p < pszWinInit + dwFileSize) {
p[cchRenameLine] = *p;
p++;
@ -515,48 +522,52 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
}
#endif
void NSISCALL myRegGetStr(HKEY root, const char *sub, const char *name, char *out, int x64)
// The value of registry->sub->name is stored in out. If failure, then out becomes
// an empty string "".
void NSISCALL myRegGetStr(HKEY root, const TCHAR *sub, const TCHAR *name, TCHAR *out, int x64)
{
HKEY hKey;
*out=0;
if (RegOpenKeyEx(root,sub,0,KEY_READ|(x64?KEY_WOW64_64KEY:0),&hKey) == ERROR_SUCCESS)
{
DWORD l = NSIS_MAX_STRLEN;
DWORD l = NSIS_MAX_STRLEN*sizeof(TCHAR);
DWORD t;
if (RegQueryValueEx(hKey,name,NULL,&t,out,&l ) != ERROR_SUCCESS || (t != REG_SZ && t != REG_EXPAND_SZ)) *out=0;
// Note that RegQueryValueEx returns Unicode strings if _UNICODE is defined for the
// REG_SZ type.
if (RegQueryValueEx(hKey,name,NULL,&t,(LPBYTE)out,&l ) != ERROR_SUCCESS || (t != REG_SZ && t != REG_EXPAND_SZ)) *out=0;
out[NSIS_MAX_STRLEN-1]=0;
RegCloseKey(hKey);
}
}
void NSISCALL myitoa(char *s, int d)
void NSISCALL myitoa(TCHAR *s, int d)
{
static const char c[] = "%d";
static const TCHAR c[] = _T("%d");
wsprintf(s,c,d);
}
int NSISCALL myatoi(char *s)
int NSISCALL myatoi(TCHAR *s)
{
unsigned int v=0;
int sign=1; // sign of positive
char m=10; // base of 10
char t='9'; // cap top of numbers at 9
TCHAR m=10; // base of 10
TCHAR t=_T('9'); // cap top of numbers at 9
if (*s == '-')
if (*s == _T('-'))
{
s++; //skip over -
sign=-1; // sign flip
}
if (*s == '0')
if (*s == _T('0'))
{
s++; // skip over 0
if (s[0] >= '0' && s[0] <= '7')
if (s[0] >= _T('0') && s[0] <= _T('7'))
{
m=8; // base of 8
t='7'; // cap top at 7
t=_T('7'); // cap top at 7
}
if ((s[0] & ~0x20) == 'X')
if ((s[0] & ~0x20) == _T('X'))
{
m=16; // base of 16
s++; // advance over 'x'
@ -566,8 +577,9 @@ int NSISCALL myatoi(char *s)
for (;;)
{
int c=*s++;
if (c >= '0' && c <= t) c-='0';
else if (m==16 && (c & ~0x20) >= 'A' && (c & ~0x20) <= 'F') c = (c & 7) + 9;
if (c >= _T('0') && c <= t) c-=_T('0');
// clever little trick to do both upper and lowercase A-F.
else if (m==16 && (c & ~0x20) >= _T('A') && (c & ~0x20) <= _T('F')) c = (c & 7) + 9;
else break;
v*=m;
v+=c;
@ -578,34 +590,38 @@ int NSISCALL myatoi(char *s)
// Straight copies of selected shell functions. Calling local functions
// requires less code than DLL functions. For the savings to outweigh the cost
// of a new function there should be about a couple of dozen or so calls.
char * NSISCALL mystrcpy(char *out, const char *in)
TCHAR * NSISCALL mystrcpy(TCHAR *out, const TCHAR *in)
{
return lstrcpyn(out, in, NSIS_MAX_STRLEN);
}
int NSISCALL mystrlen(const char *in)
int NSISCALL mystrlen(const TCHAR *in)
{
return lstrlen(in);
}
char * NSISCALL mystrcat(char *out, const char *concat)
TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat)
{
return lstrcat(out, concat);
}
char ps_tmpbuf[NSIS_MAX_STRLEN*2];
TCHAR ps_tmpbuf[NSIS_MAX_STRLEN*2];
const char SYSREGKEY[] = "Software\\Microsoft\\Windows\\CurrentVersion";
const char QUICKLAUNCH[] = "\\Microsoft\\Internet Explorer\\Quick Launch";
const TCHAR SYSREGKEY[] = _T("Software\\Microsoft\\Windows\\CurrentVersion");
const TCHAR QUICKLAUNCH[] = _T("\\Microsoft\\Internet Explorer\\Quick Launch");
typedef HRESULT (__stdcall * PFNSHGETFOLDERPATHA)(HWND, int, HANDLE, DWORD, LPSTR);
typedef HRESULT (__stdcall * PFNSHGETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPTSTR);
extern void *g_SHGetFolderPath;
// Based on Dave Laundon's simplified process_string
char * NSISCALL GetNSISString(char *outbuf, int strtab)
// The string actually has a lot of different data encoded into it. This
// function extracts the special data out and puts it into outbuf.
TCHAR * NSISCALL GetNSISString(TCHAR *outbuf, int strtab)
{
char *in = (char*)GetNSISStringNP(GetNSISTab(strtab));
char *out = ps_tmpbuf;
// This looks at the g_block (copied from header->blocks) and
// indexes into the language
TCHAR *in = (TCHAR*)GetNSISStringNP(GetNSISTab(strtab));
TCHAR *out = ps_tmpbuf;
if ((unsigned int) (outbuf - ps_tmpbuf) < sizeof(ps_tmpbuf))
{
out = outbuf;
@ -613,7 +629,7 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
}
while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN)
{
unsigned char nVarIdx = (unsigned char)*in++;
_TUCHAR nVarIdx = (_TUCHAR)*in++;
int nData;
int fldrs[4];
if (nVarIdx > NS_CODES_START)
@ -623,7 +639,7 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
fldrs[1] = in[0];
fldrs[2] = in[1] | CSIDL_FLAG_CREATE; // all users
fldrs[3] = in[1];
in += 2;
in += sizeof(SHORT)/sizeof(TCHAR);
if (nVarIdx == NS_SHELL_CODE)
{
@ -689,7 +705,7 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
{
if (g_SHGetFolderPath && use_shfolder)
{
PFNSHGETFOLDERPATHA SHGetFolderPathFunc = (PFNSHGETFOLDERPATHA) g_SHGetFolderPath;
PFNSHGETFOLDERPATH SHGetFolderPathFunc = (PFNSHGETFOLDERPATH) g_SHGetFolderPath;
if (!SHGetFolderPathFunc(g_hwnd, fldrs[x], NULL, SHGFP_TYPE_CURRENT, out))
{
break;
@ -751,15 +767,15 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
return ps_tmpbuf;
}
void NSISCALL validate_filename(char *in) {
char *nono = "*?|<>/\":";
char *out;
char *out_save;
void NSISCALL validate_filename(TCHAR *in) {
TCHAR *nono = _T("*?|<>/\":");
TCHAR *out;
TCHAR *out_save;
// ignoring spaces is wrong, " C:\blah" is invalid
//while (*in == ' ') in = CharNext(in);
// ignoring spaces is wrong, _T(" C:\blah") is invalid
//while (*in == _T(' ')) in = CharNext(in);
if (in[0] == '\\' && in[1] == '\\' && in[2] == '?' && in[3] == '\\')
if (in[0] == _T('\\') && in[1] == _T('\\') && in[2] == _T('?') && in[3] == _T('\\'))
{
// at least four bytes
in += 4;
@ -772,7 +788,7 @@ void NSISCALL validate_filename(char *in) {
out = out_save = in;
while (*in)
{
if ((unsigned char)*in > 31 && !*findchar(nono, *in))
if ((_TUCHAR)*in > 31 && !*findchar(nono, *in))
{
mini_memcpy(out, in, CharNext(in) - in);
out = CharNext(out);
@ -783,7 +799,7 @@ void NSISCALL validate_filename(char *in) {
do
{
out = CharPrev(out_save, out);
if (*out == ' ' || *out == '\\')
if (*out == _T(' ') || *out == _T('\\'))
*out = 0;
else
break;
@ -792,7 +808,7 @@ void NSISCALL validate_filename(char *in) {
#ifdef NSIS_CONFIG_LOG
int log_dolog;
char log_text[2048]; // 1024 for each wsprintf
TCHAR log_text[2048]; // 1024 for each wsprintf
#if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
void NSISCALL log_write(int close)
@ -818,36 +834,36 @@ void NSISCALL log_write(int close)
if (fp!=INVALID_HANDLE_VALUE)
{
DWORD d;
mystrcat(log_text,"\r\n");
WriteFile(fp,log_text,mystrlen(log_text),&d,NULL);
mystrcat(log_text,_T("\r\n"));
WriteFile(fp,log_text,mystrlen(log_text)*sizeof(TCHAR),&d,NULL);
}
}
}
#endif//!NSIS_CONFIG_LOG_ODS && !NSIS_CONFIG_LOG_STDOUT
const char * _RegKeyHandleToName(HKEY hKey)
const TCHAR * _RegKeyHandleToName(HKEY hKey)
{
if (hKey == HKEY_CLASSES_ROOT)
return "HKEY_CLASSES_ROOT";
return _T("HKEY_CLASSES_ROOT");
else if (hKey == HKEY_CURRENT_USER)
return "HKEY_CURRENT_USER";
return _T("HKEY_CURRENT_USER");
else if (hKey == HKEY_LOCAL_MACHINE)
return "HKEY_LOCAL_MACHINE";
return _T("HKEY_LOCAL_MACHINE");
else if (hKey == HKEY_USERS)
return "HKEY_USERS";
return _T("HKEY_USERS");
else if (hKey == HKEY_PERFORMANCE_DATA)
return "HKEY_PERFORMANCE_DATA";
return _T("HKEY_PERFORMANCE_DATA");
else if (hKey == HKEY_CURRENT_CONFIG)
return "HKEY_CURRENT_CONFIG";
return _T("HKEY_CURRENT_CONFIG");
else if (hKey == HKEY_DYN_DATA)
return "HKEY_DYN_DATA";
return _T("HKEY_DYN_DATA");
else
return "invalid registry key";
return _T("invalid registry key");
}
void _LogData2Hex(char *buf, size_t buflen, unsigned char *data, size_t datalen)
void _LogData2Hex(TCHAR *buf, size_t buflen, BYTE *data, size_t datalen)
{
char *p = buf;
TCHAR *p = buf;
size_t i;
@ -864,31 +880,31 @@ void _LogData2Hex(char *buf, size_t buflen, unsigned char *data, size_t datalen)
for (i = 0; i < bufbytes; i++)
{
wsprintf(p, "%02x%c", data[i], (i == bufbytes - 1) ? '\0' : ' ');
wsprintf(p, _T("%02x%c"), data[i], (i == bufbytes - 1) ? _T('\0') : _T(' '));
p += 3;
}
if (dots)
mystrcat(buf, "...");
mystrcat(buf, _T("..."));
}
#ifdef NSIS_CONFIG_LOG_TIMESTAMP
void log_timestamp(char *buf)
void log_timestamp(TCHAR *buf)
{
SYSTEMTIME st;
GetLocalTime(&st);
wsprintf(buf,"[%04hu/%02hu/%02hu %02hu:%02hu:%02hu] ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
wsprintf(buf,_T("[%04hu/%02hu/%02hu %02hu:%02hu:%02hu] "), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}
#else
# define log_timestamp(x)
#endif//NSIS_CONFIG_LOG_TIMESTAMP
void log_printf(char *format, ...)
void log_printf(TCHAR *format, ...)
{
va_list val;
va_start(val,format);
log_text[0] = '\0';
log_text[0] = _T('\0');
log_timestamp(log_text);
wvsprintf(log_text+mystrlen(log_text),format,val);
@ -902,7 +918,7 @@ void log_printf(char *format, ...)
{
DWORD dwBytes;
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), log_text, lstrlen(log_text), &dwBytes, NULL);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), "\n", 1, &dwBytes, NULL);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), _T("\n"), 1, &dwBytes, NULL);
}
#endif
#if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
@ -911,7 +927,8 @@ void log_printf(char *format, ...)
}
#endif//NSIS_CONFIG_LOG
WIN32_FIND_DATA * NSISCALL file_exists(char *buf)
// Jim Park: This function is non-reentrant because of the static.
WIN32_FIND_DATA * NSISCALL file_exists(TCHAR *buf)
{
HANDLE h;
static WIN32_FIND_DATA fd;
@ -924,6 +941,8 @@ WIN32_FIND_DATA * NSISCALL file_exists(char *buf)
return NULL;
}
// Jim Park: Keep these as chars since there's only ANSI version of
// GetProcAddress.
struct MGA_FUNC
{
const char *dll;
@ -942,12 +961,20 @@ struct MGA_FUNC MGA_FUNCS[] = {
{"SHFOLDER", "SHGetFolderPathA"}
};
/**
* Given a function enum, it will load the appropriate DLL and get the
* process address of the function and return the pointer. It's up to
* the caller to know how to call that function, however.
*
* @param func Enum value that indexes the MGA_FUNCS array.
* @return Pointer to the function identified by the enum value.
*/
void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func)
{
const char *dll = MGA_FUNCS[func].dll;
HMODULE hModule = GetModuleHandle(dll);
HMODULE hModule = GetModuleHandleA(dll);
if (!hModule)
hModule = LoadLibrary(dll);
hModule = LoadLibraryA(dll);
if (!hModule)
return NULL;

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 07/23/2007
*/
#ifndef ___NSIS_UTIL_H___
@ -21,36 +23,40 @@
#include "config.h"
#include <shlobj.h>
extern char ps_tmpbuf[NSIS_MAX_STRLEN*2];
char * NSISCALL GetNSISString(char *outbuf, int strtab);
extern TCHAR ps_tmpbuf[NSIS_MAX_STRLEN*2];
TCHAR * NSISCALL GetNSISString(TCHAR *outbuf, int strtab);
#define GetNSISStringTT(strtab) GetNSISString(0, (strtab))
#define GetNSISStringNP(strtab) ((const char *)g_blocks[NB_STRINGS].offset+(strtab))
#define GetNSISTab(strtab) (strtab < 0 ? LANG_STR_TAB(strtab) : strtab)
void NSISCALL myRegGetStr(HKEY root, const char *sub, const char *name, char *out, int x64);
int NSISCALL myatoi(char *s);
void NSISCALL myitoa(char *s, int d);
char * NSISCALL mystrcpy(char *out, const char *in);
int NSISCALL mystrlen(const char *in);
char * NSISCALL mystrcat(char *out, const char *concat);
char * NSISCALL mystrstr(char *a, char *b);
WIN32_FIND_DATA * NSISCALL file_exists(char *buf);
char * NSISCALL my_GetTempFileName(char *buf, const char *dir);
#define GetNSISStringNP(strtab) ((const TCHAR *)g_blocks[NB_STRINGS].offset+(strtab))
//BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val);
// A negative string table index means it's a language string table, so we
// use the LANG_STR_TAB() macro to decode it.
#define GetNSISTab(strtab) (strtab < 0 ? LANG_STR_TAB(strtab) : strtab)
void NSISCALL myRegGetStr(HKEY root, const TCHAR *sub, const TCHAR *name, TCHAR *out, int x64);
int NSISCALL myatoi(TCHAR *s);
void NSISCALL myitoa(TCHAR *s, int d);
TCHAR * NSISCALL mystrcpy(TCHAR *out, const TCHAR *in);
int NSISCALL mystrlen(const TCHAR *in);
TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat);
TCHAR * NSISCALL mystrstr(TCHAR *a, TCHAR *b);
WIN32_FIND_DATA * NSISCALL file_exists(TCHAR *buf);
TCHAR * NSISCALL my_GetTempFileName(TCHAR *buf, const TCHAR *dir);
//BOOL NSISCALL my_SetWindowText(HWND hWnd, const TCHAR *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 TCHAR *val);
//#define my_SetDialogItemText SetDlgItemText
//int NSISCALL my_GetWindowText(HWND hWnd, char *val, int size);
//int NSISCALL my_GetWindowText(HWND hWnd, TCHAR *val, int size);
#define my_GetWindowText GetWindowText
int NSISCALL my_GetDialogItemText(UINT idx, char *val);
int NSISCALL my_GetDialogItemText(UINT idx, TCHAR *val);
//#define my_GetDialogItemText GetDlgItemText
#ifdef NSIS_CONFIG_LOG
extern char log_text[2048];
extern TCHAR log_text[2048];
void NSISCALL log_write(int close);
const char * _RegKeyHandleToName(HKEY hKey);
void _LogData2Hex(char *buf, size_t buflen, unsigned char *data, size_t datalen);
void log_printf(char *format, ...);
const TCHAR * _RegKeyHandleToName(HKEY hKey);
void _LogData2Hex(TCHAR *buf, size_t buflen, BYTE *data, size_t datalen);
void log_printf(TCHAR *format, ...);
#define log_printf2(x1,x2) log_printf(x1,x2);
#define log_printf3(x1,x2,x3) log_printf(x1,x2,x3);
#define log_printf4(x1,x2,x3,x4) log_printf(x1,x2,x3,x4);
@ -61,7 +67,7 @@ void log_printf(char *format, ...);
#define RegKeyHandleToName(x1) _RegKeyHandleToName(x1);
#define LogData2Hex(x1,x2,x3,x4) _LogData2Hex(x1,x2,x3,x4);
extern int log_dolog;
extern char g_log_file[1024];
extern TCHAR g_log_file[1024];
#else
#define log_printf(x1)
#define log_printf2(x1,x2)
@ -75,35 +81,44 @@ extern char g_log_file[1024];
#define LogData2Hex(x1,x2,x3,x4)
#endif
HANDLE NSISCALL myCreateProcess(char *cmd);
int NSISCALL my_MessageBox(const char *text, UINT type);
HANDLE NSISCALL myCreateProcess(TCHAR *cmd);
int NSISCALL my_MessageBox(const TCHAR *text, UINT type);
void NSISCALL myDelete(char *buf, int flags);
void NSISCALL myDelete(TCHAR *buf, int flags);
HANDLE NSISCALL myOpenFile(const char *fn, DWORD da, DWORD cd);
int NSISCALL validpathspec(char *ubuf);
char * NSISCALL addtrailingslash(char *str);
//char NSISCALL lastchar(const char *str);
HANDLE NSISCALL myOpenFile(const TCHAR *fn, DWORD da, DWORD cd);
int NSISCALL validpathspec(TCHAR *ubuf);
TCHAR * NSISCALL addtrailingslash(TCHAR *str);
//TCHAR NSISCALL lastchar(const TCHAR *str);
#define lastchar(str) *CharPrev(str,str+mystrlen(str))
char * NSISCALL findchar(char *str, char c);
char * NSISCALL trimslashtoend(char *buf);
char * NSISCALL skip_root(char *path);
int NSISCALL is_valid_instpath(char *s);
void NSISCALL validate_filename(char *fn);
TCHAR * NSISCALL findchar(TCHAR *str, TCHAR c);
TCHAR * NSISCALL trimslashtoend(TCHAR *buf);
TCHAR * NSISCALL skip_root(TCHAR *path);
int NSISCALL is_valid_instpath(TCHAR *s);
void NSISCALL validate_filename(TCHAR *fn);
/**
* MoveFileOnReboot tries to move a file by the name of pszExisting to the
* name pszNew.
*
* @param pszExisting The old name of the file.
* @param pszNew The new name of the file.
*/
void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew);
void NSISCALL mini_memcpy(void *out, const void *in, int len);
void NSISCALL remove_ro_attr(char *file);
void NSISCALL remove_ro_attr(TCHAR *file);
enum myGetProcAddressFunctions {
MGA_GetDiskFreeSpaceExA,
MGA_MoveFileExA,
MGA_RegDeleteKeyExA,
MGA_GetDiskFreeSpaceEx,
MGA_MoveFileEx,
MGA_RegDeleteKeyEx,
MGA_OpenProcessToken,
MGA_LookupPrivilegeValueA,
MGA_LookupPrivilegeValue,
MGA_AdjustTokenPrivileges,
MGA_GetUserDefaultUILanguage,
MGA_SHAutoComplete,
MGA_SHGetFolderPathA
MGA_SHGetFolderPath
};
void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func);