Minor 64-bit System fix

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6924 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2017-10-07 18:56:03 +00:00
parent b8b89f75a5
commit 0892948657
2 changed files with 15 additions and 13 deletions

View file

@ -513,7 +513,7 @@ params_loop:
cmp dword ptr [eax+esi],2 cmp dword ptr [eax+esi],2
jne params_default jne params_default
;# Long type ;# Long type 'L'/'l' (64-bit)
push dword ptr [eax+ebx] push dword ptr [eax+ebx]
params_default: params_default:
@ -782,7 +782,7 @@ FUNC_DECL _RealCallBack
mov dword ptr [ebp-8],ebp mov dword ptr [ebp-8],ebp
add dword ptr [ebp-8],8 add dword ptr [ebp-8],8
;# Our callback proc ;# Our callback proc is in eax (set by the thunk created in CreateCallback)
mov dword ptr [ebp-4],eax mov dword ptr [ebp-4],eax
IFDEF SYSTEM_LOG_DEBUG IFDEF SYSTEM_LOG_DEBUG

View file

@ -48,8 +48,8 @@ static const int ByteSizeByType[8] = {
1, // PAT_INT 1, // PAT_INT
1, // PAT_LONG 1, // PAT_LONG
1, // PAT_STRING 1, // PAT_STRING
2, // PAT_WSTRING (special case for &wN notation: N is a number of WCHAR, not a number of bytes) 2, // PAT_WSTRING (Special case for &wN notation: N is a number of WCHAR, not a number of bytes)
1, // PAT_GUID 1, // PAT_GUID (Must stay 1 for compatibility with the old '*(&g16,i)i.s' syntax)
1, // PAT_CALLBACK 1, // PAT_CALLBACK
1 // PAT_REGMEM 1 // PAT_REGMEM
}; };
@ -571,7 +571,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
// Is it '::' // Is it '::'
if ((*(ib) == _T('-')) && (*(ib+1) == _T('>'))) if ((*(ib) == _T('-')) && (*(ib+1) == _T('>')))
{ {
ProcType = PT_VTABLEPROC; ProcType = PT_VTABLEPROC;
} else } else
{ {
if ((*(ib+1) != _T(':')) || (*(ib) == _T('-'))) break; if ((*(ib+1) != _T(':')) || (*(ib) == _T('-'))) break;
@ -695,7 +695,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
break; break;
case _T('s'): case _T('s'):
case _T('S'): temp4 = -1; break; // Stack case _T('S'): temp4 = -1; break; // Stack
case _T('c'): case _T('c'):
case _T('C'): temp4 = INST_CMDLINE+1; break; case _T('C'): temp4 = INST_CMDLINE+1; break;
case _T('d'): case _T('d'):
@ -716,8 +716,8 @@ SystemProc *PrepareProc(BOOL NeedForCall)
proc->Params[ParamIndex].Type = temp2; proc->Params[ParamIndex].Type = temp2;
proc->Params[ParamIndex].Size = // Pointer sized or from type proc->Params[ParamIndex].Size = // Pointer sized or from type
(temp == -1)?(PARAMSIZEBYTYPE_PTR):((psbt>0)?(psbt):(1)); //BUGBUG64: Is it safe to fallback to 1 for CALLBACK? (temp == -1)?(PARAMSIZEBYTYPE_PTR):((psbt>0)?(psbt):(1)); //BUGBUG64: Is it safe to fallback to 1 for CALLBACK?
// Get the parameter real special option value if (temp == 1) temp = // Get the parameter real special option value
if (temp == 1) temp = ((int) GetIntFromString(&ib)) + 1; ((int) GetIntFromString(&ib)) + 1; // Read '&' type size specification
proc->Params[ParamIndex].Option = temp; proc->Params[ParamIndex].Option = temp;
proc->Params[ParamIndex].Value = 0; proc->Params[ParamIndex].Value = 0;
proc->Params[ParamIndex].Input = IOT_NONE; proc->Params[ParamIndex].Input = IOT_NONE;
@ -903,7 +903,9 @@ void ParamsIn(SystemProc *proc)
#ifndef _UNICODE #ifndef _UNICODE
LPWSTR wstr; LPWSTR wstr;
#endif #endif
#if !defined(_WIN64) && defined(C_ASSERT)
C_ASSERT(FIELD_OFFSET(ProcParameter, Value) + sizeof(int) == FIELD_OFFSET(ProcParameter, _value)); // Make sure PAT_LONG writes to the correct places
#endif
i = (proc->ParamCount > 0)?(1):(0); i = (proc->ParamCount > 0)?(1):(0);
while (TRUE) while (TRUE)
{ {
@ -1078,7 +1080,7 @@ void ParamsOut(SystemProc *proc)
#endif #endif
break; break;
case PAT_CALLBACK: case PAT_CALLBACK:
wsprintf(realbuf, _T("%d"), BUGBUG64(proc->Params[i].Value)); wsprintf(realbuf, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), proc->Params[i].Value);
break; break;
} }
@ -1160,7 +1162,7 @@ HANDLE CreateCallback(SystemProc *cbproc)
void CallStruct(SystemProc *proc) void CallStruct(SystemProc *proc)
{ {
BOOL ssflag; BOOL ssflag; // "&l" struct size syntax
int i, structsize = 0, size = 0; int i, structsize = 0, size = 0;
char *st, *ptr; char *st, *ptr;
@ -1213,7 +1215,7 @@ void CallStruct(SystemProc *proc)
} }
else else
{ {
const int intmask[4] = {0xFFFFFFFF, 0x000000FF, 0x0000FFFF, 0x00FFFFFF}; static const int intmask[4] = {0xFFFFFFFF, 0x000000FF, 0x0000FFFF, 0x00FFFFFF};
// Special // Special
size = (proc->Params[i].Option-1) * ByteSizeByType[proc->Params[i].Type]; size = (proc->Params[i].Option-1) * ByteSizeByType[proc->Params[i].Type];
@ -1236,8 +1238,8 @@ void CallStruct(SystemProc *proc)
break; break;
case PAT_STRING: case PAT_STRING:
case PAT_GUID:
case PAT_WSTRING: case PAT_WSTRING:
case PAT_GUID:
// Jim Park: Pointer for memcopy, so keep as char* // Jim Park: Pointer for memcopy, so keep as char*
ptr = (char*) proc->Params[i].Value; break; ptr = (char*) proc->Params[i].Value; break;
} }