From 96a524c1b7913400c4863f56b3d92bde81dfc562 Mon Sep 17 00:00:00 2001 From: kichik Date: Fri, 18 Apr 2003 11:21:06 +0000 Subject: [PATCH] (brainsucker) fixed a bug with calling proc(void) and added e switch to get GetLastError return value. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2465 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/System/Source/System.c | 23 +++++++++++++++++++---- Contrib/System/Source/System.h | 3 ++- Contrib/System/System.txt | 1 + Plugins/System.dll | Bin 9216 -> 9728 bytes 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Contrib/System/Source/System.c b/Contrib/System/Source/System.c index cd6edbfe..237259da 100644 --- a/Contrib/System/Source/System.c +++ b/Contrib/System/Source/System.c @@ -27,6 +27,7 @@ int ParamSizeByType[6] = {0, // PAT_VOID (Size will be equal to 1) int z1, z2; // I've made them static for easier use at callback procs int LastStackPlace = 0; int LastStackReal = 0; +DWORD LastError = 0; SystemProc *LastProc = NULL; int CallbackIndex = 0; HINSTANCE g_hInstance; @@ -211,10 +212,15 @@ PLUGINFUNCTION(Call) ParamsOut(proc); } - // Deallocate params if not callback if (proc->ProcResult != PR_CALLBACK) + { + // Deallocate params if not callback ParamsDeAllocate(proc); + // In case of POPT_ERROR - first pop will be proc error + if ((proc->Options & POPT_ERROR) != 0) pushint(LastError); + } + // If proc is permanent? if ((proc->Options & POPT_PERMANENT) == 0) GlobalFree((HANDLE) proc); // No, free it @@ -546,6 +552,9 @@ SystemProc *PrepareProc(BOOL NeedForCall) case 's': temp2 = POPT_GENSTACK; break; + case 'e': + temp2 = POPT_ERROR; + break; } // New Options @@ -626,8 +635,8 @@ void ParamsIn(SystemProc *proc) int i, *place; char *realbuf; - i = 1; - do + i = (proc->ParamCount > 0)?(1):(0); + while (TRUE) { // Step 1: retrive value if ((proc->Params[i].Input == IOT_NONE) || (proc->Params[i].Input == IOT_INLINE)) @@ -684,10 +693,10 @@ void ParamsIn(SystemProc *proc) } #endif + if (i == 0) break; if (i == proc->ParamCount) i = 0; else i++; } - while (i != 1); } void ParamsDeAllocate(SystemProc *proc) @@ -889,6 +898,12 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc) // Proc result: OK proc->ProcResult = PR_OK; + // In case of POPT_ERROR -> GetLastError + if ((proc->Options & POPT_ERROR) != 0) + { + LastError = GetLastError(); + } + SYSTEM_EVENT("\n\t\t\tAfter call ") #ifdef SYSTEM_LOG_DEBUG { diff --git a/Contrib/System/Source/System.h b/Contrib/System/Source/System.h index 7b82b742..2ce5c50e 100644 --- a/Contrib/System/Source/System.h +++ b/Contrib/System/Source/System.h @@ -45,7 +45,8 @@ #define POPT_ALWRETURN 0x4 // Always return #define POPT_NEVERREDEF 0x8 // Never redefine #define POPT_GENSTACK 0x10 // Use general stack (non temporary for callback) -#define POPT_CLONE 0x20 // This is clone callback +#define POPT_ERROR 0x20 // Call GetLastError after proc and push it to stack +#define POPT_CLONE 0x40 // This is clone callback // Our single proc parameter typedef struct diff --git a/Contrib/System/System.txt b/Contrib/System/System.txt index 62daedf4..f7d18264 100644 --- a/Contrib/System/System.txt +++ b/Contrib/System/System.txt @@ -159,6 +159,7 @@ return place. redefined either by GET or CALL. This options is never inherited to childs. s - use general Stack. Whenever the first callback defined the system starts using the temporary stacks for function calls. + e - call GetLastError() after procedure end and push result on stack, ---------------------------------- Callback: diff --git a/Plugins/System.dll b/Plugins/System.dll index c99d780cf6f7e3584941106f1173ff1596312c02..c66c50376fa2e852a7968a8339bff644a8f41007 100644 GIT binary patch delta 2763 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