Use a common helper function to set the CallProc result
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7009 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
a39cba6f27
commit
47b28a80a7
3 changed files with 31 additions and 62 deletions
|
@ -62,19 +62,15 @@ IF 0
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
|
|
||||||
EXTERN __imp_GetLastError : PROC
|
|
||||||
IFDEF SYSTEM_LOG_DEBUG
|
IFDEF SYSTEM_LOG_DEBUG
|
||||||
EXTERN __imp_IsDebuggerPresent : PROC
|
EXTERN __imp_IsDebuggerPresent : PROC
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
EXTERN LastError : DWORD
|
|
||||||
|
|
||||||
EXTERN GetProcOffset : PROC
|
EXTERN GetProcOffset : PROC
|
||||||
EXTERN GetParamsOffset : PROC
|
EXTERN GetParamsOffset : PROC
|
||||||
EXTERN GetSizeOfProcParam : PROC
|
EXTERN GetSizeOfProcParam : PROC
|
||||||
EXTERN GetValueOffsetParam : PROC
|
EXTERN GetValueOffsetParam : PROC
|
||||||
EXTERN SetProcResultOk : PROC
|
EXTERN SetCallProcResultValues : PROC
|
||||||
EXTERN GetErrorOption : PROC
|
|
||||||
|
|
||||||
|
|
||||||
SECTION_CODE
|
SECTION_CODE
|
||||||
|
@ -161,27 +157,11 @@ callthefunc:
|
||||||
mov r10, qword ptr [pSystemProc+rax]
|
mov r10, qword ptr [pSystemProc+rax]
|
||||||
xor rax, rax ;# Fix bug #1535007
|
xor rax, rax ;# Fix bug #1535007
|
||||||
call r10
|
call r10
|
||||||
mov r13, rax ;# Save return value
|
|
||||||
|
|
||||||
mov rcx, pSystemProc
|
mov rcx, pSystemProc
|
||||||
call GetErrorOption
|
mov rdx, rax ;# Return value
|
||||||
test eax, eax
|
call SetCallProcResultValues ;# Store GetLastError() and return value
|
||||||
jz capturegle_done
|
;# mov rax, pSystemProc has been performed by SetCallProcResultValues
|
||||||
call qword ptr [__imp_GetLastError]
|
|
||||||
mov dword ptr [LastError], eax
|
|
||||||
capturegle_done:
|
|
||||||
|
|
||||||
;# proc->Params[0].Value = pSystemProc->Proc's return value
|
|
||||||
call GetParamsOffset
|
|
||||||
mov rdx, rax ;# This assumes that the next function is not going to clobber rdx!
|
|
||||||
call GetValueOffsetParam
|
|
||||||
add rdx, rax
|
|
||||||
mov qword ptr [pSystemProc+rdx], r13
|
|
||||||
|
|
||||||
mov rcx, pSystemProc
|
|
||||||
call SetProcResultOk ;# BUGBUG: This is pointless, system.c should just assume we are OK
|
|
||||||
|
|
||||||
mov rax, pSystemProc ;# Return SystemProc*
|
|
||||||
;# Epilog:
|
;# Epilog:
|
||||||
;# http://msdn.microsoft.com/en-us/library/tawsa7cb claims that only
|
;# http://msdn.microsoft.com/en-us/library/tawsa7cb claims that only
|
||||||
;# add/lea rsp and pop is valid in the epilog. Unwind might fail on our version?
|
;# add/lea rsp and pop is valid in the epilog. Unwind might fail on our version?
|
||||||
|
|
|
@ -146,7 +146,6 @@ ENDIF
|
||||||
EXTERN __alloca_probe : PROC
|
EXTERN __alloca_probe : PROC
|
||||||
|
|
||||||
EXTERN __imp__GlobalFree@4 : PROC
|
EXTERN __imp__GlobalFree@4 : PROC
|
||||||
EXTERN __imp__GetLastError@0 : PROC
|
|
||||||
|
|
||||||
IFDEF _UNICODE
|
IFDEF _UNICODE
|
||||||
EXTERN __imp__wsprintfW : PROC
|
EXTERN __imp__wsprintfW : PROC
|
||||||
|
@ -158,7 +157,6 @@ EXTERN _GlobalCopy : PROC
|
||||||
|
|
||||||
EXTERN _LastStackPlace : DWORD
|
EXTERN _LastStackPlace : DWORD
|
||||||
EXTERN _LastStackReal : DWORD
|
EXTERN _LastStackReal : DWORD
|
||||||
EXTERN _LastError : DWORD
|
|
||||||
EXTERN _LastProc : DWORD
|
EXTERN _LastProc : DWORD
|
||||||
EXTERN _CallbackIndex : DWORD
|
EXTERN _CallbackIndex : DWORD
|
||||||
|
|
||||||
|
@ -168,7 +166,6 @@ EXTERN _retaddr : PTR
|
||||||
EXTERN _GetNewStackSize : PROC
|
EXTERN _GetNewStackSize : PROC
|
||||||
EXTERN _GetGenStackOption : PROC
|
EXTERN _GetGenStackOption : PROC
|
||||||
EXTERN _GetCDeclOption : PROC
|
EXTERN _GetCDeclOption : PROC
|
||||||
EXTERN _GetErrorOption : PROC
|
|
||||||
EXTERN _GetProcOffset : PROC
|
EXTERN _GetProcOffset : PROC
|
||||||
EXTERN _GetCloneOffset : PROC
|
EXTERN _GetCloneOffset : PROC
|
||||||
EXTERN _GetProcNameOffset : PROC
|
EXTERN _GetProcNameOffset : PROC
|
||||||
|
@ -180,7 +177,7 @@ EXTERN _GetSizeOffsetParam : PROC
|
||||||
EXTERN _GetValueOffsetParam : PROC
|
EXTERN _GetValueOffsetParam : PROC
|
||||||
EXTERN _Get_valueOffsetParam : PROC
|
EXTERN _Get_valueOffsetParam : PROC
|
||||||
EXTERN _SetCloneOption : PROC
|
EXTERN _SetCloneOption : PROC
|
||||||
EXTERN _SetProcResultOk : PROC
|
EXTERN _SetCallProcResultValues@12 : PROC
|
||||||
EXTERN _SetProcResultCallback : PROC
|
EXTERN _SetProcResultCallback : PROC
|
||||||
|
|
||||||
SECTION_DATA
|
SECTION_DATA
|
||||||
|
@ -566,7 +563,7 @@ params_loop_done:
|
||||||
;# Call
|
;# Call
|
||||||
call ecx
|
call ecx
|
||||||
|
|
||||||
;# Return
|
;# Save return
|
||||||
mov dword ptr [_z1],eax
|
mov dword ptr [_z1],eax
|
||||||
mov dword ptr [_z2],edx
|
mov dword ptr [_z2],edx
|
||||||
|
|
||||||
|
@ -707,34 +704,11 @@ stack_clear_done:
|
||||||
stack_cleanup_done:
|
stack_cleanup_done:
|
||||||
|
|
||||||
;# Save return
|
;# Save return
|
||||||
|
push dword ptr [_z2]
|
||||||
;# Get offset for element Params of SystemProc structure
|
push dword ptr [_z1]
|
||||||
call _GetParamsOffset
|
|
||||||
mov edx,dword ptr [ebp+8]
|
|
||||||
add edx,eax
|
|
||||||
|
|
||||||
;# proc->Params[0].Value = Low double word of result
|
|
||||||
call _GetValueOffsetParam
|
|
||||||
mov ecx,dword ptr [_z1]
|
|
||||||
mov dword ptr [edx+eax],ecx
|
|
||||||
|
|
||||||
;# proc->Params[0]._value = High double word of result
|
|
||||||
call _Get_valueOffsetParam
|
|
||||||
mov ecx,dword ptr [_z2]
|
|
||||||
mov dword ptr [edx+eax],ecx
|
|
||||||
|
|
||||||
;# Proc result: OK
|
|
||||||
push dword ptr [ebp+8]
|
push dword ptr [ebp+8]
|
||||||
call _SetProcResultOk
|
call _SetCallProcResultValues@12
|
||||||
;# In case of POPT_ERROR -> Get_LastError
|
|
||||||
call _GetErrorOption
|
|
||||||
cmp eax,0
|
|
||||||
pop eax
|
|
||||||
je handling_error_option_done
|
|
||||||
call dword ptr [__imp__GetLastError@0]
|
|
||||||
mov dword ptr [_LastError],eax
|
|
||||||
|
|
||||||
handling_error_option_done:
|
|
||||||
IFDEF SYSTEM_LOG_DEBUG
|
IFDEF SYSTEM_LOG_DEBUG
|
||||||
SYSTEM_EVENT offset LogAfterCall
|
SYSTEM_EVENT offset LogAfterCall
|
||||||
|
|
||||||
|
|
|
@ -68,11 +68,7 @@ HANDLE retaddr;
|
||||||
|
|
||||||
static TCHAR *MakeResultStr(SystemProc *proc, TCHAR *buf)
|
static TCHAR *MakeResultStr(SystemProc *proc, TCHAR *buf)
|
||||||
{
|
{
|
||||||
if (proc->ProcResult == PR_OK)
|
if (proc->ProcResult == PR_CALLBACK)
|
||||||
lstrcpy(buf, _T("ok"));
|
|
||||||
else if (proc->ProcResult == PR_ERROR)
|
|
||||||
lstrcpy(buf, _T("error"));
|
|
||||||
else if (proc->ProcResult == PR_CALLBACK)
|
|
||||||
{
|
{
|
||||||
INT_PTR id = proc->CallbackIndex;
|
INT_PTR id = proc->CallbackIndex;
|
||||||
#ifdef POPT_SYNTAX2
|
#ifdef POPT_SYNTAX2
|
||||||
|
@ -81,6 +77,13 @@ static TCHAR *MakeResultStr(SystemProc *proc, TCHAR *buf)
|
||||||
#endif
|
#endif
|
||||||
wsprintf(buf, sizeof(void*) > 4 ? _T("callback%Id") : _T("callback%d"), id); // "%d" must match format used by system_pushintptr() in Get() because script will StrCmp!
|
wsprintf(buf, sizeof(void*) > 4 ? _T("callback%Id") : _T("callback%d"), id); // "%d" must match format used by system_pushintptr() in Get() because script will StrCmp!
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const TCHAR *resstr = _T("error");
|
||||||
|
if (proc->ProcResult == PR_OK)
|
||||||
|
resstr = _T("ok");
|
||||||
|
lstrcpy(buf, resstr);
|
||||||
|
}
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1437,7 +1440,7 @@ unsigned int GetCDeclOption(SystemProc *proc)
|
||||||
/*
|
/*
|
||||||
Returns non-zero value if Error option is set
|
Returns non-zero value if Error option is set
|
||||||
*/
|
*/
|
||||||
unsigned int GetErrorOption(SystemProc *proc)
|
static unsigned int GetErrorOption(SystemProc *proc)
|
||||||
{
|
{
|
||||||
return (proc->Options & POPT_ERROR);
|
return (proc->Options & POPT_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -1535,7 +1538,7 @@ void SetCloneOption(SystemProc *proc)
|
||||||
/*
|
/*
|
||||||
Sets Result of procedure call to be "OK"
|
Sets Result of procedure call to be "OK"
|
||||||
*/
|
*/
|
||||||
void SetProcResultOk(SystemProc *proc)
|
static void SetProcResultOk(SystemProc *proc)
|
||||||
{
|
{
|
||||||
proc->ProcResult = PR_OK;
|
proc->ProcResult = PR_OK;
|
||||||
}
|
}
|
||||||
|
@ -1547,3 +1550,15 @@ void SetProcResultCallback(SystemProc *proc)
|
||||||
{
|
{
|
||||||
proc->ProcResult = PR_CALLBACK;
|
proc->ProcResult = PR_CALLBACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SystemProc* CALLBACK SetCallProcResultValues(SystemProc *proc, ULARGE_INTEGER retval)
|
||||||
|
{
|
||||||
|
if (GetErrorOption(proc)) LastError = GetLastError();
|
||||||
|
#ifdef _WIN64
|
||||||
|
proc->Params[0].Value = retval.QuadPart;
|
||||||
|
#else
|
||||||
|
proc->Params[0].Value = retval.LowPart, proc->Params[0]._value = retval.HighPart;
|
||||||
|
#endif
|
||||||
|
SetProcResultOk(proc);
|
||||||
|
return proc;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue