From 896ba172d5625cb5a76c01e28f5f103ef6780527 Mon Sep 17 00:00:00 2001 From: kichik Date: Mon, 8 Sep 2003 13:54:01 +0000 Subject: [PATCH] - Fixed uninstaller not showing anything when installer is silent - Improved CResourceEditor - should be more tolerant now - Removed legacy code from InstallOptions and StartMenu git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2882 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/InstallOptions/InstallerOptions.cpp | 35 +------ Contrib/StartMenu/StartMenu.c | 46 ++++----- Plugins/InstallOptions.dll | Bin 13824 -> 13312 bytes Plugins/StartMenu.dll | Bin 7168 -> 6656 bytes Source/ResourceEditor.cpp | 99 ++++++++++---------- Source/ResourceEditor.h | 8 +- Source/build.cpp | 6 +- 7 files changed, 77 insertions(+), 117 deletions(-) diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index c494ac90..1fb062a1 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -826,16 +826,7 @@ int WINAPI StaticLINKWindowProc(HWND hWin, UINT uMsg, LPARAM wParam, WPARAM lPar } #endif -int nIdx; -HWND childwnd; -int cw_vis; -int was_ok_enabled; -char old_cancel[256]; -char old_ok[256]; -char old_back[256]; -int old_cancel_enabled; int old_cancel_visible; -char old_title[1024]; int createCfgDlg() { @@ -858,8 +849,7 @@ int createCfgDlg() return 1; } - childwnd=FindWindowEx(hMainWindow,NULL,"#32770",NULL); // find window to replace - if (!childwnd || nRectId != DEFAULT_RECT) childwnd=GetDlgItem(hMainWindow,nRectId); + HWND childwnd=GetDlgItem(hMainWindow,nRectId); if (!childwnd) { popstring(NULL); @@ -867,23 +857,16 @@ int createCfgDlg() return 1; } - cw_vis=IsWindowVisible(childwnd); - if (cw_vis) ShowWindow(childwnd,SW_HIDE); - hCancelButton = GetDlgItem(hMainWindow,IDCANCEL); hNextButton = GetDlgItem(hMainWindow,IDOK); hBackButton = GetDlgItem(hMainWindow,3); - was_ok_enabled=EnableWindow(hNextButton,1); - GetWindowText(hCancelButton,old_cancel,sizeof(old_cancel)); if (pszCancelButtonText) SetWindowText(hCancelButton,pszCancelButtonText); - GetWindowText(hNextButton,old_ok,sizeof(old_ok)); if (pszNextButtonText) SetWindowText(hNextButton,pszNextButtonText); - GetWindowText(hBackButton,old_back,sizeof(old_back)); if (pszBackButtonText) SetWindowText(hBackButton,pszBackButtonText); if (bBackEnabled!=0xFFFF0000) EnableWindow(hBackButton,bBackEnabled); - if (bCancelEnabled!=0xFFFF0000) old_cancel_enabled=!EnableWindow(hCancelButton,bCancelEnabled); + if (bCancelEnabled!=0xFFFF0000) EnableWindow(hCancelButton,bCancelEnabled); if (bCancelShow!=0xFFFF0000) old_cancel_visible=ShowWindow(hCancelButton,bCancelShow?SW_SHOWNA:SW_HIDE); HFONT hFont = (HFONT)SendMessage(hMainWindow, WM_GETFONT, 0, 0); @@ -933,7 +916,7 @@ int createCfgDlg() #define DEFAULT_STYLES (WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS) - for (nIdx = 0; nIdx < nNumFields; nIdx++) { + for (int nIdx = 0; nIdx < nNumFields; nIdx++) { static struct { char* pszClass; DWORD dwStyle; @@ -1217,10 +1200,7 @@ int createCfgDlg() } if (pszTitle) - { - GetWindowText(hMainWindow,old_title,sizeof(old_title)); SetWindowText(hMainWindow,pszTitle); - } pFilenameStackEntry = *g_stacktop; *g_stacktop = (*g_stacktop)->next; char tmp[32]; @@ -1254,19 +1234,10 @@ void showCfgDlg() if (lpWndProcOld) SetWindowLong(hMainWindow,DWL_DLGPROC,(long)lpWndProcOld); DestroyWindow(hConfigWindow); - if (was_ok_enabled) EnableWindow(hNextButton,0); - SetWindowText(hCancelButton,old_cancel); - SetWindowText(hNextButton,old_ok); - SetWindowText(hBackButton,old_back); // by ORTIM: 13-August-2002 - if (bCancelEnabled!=0xFFFF0000) EnableWindow(hCancelButton,old_cancel_enabled); if (bCancelShow!=0xFFFF0000) ShowWindow(hCancelButton,old_cancel_visible?SW_SHOWNA:SW_HIDE); - if (pszTitle) SetWindowText(hMainWindow,old_title); - - if (cw_vis) ShowWindow(childwnd,SW_SHOWNA); - FREE(pFilenameStackEntry); FREE(pszTitle); FREE(pszCancelButtonText); diff --git a/Contrib/StartMenu/StartMenu.c b/Contrib/StartMenu/StartMenu.c index 2a026c68..b39c9ca5 100644 --- a/Contrib/StartMenu/StartMenu.c +++ b/Contrib/StartMenu/StartMenu.c @@ -6,12 +6,8 @@ HINSTANCE g_hInstance; HWND hwParent; HWND hwChild; -HWND hwStartMenuSelect; -HWND hwIcon; -HWND hwText; -HWND hwLocation; -HWND hwDirList; -HWND hwCheckBox; +HWND g_hwStartMenuSelect; +HWND g_hwDirList; char buf[MAX_PATH]; char text[1024]; @@ -32,15 +28,14 @@ void AddFolderFromReg(HKEY rootKey); void __declspec(dllexport) Select(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { + HWND hwStartMenuSelect; + hwParent = hwndParent; EXDLL_INIT(); { - int cw_vis; - - hwChild = FindWindowEx(hwndParent, NULL, "#32770", NULL); // find window to replace - if (!hwChild) hwChild = GetDlgItem(hwndParent, 1018); + hwChild = GetDlgItem(hwndParent, 1018); if (!hwChild) { pushstring("error finding childwnd"); @@ -86,10 +81,8 @@ void __declspec(dllexport) Select(HWND hwndParent, int string_size, char *variab return; } - cw_vis = IsWindowVisible(hwChild); - if (cw_vis) ShowWindow(hwChild, SW_HIDE); - hwStartMenuSelect = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG), hwndParent, dlgProc); + g_hwStartMenuSelect = hwStartMenuSelect; if (!hwStartMenuSelect) { pushstring("error creating dialog"); @@ -110,8 +103,6 @@ void __declspec(dllexport) Select(HWND hwndParent, int string_size, char *variab DestroyWindow(hwStartMenuSelect); SetWindowLong(hwndParent, DWL_DLGPROC, (long) lpWndProcOld); - - if (cw_vis) ShowWindow(hwChild, SW_SHOW); } } @@ -121,7 +112,7 @@ static BOOL CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARA if (message == WM_NOTIFY_OUTER_NEXT && !bRes) { // if leave function didn't abort (lRes != 0 in that case) - PostMessage(hwStartMenuSelect,WM_USER+666,wParam,0); + PostMessage(g_hwStartMenuSelect,WM_USER+666,wParam,0); } return bRes; } @@ -141,10 +132,17 @@ static BOOL CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARA BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { + HWND hwLocation = GetDlgItem(hwndDlg, IDC_LOCATION); + HWND hwDirList = GetDlgItem(hwndDlg, IDC_DIRLIST); + HWND hwCheckBox = GetDlgItem(hwndDlg, IDC_CHECK); + switch (uMsg) { case WM_INITDIALOG: { + HWND hwIcon; + HWND hwText; + RECT dialog_r, temp_r; HFONT hFont = (HFONT)SendMessage(hwParent, WM_GETFONT, 0, 0); @@ -172,9 +170,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) hwIcon = GetDlgItem(hwndDlg, IDC_NSISICON); hwText = GetDlgItem(hwndDlg, IDC_TEXT); - hwLocation = GetDlgItem(hwndDlg, IDC_LOCATION); - hwDirList = GetDlgItem(hwndDlg, IDC_DIRLIST); - hwCheckBox = GetDlgItem(hwndDlg, IDC_CHECK); + g_hwDirList = hwDirList; SendMessage(hwndDlg, WM_SETFONT, (WPARAM) hFont, TRUE); SendMessage(hwIcon, WM_SETFONT, (WPARAM) hFont, TRUE); @@ -218,10 +214,6 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) SWP_NOACTIVATE | (noicon ? SWP_HIDEWINDOW : 0) ); - //GetWindowRect(hwIcon, &temp_r); - //ScreenToClient(hwndDlg, ((LPPOINT) &temp_r)); - //ScreenToClient(hwndDlg, ((LPPOINT) &temp_r) + 1); - if (rtl) { ProgressiveSetWindowPos( @@ -305,7 +297,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) } else if (LOWORD(wParam) == IDC_CHECK && HIWORD(wParam) == BN_CLICKED) { - BOOL bEnable = IsDlgButtonChecked(hwStartMenuSelect, IDC_CHECK) != BST_CHECKED; + BOOL bEnable = IsDlgButtonChecked(hwndDlg, IDC_CHECK) != BST_CHECKED; EnableWindow(hwDirList, bEnable); EnableWindow(hwLocation, bEnable); } @@ -316,7 +308,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) pushstring("cancel"); else { - if (IsDlgButtonChecked(hwStartMenuSelect, IDC_CHECK) == BST_CHECKED) + if (IsDlgButtonChecked(hwndDlg, IDC_CHECK) == BST_CHECKED) { short *sbuf = (short *) buf; *sbuf = *(short *) ">"; @@ -383,8 +375,8 @@ void AddFolderFromReg(HKEY rootKey) { if (*(WORD*)FileData.cFileName != *(WORD*)".." || FileData.cFileName[2]) { - if (SendMessage(hwDirList, LB_FINDSTRINGEXACT, -1, (LPARAM)FileData.cFileName) == LB_ERR) - SendMessage(hwDirList, LB_ADDSTRING, 0, (LPARAM)FileData.cFileName); + if (SendMessage(g_hwDirList, LB_FINDSTRINGEXACT, -1, (LPARAM)FileData.cFileName) == LB_ERR) + SendMessage(g_hwDirList, LB_ADDSTRING, 0, (LPARAM)FileData.cFileName); /*idx = */ /*SendMessage(hwDirList, LB_SETITEMDATA, (WPARAM)idx, (LPARAM)ExtractAssociatedIcon(g_hInstance, FileData.cFileName, (WORD*)&idx));*/ diff --git a/Plugins/InstallOptions.dll b/Plugins/InstallOptions.dll index f9f9411a6b0450e1e9940db5249ed3a1f31a8c76..46a8d8ad17e4bf37fe945396048f376702c8f04c 100644 GIT binary patch delta 5953 zcmd^De^gZ0oqsb7!yp4Q8b(I}JL+g~Q98iU;hEM~exMG| zlOuZhdGb5koLtU0`1Fh;D`6683BvLk5!AE@eH6)VswDTfLWK1VSL3e z>|}R>w{rzR1=$?%+#+%(tyZ>B})e)1vgfWh3iAjTJYa&`8 z_^-y@47-e&bmF+itdhjc^pg6`@Jm?T8e*dMt%>FZ?X5G92nj}1;RfVEqHr}1QCZ^h z1tSv@?s4~Qow=~8t=m#Y!WtFB@cyfO)39_1X7#-PmJrZ&A~i96EzR&odNIvVtKF=p zv9=Iai(r!2pmi0|L2YUN799`*kamrMJDi)*xH`h%mqYeLk%pEBJfyX#w>5}&wRsC@ zbYhxHN@)H$(3}wSGYSi+%S%<(e5A$jRaT4P#5dG3mP>QmnPHwkLhZJ$36HE}jN!yC znBSzLH#1&Ujf-izqqx7JTaJ6Tu5><~6k&rkw_W3k?@%*?KGjmHJf(|d+YqTPJgj&T z_hshM^p0nK%}fRH<-LB?Ntm%POqinK9SvfC=5kf9IGR};vqMGtIUyuGR0S_xZc6`< z(!DahhSH}%69@GsRM?P5*=Joo5TWpUREOMDWL@q11+TK8(>ek74TTl>*?aa^yu?n^mBiCqAFG zU?B~|YjQB-j4^ExwV^^a+N8{R;+t9XW$7i2HB5cNRwL!ZuUso1W-X6Vn_95-vNfts zPfS6iA(O%etzM|Ing=zyMkTngAx9s7L8W4pS&cB^&D1Zs`8c;#k0l#sOTufC@e8HK zFO~R6x@u95O^H;cwY4VLjG(k^E`~~dh>iM{d8zc2e2^Y0I+>oB&@bFUmmNvu&klvr zm>(xG^UbfOXL&3!|AkHdV~O$4648_GKr!yimfOfbW-nG5#1FGql+d_glnxUfM`h0* ze+?!~eia#GdN(=)vhiVvqAABAPqt8{wR3k0`D(j#;eQC>Gvx8tgKgofEnMPrzS^9c z5-VSAP2u@`b-qw-PA-F7>70}X?-r6y>x&>PH@E@OElIRo<{OT$n;`@h$r#1UIZJ7; z`7CFh+T0+P8tfTHYH7MHzGNu0o<~t~}lixG9MNX&JFCOJY<>H z7hz~q-R~m~Gg#7}FoE2FkwkM}oJ^%0)zg;GYO64NaQpoB=g{^!k{SIiW(-r>2Ig|Q zI|UHQECC7T?R!CD8UR|B@QwWd`^Axa-RQ-&WuJHoXwbSXd;wh$zJRVp zbY89WE;doT$8mIxQ9tlb9R%h5hL$1_0z!fmDiKvzKI|ToX4hD6Wtp&33fLH3);M-dJ0zYUfg2(O3*EFJG3A<G|)EliWPD3DMEM!3WI4CY%A4yZzR zxWiUiIG_qhskC#2(0L&+QWUz)hem)GUE@Qy1sxv?j0=G&?m@cYcmgjR_dshn@iQ68 zY+lbjn8QBFJ;*Y&o&ig!u}@yqu$p+_OWou}wV~xrsu!5ijUH8`M}ALFtMPx0_l@Rc z24;jB4IdaE+e_{Ge5?klmX^zZN9`?>7gcOF*{_Mm0y6_r2rpQ@JkDRxb2649Xm7nH zM>5{Oz~DGU@kbVl`xrJ2&M6va*tcmiW2Yv4c9jx94yL2(L^s)Il-&ZS}_3=uY(%^cU&j+K!n7fVGzoJu$g`oxIfzJW-ote>dK)LBOwuqZn zvn#miY^9vTuNUBDjm^{&Q_Jintr|TBgR;voF?_ENZ?T|jz09IM>=9)P6RzI>IPdzh z&@kz5oLnTmnr_(kMP_Ks-s4!jw)@<*xbl&s!<3HbhbwM5uFIX62mCR7Nqnv zad$~nkLpl`KSvT648fO?|5obk5_*V9x1$eX$IMPOTNB-7yowX zZwueXp$t(+px5qi3rZz)Mh39gjxCSXO1nW}do!bdj%C+MTNRQ4DP;mLOVsw`;@Jbw%C5#i+s&8MfL9DHhb7FX{oE&f4-Y+9{NdD`B zt#y)J$u)}IdAVv`gE*MCDyD25_+X*Ou#l2|I2#=}xvMCjbp>=YizG)!J|Yfz^E6F> zD^#4vonK8)YN1d&j_M(#(hDAN%z(1J+{AZnQIa8tq>M%FRWYh!ItOjgS&D+G8>B~e z$iDActwCbZbcvz0Pm?UaNNZD*+VzqFOz*+yNCn-D>88z^I_cK?7ke@ir%NThBhl|Q zx~4HnlyQ1gklJLFo)M%b8Kq|f=@p>z*_9i}Ex%}JIfC^O#)YZWL5%yu24dGre@)dk z!vKv%BUQ|z^wQU7QATOWEGkncJ)w}|mjw&t)4BZlq>g5i{WZjN7NdG5dXzY*XX(a& z6QWE=J)6;c){o+u=UGk9XuYRFMALiU!Xqdh!RJjq&V$c#1Nr?pj%&Dz+fZV<=+uMO zb;+fJ_35JJ1&+Q;4K>!PP7HiHAs;5eK-%DgAm zf9*%Hvkv^(<75~!pcwG)psxc40lk1p0KGPs;e#Bo25`C*e-h!D3(x`Xf*uA80nP*7 z2fPA4z0SbrdBAmm1ULnt*K2mPSUVGAP60Us*b5i}Tm^gz_!B^f;PU}10CvDP0h<5~ zfY$(RfbG!R1n>du04u-@&;cfq#D4)k1{?>x1Ly`M09OD%x5t!hb|9-70GrJ29PLBN zs~L)Dj*JGQN?mUw@L}+d&(f=;w&0zdrPl@?{;y*0&C;6!ZwK_`tE15H|9uGz%1k_7 zf}S5Q-KQ?`svyK-M;w6dl0MCDH^uT);IyjA&!%7>L2?;P(F-i6*J-WA>=uhU!M zt?@qN{TuI2?{4oQZ?l*8p7g%!J?s6Mx5xWS??vygy*IqKz5n5z^v-x03yzM+QEQuL zv)jI5tF}F33)!~W!nT99H*6iYpV+!>eYU%{FKiENs#r-zNp{I!l~j}jOLmr=E~zg4 z=h7>sBc-2}eo;D8>M7e`-#YI)A3Eo_j4rdw>MC)0Twa&o6?AQPHMkDA8ePX+-*vt1>T&hEuDO2a z`posvWpL-Zm%EGI9`{=JQ|_nTA@|E}*4^Yj>VDIG%6;B_!ToFZu>0TKBks@L8qXZh l6P|p}GLOx(&a=t0)$<(>R?dgT!b4{>_WY={9n>(#f|^~ delta 6637 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

mx<%EUe})AyS~rzpyIS zel2V7@-v8WhF0fKK=(a5pu!(R!JyKQG}`njSxM)Kx-ANVM>nYcjZid3PMLv69KNhi zh0x$K-O-D!xmvjEitia&o7w@2MoDGXrZ&?=3wf%Gs{duE9$cC(&n-=d5GU_oYVIGj zH6qO=Lh#4yBE45elLF@&Sx(kPdaHCt6e_B}2k(N|(3=7yL1!jTt)|p&R*ICVy=+5u zH|weHWuNX=@J4Hmbp0jxoz%`3NX z%Es0LtU%MP#BENFN2s7;g&kw^A%r|wnFu~=}>-GZh_AZ zeF6?@l9@FLKmBGBoKawSre48CF%S1+KxxisCmqe@63{|AK1c7oj9zn zyh}B}2C&B_{22^f{kcZQOnt|i&=q=t^KRQUxx^VaT2Ck1Z~*s|&Kr_pYK~m!N1EnR zxF*ZF;8MMjrw3Ij8m6wwN-z zwKr^==yJvOnD$fC>+xwPA%6$P0s36u3L2ON-UaRf)@_8mh4l?!5jYRf=M?0x0T+R{ zfvZ3#Fb&)VJ_m~7cQdd9kbq|32_OP|-AT05r4Jl<8?+4Fy+93c8!(O9 zvqE+QcKC56i@@?@(mpFK|9_}z-TzcI^u4v)8QVJM(PPoZ?q?s19($f>|F+j!FPMVL z$(O>%PjsGqX~?y%lG(ZZU)nyF5C)YkLju1SXaF#DL>}r}pJZ^34c{v3A39%lhPl95 zhDtZ&n0O;>O1aIPi+h;!aC^9YT!1^wb#c#eJzO8x&wYm*;4X7RT!y>FO>xuQU5?=` zyo2AyyZBmuH{ZZF@iHIgpW#pNr}?vdn!m{ZiXY{F$KTIZ9|%7b-V<&Lw}f%wPr@os ziO1#fc=mg~>S^(`dyad~dj>tf@QiuN#a&{ZxL<4)JH#HbS3DyZC(=98yV4Em_fl5+n`E!6uG>@BREK|hul^UC CZmAyt delta 3255 zcmc&$eQ;FO6~AxUO%~XYCuTuNB8j_*vPIwb+a*~(YF40RVZ*W;Q;-i$!s9h9Ap3?? zD7&&mvpmuQ&ni}{2}?Wq!x1r9uoY&5@?}$oK}|p@lTI^ZXo8brVv$&eGlIcJF zvv1~?d%o{E=bn2v2`=G1uxG&^dp@6h@#H;RI(Y~9=!D;%yb9|JkBprB4A!YRmyLC< zr^8rRZGKk5J_m~*cr+A1sGP8&?0w4@qS3D#O(~vCWFa&O1VyIsm_`sQCx+YzEdfER zRzoTAx5v;v$+V74Vm;&0g=iq z>Dvhig>`3WoN$t~72Iy!BoI2?%p)?=`wt)!eoQ}JmD_L(a!`4#);gW2*LGW{&)NlX z!28%wNC`s-Bagf*;p`utd$j@zLlN<{US;{9$nmAT1CBofk{tAWQ{Nat}x zy$fo2*bsybdZwv#z6^Gtnmo!L2G%zZhmIW|^>n@gGM&d889OI;xhWLOmu zuq@5p`w}EDFJ(h0x8Y~-mmPXC`75$M#p9Y3QX0WYa=NZp-6{vQbQ=a|tk44xzvR3! zrM6`dtZLJEQu?wJvzxV**@bbwX8}%VKNv-OzxZC)FIe6EVApq84Uo0|{t1fI-U|c) zJ72dVbOyVt{zkB8zl?^%QX?d&^R0M1x0G}1ZH}i*vZ$cn*cQYcS zaf=2Ql{a$?hh;zm62N`O?mFddJ@HJf-%+I*mWfX$Qrel{H8DuXd&)R%B*i0s452}HYWISUD8R2lO z;VZ7QYQ*8WvZ|t@ui(GLBgwOtRioMv%%jo!E*vA1o$%x56v23%!h~WwbpYlZayE>N z0XJ(f`v-GJf}>1&0`mt#y5hj6i*Txj9tTx}pd3i}GjOjKG?fuHh^;Jxz8E(fX2Mym zU7qBMo1^bcK*S&X4bF5$r*HtsryE8O@-g?v7tYMbJPw?X!Q;5*Z5V{KMj16Y(wu;n zd4dBnnQXTWL8n~pYVfY-q9-0CE5_$*R(QPDZy`TqIU%xy7W_+l0O0i2h zaP`NoJH&t@y5RPhxA{|;uMH4={W>ZZ-9`|$}_9A z#SRxiYBi3Z5O(cdNAX(xoD4NI!xKry!nJBc2T-*oHY;QudjbdqgfcO4`ZCB-jBYXv zLb5I$frz7*r87CAE7QhQNJ@;Vw0Swp;-niPH^2hG-_>G-x&ecL^8m*~2o(TM0sS@r z0o{yO`1Sz(3ZNBm2G9Yx35Wsi0vs-c9t6w^elP4s_jR3|z4i{B)uz1@4yUd6FcbRRe+}VWx zpd~DA*-^Rq7u8#KAatBqw%w$oo40R%rmhCvM=Ys{mDO!p7OVL=LOtk7urw_K^^3K? zkdL>GkOjoSIa3}T`?qrs^nidijG-R*U4R7c4T;c!HviNlaVW1b%f&LHNVUC~mmu1v zOdBHNN5RKVq{zY9SS*R#R)J8fqIAr}k1Q>J_SmdWZUeI!AR-*Qp+AfEuPI z&@<^``Z2nMUQ92cgY-JOnwIJ9^e^c+{UY5&zeXRWkI^US59toNiyovWFcX>knCVO* zLo*_?fT>_)W-GIk*%xOHF>f({VBTl`%zVWBo%tt2u-R-GyPVy~Zeq8wJJ>k;65GVS z$sT2ovzOV=*dF!{`z>qXvN;DggPX+#xaC}!+sMh>4lcQd%_jrrtp>UweXGbonR9ui*At@SBk5}DsjD7E7plI@p*BN z*eL#5d|7;5JR-J=?}?|xbK+I;3z6{7^a|bu-hg+dH|kyMea749ea(BsZ;kIc-%j7}eDC|t`L6idHcowu(B8G2{trWW96ta6 diff --git a/Source/ResourceEditor.cpp b/Source/ResourceEditor.cpp index 7abb4056..81ac9125 100644 --- a/Source/ResourceEditor.cpp +++ b/Source/ResourceEditor.cpp @@ -20,7 +20,7 @@ 3. This notice may not be removed or altered from any source distribution. */ -#define RESOURCE_EDITOR_NO_API +#define RESOURCE_EDITOR_NOT_API #include "ResourceEditor.h" ////////////////////////////////////////////////////////////////////// @@ -41,10 +41,9 @@ ////////////////////////////////////////////////////////////////////// CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize) { - // Copy the data + // Copy the data pointer + m_pbPE = pbPE; m_iSize = iSize; - m_pbPE = new BYTE[iSize]; - CopyMemory(m_pbPE, pbPE, iSize); // Get dos header m_dosHeader = (PIMAGE_DOS_HEADER)m_pbPE; @@ -65,10 +64,22 @@ CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize) { // Pointer to the sections headers array PIMAGE_SECTION_HEADER sectionHeadersArray = IMAGE_FIRST_SECTION(m_ntHeaders); + m_dwResourceSectionIndex = -1; + // Find resource section index in the array - for (m_dwResourceSectionIndex = 0; m_dwResourceSectionIndex < m_ntHeaders->FileHeader.NumberOfSections; m_dwResourceSectionIndex++) - if (m_dwResourceSectionVA == sectionHeadersArray[m_dwResourceSectionIndex].VirtualAddress) - break; + for (int i = 0; i < m_ntHeaders->FileHeader.NumberOfSections; i++) { + if (m_dwResourceSectionVA == sectionHeadersArray[i].VirtualAddress) { + // Remember resource section index + m_dwResourceSectionIndex = i; + // Check for invalid resource section pointer + if (!sectionHeadersArray[i].PointerToRawData) + throw runtime_error("Invalid resource section pointer"); + } + + // Invalid section pointer (goes beyond the PE image) + if (sectionHeadersArray[i].PointerToRawData > m_iSize) + throw runtime_error("Invalid section pointer"); + } // No resource section... if (m_dwResourceSectionIndex == m_ntHeaders->FileHeader.NumberOfSections) @@ -214,34 +225,22 @@ BYTE* CResourceEditor::Save(DWORD &dwSize) { BYTE* seeker = pbNewPE; BYTE* oldSeeker = m_pbPE; - // Copy old headers - CopyMemory(seeker, oldSeeker, m_ntHeaders->OptionalHeader.SizeOfHeaders); + PIMAGE_SECTION_HEADER old_sectionHeadersArray = IMAGE_FIRST_SECTION(m_ntHeaders); + + // Copy everything until the resource section (including headers and everything that might come after them) + // We don't use SizeOfHeaders because sometimes (using VC6) it can extend beyond the first section + // or (Borland) there could be some more information between the headers and the first section. + CopyMemory(seeker, oldSeeker, old_sectionHeadersArray[m_dwResourceSectionIndex].PointerToRawData); + + // Skip the headers and whatever comes after them + seeker += old_sectionHeadersArray[m_dwResourceSectionIndex].PointerToRawData; + oldSeeker += old_sectionHeadersArray[m_dwResourceSectionIndex].PointerToRawData; // Get new nt headers pointer PIMAGE_NT_HEADERS ntHeaders = PIMAGE_NT_HEADERS(pbNewPE + PIMAGE_DOS_HEADER(pbNewPE)->e_lfanew); // Get a pointer to the new section headers PIMAGE_SECTION_HEADER sectionHeadersArray = IMAGE_FIRST_SECTION(ntHeaders); - // Copy everything between the headers and the sections (Borland stuff...) - CopyMemory(seeker, oldSeeker, sectionHeadersArray[0].PointerToRawData-ntHeaders->OptionalHeader.SizeOfHeaders); - - // Skip some stuff between the headers and the sections (which is??? ask Borland...) - seeker += sectionHeadersArray[0].PointerToRawData-ntHeaders->OptionalHeader.SizeOfHeaders; - oldSeeker += sectionHeadersArray[0].PointerToRawData-ntHeaders->OptionalHeader.SizeOfHeaders; - - // Skip the headers - seeker += ntHeaders->OptionalHeader.SizeOfHeaders; - oldSeeker += m_ntHeaders->OptionalHeader.SizeOfHeaders; - - // Copy all of the section up until the resource section - DWORD dwSectionsSize = 0; - for (i = 0; i < m_dwResourceSectionIndex; i++) - dwSectionsSize += sectionHeadersArray[i].SizeOfRawData; - - CopyMemory(seeker, oldSeeker, dwSectionsSize); - seeker += dwSectionsSize; - oldSeeker += dwSectionsSize; - // Skip the resource section in the old PE seeker. oldSeeker += sectionHeadersArray[m_dwResourceSectionIndex].SizeOfRawData; @@ -257,8 +256,8 @@ BYTE* CResourceEditor::Save(DWORD &dwSize) { // Set the new virtual size of the image DWORD old = ntHeaders->OptionalHeader.SizeOfImage; ntHeaders->OptionalHeader.SizeOfImage = RALIGN(ntHeaders->OptionalHeader.SizeOfHeaders, ntHeaders->OptionalHeader.SectionAlignment); - for (int j = 0; j < ntHeaders->FileHeader.NumberOfSections; j++) - ntHeaders->OptionalHeader.SizeOfImage += RALIGN(sectionHeadersArray[j].Misc.VirtualSize, ntHeaders->OptionalHeader.SectionAlignment); + for (i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++) + ntHeaders->OptionalHeader.SizeOfImage += RALIGN(sectionHeadersArray[i].Misc.VirtualSize, ntHeaders->OptionalHeader.SectionAlignment); // Set the new AddressOfEntryPoint if needed if (ntHeaders->OptionalHeader.AddressOfEntryPoint > sectionHeadersArray[m_dwResourceSectionIndex].VirtualAddress) @@ -273,19 +272,24 @@ BYTE* CResourceEditor::Save(DWORD &dwSize) { ntHeaders->OptionalHeader.BaseOfData += sectionHeadersArray[m_dwResourceSectionIndex].Misc.VirtualSize - dwOldVirtualSize; // Refresh the headers of the sections that come after the resource section, and the data directory - for (i++; i < ntHeaders->FileHeader.NumberOfSections; i++) { - if ( sectionHeadersArray[i].PointerToRawData ) { + for (i = m_dwResourceSectionIndex + 1; i < ntHeaders->FileHeader.NumberOfSections; i++) { + if (sectionHeadersArray[i].PointerToRawData) { sectionHeadersArray[i].PointerToRawData -= IMAGE_FIRST_SECTION(m_ntHeaders)[m_dwResourceSectionIndex].SizeOfRawData; sectionHeadersArray[i].PointerToRawData += dwRsrcSizeAligned; } - int secInDataDir = 0; + + // We must find the right data directory entry before we change the virtual address + unsigned int uDataDirIdx = 0; for (unsigned int j = 0; j < ntHeaders->OptionalHeader.NumberOfRvaAndSizes; j++) if (ntHeaders->OptionalHeader.DataDirectory[j].VirtualAddress == sectionHeadersArray[i].VirtualAddress) - secInDataDir = j; + uDataDirIdx = j; + sectionHeadersArray[i].VirtualAddress -= RALIGN(dwOldVirtualSize, ntHeaders->OptionalHeader.SectionAlignment); sectionHeadersArray[i].VirtualAddress += RALIGN(sectionHeadersArray[m_dwResourceSectionIndex].Misc.VirtualSize, ntHeaders->OptionalHeader.SectionAlignment); - if (secInDataDir) - ntHeaders->OptionalHeader.DataDirectory[secInDataDir].VirtualAddress = sectionHeadersArray[i].VirtualAddress; + + // Change the virtual address in the data directory too + if (uDataDirIdx) + ntHeaders->OptionalHeader.DataDirectory[uDataDirIdx].VirtualAddress = sectionHeadersArray[i].VirtualAddress; } // Write the resource section @@ -293,22 +297,13 @@ BYTE* CResourceEditor::Save(DWORD &dwSize) { // Advance the pointer seeker += dwRsrcSizeAligned; - // Write all the sections that come after the resource section - dwSectionsSize = 0; - for (i = m_dwResourceSectionIndex + 1; i < m_ntHeaders->FileHeader.NumberOfSections; i++) - dwSectionsSize += sectionHeadersArray[i].SizeOfRawData; + // Copy everything that comes after the resource section (other sections and tacked data) + DWORD dwLeft = m_iSize - (oldSeeker - m_pbPE); + if (dwLeft) + CopyMemory(seeker, oldSeeker, dwLeft); - CopyMemory(seeker, oldSeeker, dwSectionsSize); - seeker += dwSectionsSize; - oldSeeker += dwSectionsSize; - - // Copy data tacked after the PE headers and sections (NSIS installation data for example) - DWORD dwTackedSize = m_iSize - (oldSeeker - m_pbPE); - if (dwTackedSize) - CopyMemory(seeker, oldSeeker, dwTackedSize); - - seeker += dwTackedSize; - oldSeeker += dwTackedSize; + seeker += dwLeft; + oldSeeker += dwLeft; /********************************************************** * To add checksum to the header use MapFileAndCheckSum diff --git a/Source/ResourceEditor.h b/Source/ResourceEditor.h index 89f3e9a2..becacb99 100644 --- a/Source/ResourceEditor.h +++ b/Source/ResourceEditor.h @@ -27,7 +27,7 @@ #pragma once #endif // _MSC_VER > 1000 -#ifdef RESOURCE_EDITOR_NO_API +#ifdef RESOURCE_EDITOR_NOT_API #include #include @@ -35,7 +35,7 @@ #include #include -#endif // #ifdef RESOURCE_EDITOR_NO_API +#endif // #ifdef RESOURCE_EDITOR_NOT_API #include using namespace std; @@ -89,7 +89,7 @@ private: void SetOffsets(CResourceDirectory* resDir, DWORD newResDirAt); }; -#ifdef RESOURCE_EDITOR_NO_API +#ifdef RESOURCE_EDITOR_NOT_API class CResourceDirectory { public: @@ -170,6 +170,6 @@ private: DWORD m_dwCodePage; }; -#endif // #ifdef RESOURCE_EDITOR_NO_API +#endif // #ifdef RESOURCE_EDITOR_NOT_API #endif // !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_) diff --git a/Source/build.cpp b/Source/build.cpp index b3d8d576..f26f0408 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -1818,6 +1818,7 @@ again: warning("%sage instfiles not used, no sections will be executed!", uninstall_mode ? "Uninstall p" : "P"); } } + } #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT if (!uninstall_mode) { @@ -1827,7 +1828,7 @@ again: else set_uninstall_mode(0); #endif//NSIS_CONFIG_UNINSTALL_SUPPORT - } + SCRIPT_MSG("Done!\n"); @@ -2944,8 +2945,9 @@ void CEXEBuild::init_res_editor() void CEXEBuild::close_res_editor() { if (!res_editor) return; + unsigned char *header_data_new_edited = res_editor->Save((DWORD&)exeheader_size_new); free(header_data_new); - header_data_new = res_editor->Save((DWORD&)exeheader_size_new); + header_data_new = header_data_new_edited; delete res_editor; res_editor=0; }