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:
anders_k 2018-06-15 23:12:26 +00:00
parent a39cba6f27
commit 47b28a80a7
3 changed files with 31 additions and 62 deletions

View file

@ -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?

View file

@ -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

View file

@ -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;
}