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;
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
// 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);

View file

@ -632,7 +632,7 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
SetDlgItemText(hwndDlg,IDC_INSTPATH,gp_poi);
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,
OUT_CHARACTER_PRECIS,

View file

@ -113,7 +113,9 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
// mingw32 and w64-mingw32 do not define ULONG_PTR
// but rather declare ULONG_PTR via typedef (see basetsd.h)
#if !defined(__MINGW32__) && !defined(ULONG_PTR)
# define ULONG_PTR unsigned long
# ifndef _WIN64
# define ULONG_PTR unsigned long
# endif
#endif
#ifdef __cplusplus
@ -248,6 +250,13 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
# define ZeroMemory(x, y) memset(x, 0, y)
#endif
#ifndef _WIN64
# ifndef GCLP_HICON
# define GCLP_HICON GCL_HICON
# define SetClassLongPtr SetClassLong
# endif
#endif
// defines
#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_hwndCancel=GetDlgItem(hwndDlg,IDCANCEL);
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
//SendMessage(hwndDlg,WM_SETICON,ICON_BIG,(LPARAM)g_hIcon);
#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]);
}
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
// 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;
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);
switch (parm3)
{
@ -710,7 +712,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
TCHAR *buf0=GetStringFromParm(0x01);
wsprintf(var0,
buf0,
GetIntFromParm(2));
GetIntPtrFromParm(2));
}
break;
#endif//NSIS_SUPPORT_INTOPTS
@ -758,15 +760,15 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_FINDWINDOW:
case EW_SENDMESSAGE:
{
int v;
int b3=GetIntFromParm(3);
int b4=GetIntFromParm(4);
if (parm5&1) b3=(int)GetStringFromParm(0x33);
if (parm5&2) b4=(int)GetStringFromParm(0x44);
LRESULT v;
INT_PTR b3=GetIntPtrFromParm(3);
INT_PTR b4=GetIntPtrFromParm(4);
if (parm5&1) b3=(INT_PTR)GetStringFromParm(0x33);
if (parm5&2) b4=(INT_PTR)GetStringFromParm(0x44);
if (which == EW_SENDMESSAGE)
{
HWND hwnd=(HWND)GetIntFromParm(1);
HWND hwnd=GetHwndFromParm(1);
int msg=GetIntFromParm(2);
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 *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)
myitoa(var0,v);
if (parm0>=0) iptrtostr(var0,v);
}
break;
case EW_ISWINDOW:
if (IsWindow((HWND)GetIntFromParm(0))) return parm1;
if (IsWindow(GetHwndFromParm(0))) return parm1;
return parm2;
#ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT
case EW_GETDLGITEM:
myitoa(
iptrtostr(
var0,
(int)GetDlgItem(
(HWND)GetIntFromParm(1),
(INT_PTR)GetDlgItem(
GetHwndFromParm(1),
GetIntFromParm(2)
)
);
@ -802,7 +803,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_SETCTLCOLORS:
{
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;
case EW_SETBRANDINGIMAGE:
@ -841,12 +842,12 @@ static int NSISCALL ExecuteEntry(entry *entry_)
f.lfStrikeOut=parm4&4;
f.lfCharSet=DEFAULT_CHARSET;
GetNSISString(f.lfFaceName,parm1);
myitoa(var0,(int)CreateFontIndirect(&f));
iptrtostr(var0,(INT_PTR)CreateFontIndirect(&f));
}
break;
case EW_SHOWWINDOW:
{
HWND hw=(HWND)GetIntFromParm(0);
HWND hw=GetHwndFromParm(0);
int a=GetIntFromParm(1);
if (parm2) log_printf(_T("HideWindow"));
if (!parm3)
@ -1077,7 +1078,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
#ifdef _UNICODE
hres = ppf->lpVtbl->Save(ppf,buf1,TRUE);
#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;
if (MultiByteToWideChar(CP_ACP,0,buf1,-1,wsz,NSIS_MAX_STRLEN))
hres = ppf->lpVtbl->Save(ppf,wsz,TRUE);
@ -1162,18 +1163,9 @@ static int NSISCALL ExecuteEntry(entry *entry_)
mystrcpy(buf1,_T("<RM>"));
mystrcpy(buf2,buf1);
#endif
if (parm0)
{
sec=GetStringFromParm(0x00);
}
if (parm1)
{
key=GetStringFromParm(0x11);
}
if (parm4)
{
str=GetStringFromParm(0x22);
}
if (parm0) sec=GetStringFromParm(0x00);
if (parm1) key=GetStringFromParm(0x11);
if (parm4) str=GetStringFromParm(0x22);
buf3=GetStringFromParm(-0x33);
log_printf5(_T("WriteINIStr: wrote [%s] %s=%s in %s"),buf0,buf1,buf2,buf3);
if (!WritePrivateProfileString(sec,key,str,buf3)) exec_error++;
@ -1346,7 +1338,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_FCLOSE:
{
TCHAR *t=var0;
if (*t) CloseHandle((HANDLE)myatoi(t));
if (*t) CloseHandle((HANDLE)strtoiptr(t));
}
break;
case EW_FOPEN:
@ -1362,7 +1354,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
else
{
myitoa(handleout,(int)h);
iptrtostr(handleout,(INT_PTR)h);
}
}
break;
@ -1393,7 +1385,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
{
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++;
}
@ -1414,7 +1406,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (*hptr)
{
TCHAR lc=0;
HANDLE h=(HANDLE)myatoi(hptr);
HANDLE h=(HANDLE)strtoiptr(hptr);
while (rpos<maxlen)
{
TCHAR c;
@ -1468,7 +1460,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
TCHAR *t=var0;
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)
{
@ -1482,7 +1475,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
case EW_FINDCLOSE:
{
TCHAR *t=var0;
if (*t) FindClose((HANDLE)myatoi(t));
if (*t) FindClose((HANDLE)strtoiptr(t));
}
break;
case EW_FINDNEXT:
@ -1490,7 +1483,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
TCHAR *textout=var0;
TCHAR *t=var1;
WIN32_FIND_DATA fd;
if (*t && FindNextFile((HANDLE)myatoi(t),&fd))
if (*t && FindNextFile((HANDLE)strtoiptr(t),&fd))
{
mystrcpy(textout,fd.cFileName);
}
@ -1518,7 +1511,7 @@ static int NSISCALL ExecuteEntry(entry *entry_)
}
else
{
myitoa(handleout,(int)h);
iptrtostr(handleout,(INT_PTR)h);
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");
#endif
wsprintf(s,c,d);
}
int NSISCALL myatoi(TCHAR *s)
INT_PTR NSISCALL strtoiptr(const TCHAR *s)
{
unsigned int v=0;
int sign=1; // sign of positive
UINT_PTR v=0;
INT_PTR sign=1; // sign of positive
TCHAR m=10; // base of 10
TCHAR t=_T('9'); // cap top of numbers at 9
@ -647,7 +651,7 @@ int NSISCALL myatoi(TCHAR *s)
v*=m;
v+=c;
}
return ((int)v)*sign;
return ((INT_PTR)v)*sign;
}
// 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)
{
if (nData == 29) // $HWNDPARENT
myitoa(out, (unsigned int) g_hwnd);
iptrtostr(out, (INT_PTR) g_hwnd);
else
mystrcpy(out, g_usrvars[nData]);
// 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)
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);
#define myatoi(s) ( (int)strtoiptr(s) )
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);
int NSISCALL mystrlen(const TCHAR *in);
TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat);