From 3667a05636b97ae3710a9c4daad58da11aad4d4d Mon Sep 17 00:00:00 2001 From: joostverburg Date: Sat, 22 Mar 2003 11:15:53 +0000 Subject: [PATCH] Updated System plugin - Win9x fixes and more git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2350 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/System/Source/System.c | 65 +++++++++++++--------------- Contrib/System/Source/System.h | 2 +- Contrib/System/Source/System.vcproj | 2 +- Contrib/System/Source/chkstk.obj | Bin 0 -> 1387 bytes Contrib/System/SysFunc.nsh | 28 ++++++------ Contrib/System/System.nsh | 5 +++ Plugins/System.dll | Bin 9216 -> 9216 bytes 7 files changed, 51 insertions(+), 51 deletions(-) create mode 100644 Contrib/System/Source/chkstk.obj diff --git a/Contrib/System/Source/System.c b/Contrib/System/Source/System.c index 90ed75ee..113c8faa 100644 --- a/Contrib/System/Source/System.c +++ b/Contrib/System/Source/System.c @@ -567,7 +567,10 @@ void ParamsIn(SystemProc *proc) *((__int64*) place) = myatoi(realbuf); break; case PAT_STRING: - *((int*) place) = (int) AllocStr(realbuf); +/* if (proc->Params[i].Input == IOT_NONE) + *((int*) place) = (int) NULL; + else*/ + *((int*) place) = (int) AllocStr(realbuf); break; case PAT_BOOLEAN: *((int*) place) = lstrcmpi(realbuf, "true"); @@ -650,6 +653,8 @@ void ParamsOut(SystemProc *proc) while (i >= 0); } +void _alloca_probe(); + SystemProc __declspec(naked) *CallProc(SystemProc *proc) { int z3; @@ -669,22 +674,28 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc) if ((CallbackIndex > 0) && ((proc->Options & POPT_GENSTACK) == 0)) { - if (LastStackPlace == 0) - { - // Create new stack - LastStackPlace = (int) GlobalAlloc(GPTR, NEW_STACK_SIZE); - // Point to stack end - LastStackPlace += NEW_STACK_SIZE; - } - _asm { - // Save previous stack location push ebp + // Save previous stack location mov LastStackReal, esp - // Move stack pointer - mov esp, LastStackPlace } + + if (LastStackPlace == 0) + { + _asm + { + // Create new stack + mov eax, NEW_STACK_SIZE + call _alloca_probe + mov LastStackPlace, esp + } + } else + _asm + { + // Move stack pointer + mov esp, LastStackPlace + } } // Push arguments to stack @@ -735,7 +746,7 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc) // In case of cdecl convention we should clear stack if ((proc->Options & POPT_CDECL) != 0) { - if ((CallbackIndex > 0) && ((LastProc->Options & POPT_GENSTACK) == 0)) + if ((CallbackIndex > 0) && ((proc->Options & POPT_GENSTACK) == 0)) { // In case of temporary stack for (z3 = 1; z3 <= proc->ParamCount; z3++) @@ -752,6 +763,9 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc) } } + // In case of cleared call-proc-queue -> clear allocated stack place (more flexible) + if (LastProc == NULL) LastStackPlace = NULL; + // Save return proc->Params[0].Value = z1; if (proc->Params[0].Size == 2) @@ -935,6 +949,7 @@ HANDLE CreateCallback(SystemProc *cbproc) void CallStruct(SystemProc *proc) { + BOOL ssflag = FALSE; // structsize flag -> structure size should be loaded int i, structsize = 0, size = 0; char *st, *ptr; @@ -974,16 +989,12 @@ void CallStruct(SystemProc *proc) switch (proc->Params[i].Type) { case PAT_VOID: ptr = NULL; break; - case PAT_INT: - // clear unused value bits - proc->Params[i].Value &= intmask[((size >= 0) && (size < 4))?(size):(0)]; - // pointer - ptr = (char*) &(proc->Params[i].Value); - break; case PAT_LONG: // real structure size proc->Params[i].Value = structsize; proc->Params[i]._value = 0; + ssflag = TRUE; + case PAT_INT: // clear unused value bits proc->Params[i].Value &= intmask[((size >= 0) && (size < 4))?(size):(0)]; // pointer @@ -997,7 +1008,7 @@ void CallStruct(SystemProc *proc) if (ptr != NULL) { // Input - if (proc->Params[i].Input != IOT_NONE) + if ((proc->Params[i].Input != IOT_NONE) || (ssflag)) copymem(st, ptr, size); // Output @@ -1013,20 +1024,6 @@ void CallStruct(SystemProc *proc) proc->Params[0].Value = (int) proc->Proc; } - -/*__int64 __declspec(dllexport) just(__int64 a, __int64 b, __int64 *c) -{ - *c += a*b + 8402934020348; - return a*b+(*c); -}*/ - -/*typedef int (__stdcall *func)(int a, int b); - -int __declspec(dllexport) cbtest(func f) -{ - return f(5, 10); -}*/ - BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance=hInst; diff --git a/Contrib/System/Source/System.h b/Contrib/System/Source/System.h index 0676f84c..7b82b742 100644 --- a/Contrib/System/Source/System.h +++ b/Contrib/System/Source/System.h @@ -12,7 +12,7 @@ #define SYSTEM_API __declspec(dllimport) #endif -#define NEW_STACK_SIZE 65536 +#define NEW_STACK_SIZE 256*256 // Proc types: #define PT_NOTHING 0 diff --git a/Contrib/System/Source/System.vcproj b/Contrib/System/Source/System.vcproj index f4033b4d..8c557e43 100644 --- a/Contrib/System/Source/System.vcproj +++ b/Contrib/System/Source/System.vcproj @@ -83,7 +83,7 @@ Name="VCCustomBuildTool"/> w6rd3(n*FJW( z*0s)$PPS7{S2i)2q(T~9J8Ne|4 zc@&647$pv4jCcW)#1R<80;Y(Uaf5gT)5KAfh-0`#9LHVaRm>14c_LtkOXNN@`8Dp{ zF&{78oSJWYel0L>PnSyObH{XAq3zd1nL*1jZSk7kTIl*_5LO%ZGt+sx8icC`DStZH z&-Yc=m6USfz2c(hv>HKUIV_AnoG2_>+!f}6z^&W9+hPREs16`sh{*HF0Yz(4n@FnB zk64?oB)r*b*lys4?dCCS(^_!@3>?P#RuGC2DP-`DDdl~7@jhlbY>jHLNDh#5@`bNNGc4 zQng*KNDO;9q3RZ{s@U9tO^D$~F;Z!9yD;3yqMBDM>Z>~0zan!k^DXX-a!H>hc```a bRVF)%nINlHE#GfAR#kOAj`Y8xQPckg$cf%& literal 0 HcmV?d00001 diff --git a/Contrib/System/SysFunc.nsh b/Contrib/System/SysFunc.nsh index d3d86dbb..c34ffa2e 100644 --- a/Contrib/System/SysFunc.nsh +++ b/Contrib/System/SysFunc.nsh @@ -83,22 +83,17 @@ Function systemGetFileSysTime ; close file search System::Call '${sysFindClose}(r3)' - ; Create systemtime struct for system time - System::Call '*${stSYSTEMTIME} .R1' ; Create systemtime struct for local time System::Call '*${stSYSTEMTIME} .R0' ; Get File time System::Call '*$2${stWIN32_FIND_DATA} (,,, .r3)' + ; Convert file time (UTC) to local file time + System::Call '${sysFileTimeToLocalFileTime}(r3, .r1)' + ; Convert file time to system time - System::Call '${sysFileTimeToSystemTime}(r3, R1)' - - ; Convert system time to local time - System::Call '${sysSystemTimeToTzSpecificLocalTime}(0, R1, R0)' - - ; that's all, just clear used memory - System::Free $R1 + System::Call '${sysFileTimeToSystemTime}(r1, R0)' sgfst_exit: ; free used memory for WIN32_FIND_DATA struct @@ -138,22 +133,25 @@ Function systemMessageBox ; Load module and get handle System::Call '${sysLoadLibrary}($2) .r1' - IntCmp $1 0 "0" smbnext smbnext + IntCmp $1 0 0 smbnext smbnext ; Get module handle. This may look stupid (to call GetModuleHandle in case ; when the LoadLibrary doesn't works, but LoadLibrary couldn't return ; a handle to starting process (for 'i 0'). System::Call '${sysGetModuleHandle}($2) .r1' -smbnext: + ; Indicate that LoadLibrary wasn't used + StrCpy $2 1 +smbnext: ; Create MSGBOXPARAMS structure System::Call '*${stMSGBOXPARAMS}(, $HWNDPARENT, r1, r3, r4, "$5|${MB_USERICON}", $6, _) .r0' ; call MessageBoxIndirect System::Call '${sysMessageBoxIndirect}(r0) .R0' ; free MSGBOXPARAMS structure + System::Free $0 - ; have we got ready module handle at start? + ; have we used load library at start? IntCmp $2 0 0 smbskipfree smbskipfree ; No, then free the module System::Call '${sysFreeLibrary}(r1)' @@ -331,7 +329,7 @@ Function systemSplash Pop $3 ; Create window class - System::Call "*${stWNDCLASS} (,r3,,,r7,,R9,,,s) .R9" "_sp" + System::Call "*${stWNDCLASS} (0,r3,0,0,r7,0,R9,0,i 0,'_sp') .R9" ; Register window class System::Call "${sysRegisterClass} (R9) .R9" @@ -373,8 +371,8 @@ repeat: finish: ; Stop the sound - System::Call "${sysPlaySound}" - + System::Call "${sysPlaySound} (i 0, i 0, i 0)" + ; Delete bitmap object System::Call "${sysDeleteObject} (r6)" diff --git a/Contrib/System/System.nsh b/Contrib/System/System.nsh index 2c9c8757..13c193a6 100644 --- a/Contrib/System/System.nsh +++ b/Contrib/System/System.nsh @@ -120,6 +120,11 @@ ; LPSYSTEMTIME lpSystemTime); !define sysFileTimeToSystemTime 'kernel32::FileTimeToSystemTime(*l, i) i' +; BOOL FileTimeToLocalFileTime( +; CONST FILETIME *lpFileTime, +; LPFILETIME lpLocalFileTime); +!define sysFileTimeToLocalFileTime 'kernel32::FileTimeToLocalFileTime(*l, *l) i' + ; BOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZone, ; LPSYSTEMTIME lpUniversalTime, LPSYSTEMTIME lpLocalTime); !define sysSystemTimeToTzSpecificLocalTime 'kernel32::SystemTimeToTzSpecificLocalTime(i, i, i) i' diff --git a/Plugins/System.dll b/Plugins/System.dll index 37e7e6864852633539ee9921edab9a02aebf0cef..ea89bf5b9c5f3280edb3c5ef72787550742fb772 100644 GIT binary patch delta 1647 zcmY*Zdr(wW7(ZvZ!bMhGkyVk$Ac2S?+tlHTC$~?R*)uInl?_OOwNQt(`^UuxVzat%ej7W_2nE3Y5fn^j8j{4Beu|*0emfCL&Uz8kl#8zV(VL{L^wXe z3twKjM$4rua8ix~q4}6Wzn$4EqNl4H#ZQXEF$hfnfgKhLvZxMk($!-6nvT%pI2&J~ zUHDCWAh1Ap5VtWa@Vra^Uv^|bXhZzt8&T(c?Mwq|kx|9j1x@oa*)4x-uIbv=fQQ5S zrd^QFHDLLc%*rK9MPT`eB~iK?L-ZTgiucj`Y!QBe=Ev^T4Lk{S#9qM|(dM|>y5Aqu z>v79Jv_4qT1}aCCE_E4Q?~Qlnhe#B7asUC^maK z>{7zl2w|k0>sM8OmZk)w>AJ)U+)2+Qnz5bUPs~g6kD3AwdAn9%=GLG54%Sosw5%}L zK}(E@Y^s*pWD3xwMr*vyuEk5y{zwZ-jTv|&Jz*5_D}hJGjaWA>gT6X`oHyOKsvr4Q zg^{b03@(=I*izfcL}*bvRsKNZrp6ht%WUB6C~Z4WkL>%8sx<+F#CeI{Gn$7k1Ug`i7V~Mm`(Vk#>1@L-(X;sJ<*1oR&MZ&1~mi@#W$?t>X7PqC_5hd&ZiVMYNHyx zqXf?K^vfF4L0MKq|C%6F^*;c)fB5bhccmv)>4BTBR4SoTg|hN)qzg=lfe8gUUp<37 znTjpqECr`**Bowlg?fFshE9sBRIdl4mA!OB5}$qQj;aQ;8rtjQeW4_8tg}Ly23f%b z|BhTZLoja5bC9mQLw`=16O#j;3dKN^Cnk>{r{yKO6cyMF!>VM0dY3Xl%O*Z=SaTox z-tcW^u-g;kQqt)0i5aG2VMs8#6vq?bINuX2#k!R5hO|icpig_4j3>>dED5QqOKH5P zb!wq8$=TRV^OMJC=s|b8*T%S;q}~Vnm(>KJaOg2;S{tp)QMxAC*_P6R8SNiKKTJ(e zIywfSE0Ynr3A{7`p*dLyO&*WX=D@G1gz;X2t8L>?^H=#E{tllf*aercLRc%jA#4*` zgpY(HLZ5J77!nYvBCE*jq>fOshkQob$W?NK+#>xXL`In6Ov$EnQ;uo2sm$atZ82>( zxh;~V*7CjOvgMv-(4w;@T9d67Yl-z;>z^}r*qRG&7xWcuDhzoG)xxTxD@8r_Jh50@ zDoWy8Vx71}Y!Llolh`c2FYXpU7C#a9i-*Lc;&JgS@s#+j*dhKXUKHmRFD%|we7g8i zakv=1A|0VGfMPiVH=T2HTe)4_UhWuog6rb`;Ci_S+!O8}E}9?9PvA58seC?f<_mf6 zOnw2sn6Kv7@m_u}e}KQq_wob0%1;uqg*;)kuvyq5P+^}C5ITg*!Zkq=?h2zwGO>|o ziIdDHi(oFx$xCEC*+h20Yz~tjNIuM=*j#R2Vt&!wY(8u@TB;(`IArOv+_LmpmRm1a M;iTH48+G1)0dW;$yZ`_I delta 1557 zcmZWpeM}Q)7=N!6IB0>BP?ax(2qK7jcW-+LrPt}KD?|oc2dr#@#P~U#TWm9?ww0Zz zm!q!a-TYuIana3b+~%ko`Ueq3#hGn5vrISR9}=RcWq!f1xW?OiMgQ6*zx>|k_q@;V zx%as@x81(o9w;ZScUWGw|FWy`C-FAj`2w3S6n3^pW2W;X%$v`>*XfUP@pDe;+#QXR zqWt>0m21`7jw{o({abo19V1zqdwD34*rI76P^$)_(?kK`L$`geT*hAg5nZNh!Elv%875$)`Wn@@-&!~I7kr7&`sSEO+gsV(y!3OPM|h@G0_w3 z)-R1ATW0`D$!ja@rres^Y1x1p$^_JXjH?)TvjEkFu?FiWG1p^$3u7h5VH}^rIF8YT z<37yQm``ASf@^y)uHkiI@N#Mo!QCj$E`AA6UO2v!A_1V>MWxv}Sa2K806>8H^)D#~ zKm#gf;E*cUiurk%(8;tKq94T?Ohh&^8|IfU7L(>+eMdkw5pATa`MEDQ-a6?!uQZT` zbKC6x-Agb_jAT&_{l*@2$WVf0LoV?q(oN+Fcd&A53(;_PCZOhC67Fh6QrfA<6^;G1 z(ugpUC9H}7hqRomgX2p}gQ{o!wjv3s3%{^XwIU?cG@qbahA6=k0q(>a#X#aSinhq4p%l%Ewy@|POKBej*g06PI(s96LU?qN zmppq%Bf81ZyF%5lA}tNWtJQPQ4cKG_?;Ws>D3}Lq4;9QVyWKV4?n<<~7fW$?G9k11 zsZ`~Qh{~|0QO|g#uzNDR@ZWDiXYU;7X}i z+@#_T%UzEYML4e)yws!^#=5*~QY1WK#Wp6{#)OMmW#S%d9o#%ti(ylq9&Zq z8s*xghsLd|Q?7;L2$n>~wzlvYSZ{*+S-Ta5VhkwS$Su3rZtVgXUti9Ir)>~GP1Hjk# zKuPpMx`KAnE9f=!Mmj+6r9Y#O(I@C1=wA9VJxJf6Z_&5u5&ALho1jT1nMq@2F-E4A zX=1vVW6aOYRpw7-3Ok!EW_h-fZDcpFEv%PC>;d)^dyySxN7zyJ2@7B>)WK9Z9p=MQ y$irH=5&i)~@PYA}ku;^57MU7M7fgviwCu9eE$J*VM?z6