diff --git a/Contrib/System/Source/Call-amd64.S b/Contrib/System/Source/Call-amd64.S index eccb3dcb..3cdfd576 100644 --- a/Contrib/System/Source/Call-amd64.S +++ b/Contrib/System/Source/Call-amd64.S @@ -62,19 +62,15 @@ IF 0 ENDIF -EXTERN __imp_GetLastError : PROC IFDEF SYSTEM_LOG_DEBUG EXTERN __imp_IsDebuggerPresent : PROC ENDIF -EXTERN LastError : DWORD - EXTERN GetProcOffset : PROC EXTERN GetParamsOffset : PROC EXTERN GetSizeOfProcParam : PROC EXTERN GetValueOffsetParam : PROC -EXTERN SetProcResultOk : PROC -EXTERN GetErrorOption : PROC +EXTERN SetCallProcResultValues : PROC SECTION_CODE @@ -161,27 +157,11 @@ callthefunc: mov r10, qword ptr [pSystemProc+rax] xor rax, rax ;# Fix bug #1535007 call r10 - mov r13, rax ;# Save return value - mov rcx, pSystemProc - call GetErrorOption - test eax, eax - jz capturegle_done - call qword ptr [__imp_GetLastError] - mov dword ptr [LastError], eax -capturegle_done: + mov rdx, rax ;# Return value + call SetCallProcResultValues ;# Store GetLastError() and return value + ;# mov rax, pSystemProc has been performed by SetCallProcResultValues - ;# 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: ;# 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? diff --git a/Contrib/System/Source/Call.S b/Contrib/System/Source/Call.S index ec42dc2b..28aa04ca 100644 --- a/Contrib/System/Source/Call.S +++ b/Contrib/System/Source/Call.S @@ -146,7 +146,6 @@ ENDIF EXTERN __alloca_probe : PROC EXTERN __imp__GlobalFree@4 : PROC -EXTERN __imp__GetLastError@0 : PROC IFDEF _UNICODE EXTERN __imp__wsprintfW : PROC @@ -158,7 +157,6 @@ EXTERN _GlobalCopy : PROC EXTERN _LastStackPlace : DWORD EXTERN _LastStackReal : DWORD -EXTERN _LastError : DWORD EXTERN _LastProc : DWORD EXTERN _CallbackIndex : DWORD @@ -168,7 +166,6 @@ EXTERN _retaddr : PTR EXTERN _GetNewStackSize : PROC EXTERN _GetGenStackOption : PROC EXTERN _GetCDeclOption : PROC -EXTERN _GetErrorOption : PROC EXTERN _GetProcOffset : PROC EXTERN _GetCloneOffset : PROC EXTERN _GetProcNameOffset : PROC @@ -180,7 +177,7 @@ EXTERN _GetSizeOffsetParam : PROC EXTERN _GetValueOffsetParam : PROC EXTERN _Get_valueOffsetParam : PROC EXTERN _SetCloneOption : PROC -EXTERN _SetProcResultOk : PROC +EXTERN _SetCallProcResultValues@12 : PROC EXTERN _SetProcResultCallback : PROC SECTION_DATA @@ -566,7 +563,7 @@ params_loop_done: ;# Call call ecx - ;# Return + ;# Save return mov dword ptr [_z1],eax mov dword ptr [_z2],edx @@ -707,34 +704,11 @@ stack_clear_done: stack_cleanup_done: ;# Save return - - ;# Get offset for element Params of SystemProc structure - 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 [_z2] + push dword ptr [_z1] push dword ptr [ebp+8] - call _SetProcResultOk - ;# 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 + call _SetCallProcResultValues@12 -handling_error_option_done: IFDEF SYSTEM_LOG_DEBUG SYSTEM_EVENT offset LogAfterCall diff --git a/Contrib/System/Source/System.c b/Contrib/System/Source/System.c index 99754c7d..dce1a097 100644 --- a/Contrib/System/Source/System.c +++ b/Contrib/System/Source/System.c @@ -68,11 +68,7 @@ HANDLE retaddr; static TCHAR *MakeResultStr(SystemProc *proc, TCHAR *buf) { - if (proc->ProcResult == PR_OK) - lstrcpy(buf, _T("ok")); - else if (proc->ProcResult == PR_ERROR) - lstrcpy(buf, _T("error")); - else if (proc->ProcResult == PR_CALLBACK) + if (proc->ProcResult == PR_CALLBACK) { INT_PTR id = proc->CallbackIndex; #ifdef POPT_SYNTAX2 @@ -81,6 +77,13 @@ static TCHAR *MakeResultStr(SystemProc *proc, TCHAR *buf) #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! } + else + { + const TCHAR *resstr = _T("error"); + if (proc->ProcResult == PR_OK) + resstr = _T("ok"); + lstrcpy(buf, resstr); + } return buf; } @@ -1437,7 +1440,7 @@ unsigned int GetCDeclOption(SystemProc *proc) /* 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); } @@ -1535,7 +1538,7 @@ void SetCloneOption(SystemProc *proc) /* Sets Result of procedure call to be "OK" */ -void SetProcResultOk(SystemProc *proc) +static void SetProcResultOk(SystemProc *proc) { proc->ProcResult = PR_OK; } @@ -1547,3 +1550,15 @@ void SetProcResultCallback(SystemProc *proc) { 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; +}