Win64 fixes

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6405 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2013-08-07 23:04:23 +00:00
parent 7f103f9e39
commit 942ea1d465
7 changed files with 61 additions and 53 deletions

View file

@ -176,7 +176,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
{ {
g_sdata.hwnd=hwndDlg; g_sdata.hwnd=hwndDlg;
HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON)); HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON));
SetClassLong(hwndDlg,GCL_HICON,(long)hIcon); SetClassLongPtr(hwndDlg,GCLP_HICON,(LONG_PTR)hIcon);
// Altered by Darren Owen (DrO) on 29/9/2003 // Altered by Darren Owen (DrO) on 29/9/2003
// Added in receiving of mouse and key events from the richedit control // Added in receiving of mouse and key events from the richedit control
SendMessage(GetDlgItem(hwndDlg,IDC_LOGWIN),EM_SETEVENTMASK,(WPARAM)NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS); SendMessage(GetDlgItem(hwndDlg,IDC_LOGWIN),EM_SETEVENTMASK,(WPARAM)NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS);

View file

@ -632,7 +632,7 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
SetDlgItemText(hwndDlg,IDC_INSTPATH,gp_poi); SetDlgItemText(hwndDlg,IDC_INSTPATH,gp_poi);
hIcon=LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON1)); hIcon=LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON1));
SetClassLong(hwndDlg,GCL_HICON,(long)hIcon); SetClassLongPtr(hwndDlg,GCLP_HICON,(LONG_PTR)hIcon);
hFont=CreateFont(15,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET, hFont=CreateFont(15,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
OUT_CHARACTER_PRECIS, OUT_CHARACTER_PRECIS,

View file

@ -113,7 +113,9 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
// mingw32 and w64-mingw32 do not define ULONG_PTR // mingw32 and w64-mingw32 do not define ULONG_PTR
// but rather declare ULONG_PTR via typedef (see basetsd.h) // but rather declare ULONG_PTR via typedef (see basetsd.h)
#if !defined(__MINGW32__) && !defined(ULONG_PTR) #if !defined(__MINGW32__) && !defined(ULONG_PTR)
# define ULONG_PTR unsigned long # ifndef _WIN64
# define ULONG_PTR unsigned long
# endif
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
@ -248,6 +250,13 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
# define ZeroMemory(x, y) memset(x, 0, y) # define ZeroMemory(x, y) memset(x, 0, y)
#endif #endif
#ifndef _WIN64
# ifndef GCLP_HICON
# define GCLP_HICON GCL_HICON
# define SetClassLongPtr SetClassLong
# endif
#endif
// defines // defines
#ifndef MEM_LARGE_PAGES #ifndef MEM_LARGE_PAGES

View file

@ -488,7 +488,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
m_hwndOK=GetDlgItem(hwndDlg,IDOK); m_hwndOK=GetDlgItem(hwndDlg,IDOK);
m_hwndCancel=GetDlgItem(hwndDlg,IDCANCEL); m_hwndCancel=GetDlgItem(hwndDlg,IDCANCEL);
SetDlgItemTextFromLang(hwndDlg,IDC_VERSTR,LANG_BRANDING); SetDlgItemTextFromLang(hwndDlg,IDC_VERSTR,LANG_BRANDING);
SetClassLong(hwndDlg,GCL_HICON,(long)g_hIcon); SetClassLongPtr(hwndDlg,GCLP_HICON,(LONG_PTR)g_hIcon);
// use the following line instead of the above, if .rdata needs shirking // use the following line instead of the above, if .rdata needs shirking
//SendMessage(hwndDlg,WM_SETICON,ICON_BIG,(LPARAM)g_hIcon); //SendMessage(hwndDlg,WM_SETICON,ICON_BIG,(LPARAM)g_hIcon);
#if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT)

View file

@ -122,10 +122,12 @@ void NSISCALL update_status_text_buf1(int strtab)
update_status_text(strtab, g_bufs[1]); update_status_text(strtab, g_bufs[1]);
} }
static int NSISCALL GetIntFromParm(int id_) static INT_PTR NSISCALL GetIntPtrFromParm(int id_)
{ {
return myatoi(GetNSISStringTT(g_parms[id_])); return strtoiptr(GetNSISStringTT(g_parms[id_]));
} }
#define GetHwndFromParm(id_) ( (HWND)GetIntPtrFromParm(id_) )
#define GetIntFromParm(id_) ( (INT32)(UINT32)GetIntPtrFromParm(id_) )
// NB - USE CAUTION when rearranging code to make use of the new return value of // NB - USE CAUTION when rearranging code to make use of the new return value of
// this function - be sure the parm being accessed is not modified before the call. // this function - be sure the parm being accessed is not modified before the call.
@ -685,7 +687,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
int v,v2; int v,v2;
TCHAR *p=var0; TCHAR *p=var0;
v=GetIntFromParm(1); v=GetIntFromParm(1); // BUGBUG64: TODO: These should be INT_PTR, the script might be playing with pointers and System::Call
v2=GetIntFromParm(2); v2=GetIntFromParm(2);
switch (parm3) switch (parm3)
{ {
@ -710,7 +712,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
TCHAR *buf0=GetStringFromParm(0x01); TCHAR *buf0=GetStringFromParm(0x01);
wsprintf(var0, wsprintf(var0,
buf0, buf0,
GetIntFromParm(2)); GetIntPtrFromParm(2));
} }
break; break;
#endif//NSIS_SUPPORT_INTOPTS #endif//NSIS_SUPPORT_INTOPTS
@ -758,15 +760,15 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_FINDWINDOW: case EW_FINDWINDOW:
case EW_SENDMESSAGE: case EW_SENDMESSAGE:
{ {
int v; LRESULT v;
int b3=GetIntFromParm(3); INT_PTR b3=GetIntPtrFromParm(3);
int b4=GetIntFromParm(4); INT_PTR b4=GetIntPtrFromParm(4);
if (parm5&1) b3=(int)GetStringFromParm(0x33); if (parm5&1) b3=(INT_PTR)GetStringFromParm(0x33);
if (parm5&2) b4=(int)GetStringFromParm(0x44); if (parm5&2) b4=(INT_PTR)GetStringFromParm(0x44);
if (which == EW_SENDMESSAGE) if (which == EW_SENDMESSAGE)
{ {
HWND hwnd=(HWND)GetIntFromParm(1); HWND hwnd=GetHwndFromParm(1);
int msg=GetIntFromParm(2); int msg=GetIntFromParm(2);
if (parm5>>2) exec_error += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(LPDWORD)&v); if (parm5>>2) exec_error += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(LPDWORD)&v);
@ -779,22 +781,21 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
TCHAR *buf0=GetStringFromParm(0x01); TCHAR *buf0=GetStringFromParm(0x01);
TCHAR *buf1=GetStringFromParm(0x12); TCHAR *buf1=GetStringFromParm(0x12);
v=(int)FindWindowEx((HWND)b3,(HWND)b4,buf0[0]?buf0:NULL,buf1[0]?buf1:NULL); v=(LRESULT)FindWindowEx((HWND)b3,(HWND)b4,buf0[0]?buf0:NULL,buf1[0]?buf1:NULL);
} }
if (parm0>=0) if (parm0>=0) iptrtostr(var0,v);
myitoa(var0,v);
} }
break; break;
case EW_ISWINDOW: case EW_ISWINDOW:
if (IsWindow((HWND)GetIntFromParm(0))) return parm1; if (IsWindow(GetHwndFromParm(0))) return parm1;
return parm2; return parm2;
#ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT #ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT
case EW_GETDLGITEM: case EW_GETDLGITEM:
myitoa( iptrtostr(
var0, var0,
(int)GetDlgItem( (INT_PTR)GetDlgItem(
(HWND)GetIntFromParm(1), GetHwndFromParm(1),
GetIntFromParm(2) GetIntFromParm(2)
) )
); );
@ -802,7 +803,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_SETCTLCOLORS: case EW_SETCTLCOLORS:
{ {
ctlcolors *c = (ctlcolors *)(g_blocks[NB_CTLCOLORS].offset + parm1); ctlcolors *c = (ctlcolors *)(g_blocks[NB_CTLCOLORS].offset + parm1);
SetWindowLongPtr((HWND) GetIntFromParm(0), GWLP_USERDATA, (LONG_PTR) c); SetWindowLongPtr(GetHwndFromParm(0), GWLP_USERDATA, (LONG_PTR) c);
} }
break; break;
case EW_SETBRANDINGIMAGE: case EW_SETBRANDINGIMAGE:
@ -841,12 +842,12 @@ static int NSISCALL ExecuteEntry(entry *entry_)
f.lfStrikeOut=parm4&4; f.lfStrikeOut=parm4&4;
f.lfCharSet=DEFAULT_CHARSET; f.lfCharSet=DEFAULT_CHARSET;
GetNSISString(f.lfFaceName,parm1); GetNSISString(f.lfFaceName,parm1);
myitoa(var0,(int)CreateFontIndirect(&f)); iptrtostr(var0,(INT_PTR)CreateFontIndirect(&f));
} }
break; break;
case EW_SHOWWINDOW: case EW_SHOWWINDOW:
{ {
HWND hw=(HWND)GetIntFromParm(0); HWND hw=GetHwndFromParm(0);
int a=GetIntFromParm(1); int a=GetIntFromParm(1);
if (parm2) log_printf(_T("HideWindow")); if (parm2) log_printf(_T("HideWindow"));
if (!parm3) if (!parm3)
@ -1077,7 +1078,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef _UNICODE #ifdef _UNICODE
hres = ppf->lpVtbl->Save(ppf,buf1,TRUE); hres = ppf->lpVtbl->Save(ppf,buf1,TRUE);
#else #else
WCHAR *wsz = (LPWSTR) buf2; // buf2...buf3 = WCHAR wsz[NSIS_MAX_STRLEN] WCHAR *wsz = (LPWSTR) buf2; // buf2 + buf3 = WCHAR wsz[NSIS_MAX_STRLEN]
hres = E_FAIL; hres = E_FAIL;
if (MultiByteToWideChar(CP_ACP,0,buf1,-1,wsz,NSIS_MAX_STRLEN)) if (MultiByteToWideChar(CP_ACP,0,buf1,-1,wsz,NSIS_MAX_STRLEN))
hres = ppf->lpVtbl->Save(ppf,wsz,TRUE); hres = ppf->lpVtbl->Save(ppf,wsz,TRUE);
@ -1162,18 +1163,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
mystrcpy(buf1,_T("<RM>")); mystrcpy(buf1,_T("<RM>"));
mystrcpy(buf2,buf1); mystrcpy(buf2,buf1);
#endif #endif
if (parm0) if (parm0) sec=GetStringFromParm(0x00);
{ if (parm1) key=GetStringFromParm(0x11);
sec=GetStringFromParm(0x00); if (parm4) str=GetStringFromParm(0x22);
}
if (parm1)
{
key=GetStringFromParm(0x11);
}
if (parm4)
{
str=GetStringFromParm(0x22);
}
buf3=GetStringFromParm(-0x33); buf3=GetStringFromParm(-0x33);
log_printf5(_T("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++; if (!WritePrivateProfileString(sec,key,str,buf3)) exec_error++;
@ -1346,7 +1338,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_FCLOSE: case EW_FCLOSE:
{ {
TCHAR *t=var0; TCHAR *t=var0;
if (*t) CloseHandle((HANDLE)myatoi(t)); if (*t) CloseHandle((HANDLE)strtoiptr(t));
} }
break; break;
case EW_FOPEN: case EW_FOPEN:
@ -1362,7 +1354,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
else else
{ {
myitoa(handleout,(int)h); iptrtostr(handleout,(INT_PTR)h);
} }
} }
break; break;
@ -1393,7 +1385,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{ {
l=mystrlen(GetStringFromParm(0x11))*sizeof(TCHAR); l=mystrlen(GetStringFromParm(0x11))*sizeof(TCHAR);
} }
if (!*t || !WriteFile((HANDLE)myatoi(t),buf1,l,&dw,NULL)) if (!*t || !WriteFile((HANDLE)strtoiptr(t),buf1,l,&dw,NULL))
{ {
exec_error++; exec_error++;
} }
@ -1414,7 +1406,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (*hptr) if (*hptr)
{ {
TCHAR lc=0; TCHAR lc=0;
HANDLE h=(HANDLE)myatoi(hptr); HANDLE h=(HANDLE)strtoiptr(hptr);
while (rpos<maxlen) while (rpos<maxlen)
{ {
TCHAR c; TCHAR c;
@ -1468,7 +1460,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
TCHAR *t=var0; TCHAR *t=var0;
if (*t) if (*t)
{ {
DWORD v=SetFilePointer((HANDLE)myatoi(t),GetIntFromParm(2),NULL,parm3); // TODO: Use SetFilePointerEx for > 4GB support on _WIN64
DWORD v=SetFilePointer((HANDLE)strtoiptr(t),GetIntFromParm(2),NULL,parm3);
if (parm1>=0) if (parm1>=0)
{ {
@ -1482,7 +1475,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_FINDCLOSE: case EW_FINDCLOSE:
{ {
TCHAR *t=var0; TCHAR *t=var0;
if (*t) FindClose((HANDLE)myatoi(t)); if (*t) FindClose((HANDLE)strtoiptr(t));
} }
break; break;
case EW_FINDNEXT: case EW_FINDNEXT:
@ -1490,7 +1483,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
TCHAR *textout=var0; TCHAR *textout=var0;
TCHAR *t=var1; TCHAR *t=var1;
WIN32_FIND_DATA fd; WIN32_FIND_DATA fd;
if (*t && FindNextFile((HANDLE)myatoi(t),&fd)) if (*t && FindNextFile((HANDLE)strtoiptr(t),&fd))
{ {
mystrcpy(textout,fd.cFileName); mystrcpy(textout,fd.cFileName);
} }
@ -1518,7 +1511,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
} }
else else
{ {
myitoa(handleout,(int)h); iptrtostr(handleout,(INT_PTR)h);
mystrcpy(textout,fd.cFileName); mystrcpy(textout,fd.cFileName);
} }
} }

View file

@ -603,16 +603,20 @@ void NSISCALL myRegGetStr(HKEY root, const TCHAR *sub, const TCHAR *name, TCHAR
} }
} }
void NSISCALL myitoa(TCHAR *s, int d) void NSISCALL iptrtostr(TCHAR *s, INT_PTR d)
{ {
#ifdef _WIN64
static const TCHAR c[] = _T("%I64d");
#else
static const TCHAR c[] = _T("%d"); static const TCHAR c[] = _T("%d");
#endif
wsprintf(s,c,d); wsprintf(s,c,d);
} }
int NSISCALL myatoi(TCHAR *s) INT_PTR NSISCALL strtoiptr(const TCHAR *s)
{ {
unsigned int v=0; UINT_PTR v=0;
int sign=1; // sign of positive INT_PTR sign=1; // sign of positive
TCHAR m=10; // base of 10 TCHAR m=10; // base of 10
TCHAR t=_T('9'); // cap top of numbers at 9 TCHAR t=_T('9'); // cap top of numbers at 9
@ -647,7 +651,7 @@ int NSISCALL myatoi(TCHAR *s)
v*=m; v*=m;
v+=c; v+=c;
} }
return ((int)v)*sign; return ((INT_PTR)v)*sign;
} }
// Straight copies of selected shell functions. Calling local functions // Straight copies of selected shell functions. Calling local functions
@ -813,7 +817,7 @@ TCHAR * NSISCALL GetNSISString(TCHAR *outbuf, int strtab)
else if (nVarIdx == NS_VAR_CODE) else if (nVarIdx == NS_VAR_CODE)
{ {
if (nData == 29) // $HWNDPARENT if (nData == 29) // $HWNDPARENT
myitoa(out, (unsigned int) g_hwnd); iptrtostr(out, (INT_PTR) g_hwnd);
else else
mystrcpy(out, g_usrvars[nData]); mystrcpy(out, g_usrvars[nData]);
// validate the directory name // validate the directory name

View file

@ -33,8 +33,10 @@ TCHAR * NSISCALL GetNSISString(TCHAR *outbuf, int strtab);
#define GetNSISTab(strtab) (strtab < 0 ? LANG_STR_TAB(strtab) : strtab) #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); void NSISCALL myRegGetStr(HKEY root, const TCHAR *sub, const TCHAR *name, TCHAR *out, int x64);
int NSISCALL myatoi(TCHAR *s); #define myatoi(s) ( (int)strtoiptr(s) )
void NSISCALL myitoa(TCHAR *s, int d); INT_PTR NSISCALL strtoiptr(const TCHAR *s);
#define myitoa iptrtostr
void NSISCALL iptrtostr(TCHAR *s, INT_PTR d);
TCHAR * NSISCALL mystrcpy(TCHAR *out, const TCHAR *in); TCHAR * NSISCALL mystrcpy(TCHAR *out, const TCHAR *in);
int NSISCALL mystrlen(const TCHAR *in); int NSISCALL mystrlen(const TCHAR *in);
TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat); TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat);