From c8fc8264fea8558ded4a8ab89bfded5c367f61cb Mon Sep 17 00:00:00 2001 From: Doug Lyons Date: Thu, 30 Mar 2023 06:31:13 -0500 Subject: [PATCH] [SHELL32_APITESTS] Add ROS.ico test file. Improve shell32:ExtractIconEx tests (#5169) Improve shell32:ExtractIconEx tests by updating it and adding more test files and 1 new icon file. JIRA issue: ROSTESTS-381 Add new ROS.ico file which has both a normal icon and a PNG one. Update testing to test for count of icons in file and separately extract the 0th one. Add tests for sysicon.ico, explorer.exe and the new ROS.ico files. --- .../apitests/shell32/ExtractIconEx.cpp | 95 +++++++++++++++++- modules/rostests/apitests/shell32/ROS.ico | Bin 0 -> 10526 bytes modules/rostests/apitests/shell32/resource.rc | 2 + modules/rostests/apitests/shell32/sysicon.ico | Bin 0 -> 22486 bytes 4 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 modules/rostests/apitests/shell32/ROS.ico create mode 100644 modules/rostests/apitests/shell32/sysicon.ico diff --git a/modules/rostests/apitests/shell32/ExtractIconEx.cpp b/modules/rostests/apitests/shell32/ExtractIconEx.cpp index e32f3ac34d2..244081199f3 100644 --- a/modules/rostests/apitests/shell32/ExtractIconEx.cpp +++ b/modules/rostests/apitests/shell32/ExtractIconEx.cpp @@ -3,9 +3,11 @@ * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) * PURPOSE: Tests for ExtractIconEx routine * COPYRIGHT: Copyright 2019 George Bișoc (george.bisoc@reactos.org) + * Copyright 2023 Doug Lyons (douglyons@douglyons.com) */ #include "shelltest.h" +#include typedef struct { @@ -13,6 +15,64 @@ typedef struct UINT nIcons; } EXTRACTICONTESTS; +BOOL FileExists(LPCSTR FileName) +{ + FILE *fp = NULL; + bool exists = FALSE; + + fp = fopen(FileName, "r"); + if (fp != NULL) + { + exists = TRUE; + fclose(fp); + } + return exists; +} + +BOOL ResourceToFile(INT i, LPCSTR FileName) +{ + FILE *fout; + HGLOBAL hData; + HRSRC hRes; + LPVOID lpResLock; + UINT iSize; + + if (FileExists(FileName)) + { + skip("'%s' already exists. Exiting now\n", FileName); + return FALSE; + } + + hRes = FindResourceW(NULL, MAKEINTRESOURCEW(i), MAKEINTRESOURCEW(RT_RCDATA)); + if (hRes == NULL) + { + skip("Could not locate resource (%d). Exiting now\n", i); + return FALSE; + } + + iSize = SizeofResource(NULL, hRes); + + hData = LoadResource(NULL, hRes); + if (hData == NULL) + { + skip("Could not load resource (%d). Exiting now\n", i); + return FALSE; + } + + // Lock the resource into global memory. + lpResLock = LockResource(hData); + if (lpResLock == NULL) + { + skip("Could not lock resource (%d). Exiting now\n", i); + return FALSE; + } + + fout = fopen(FileName, "wb"); + fwrite(lpResLock, iSize, 1, fout); + fclose(fout); + return TRUE; +} + EXTRACTICONTESTS IconTests[] = { /* Executable file with icon */ @@ -22,16 +82,43 @@ EXTRACTICONTESTS IconTests[] = {L"%SystemRoot%\\System32\\autochk.exe", 0}, /* Non-existing files */ - {L"%SystemRoot%\\non-existent-file.sdf", 0} + {L"%SystemRoot%\\non-existent-file.sdf", 0}, + + /* Multiple icons in the same EXE file (18 icons) */ + {L"%SystemRoot%\\explorer.exe", 18}, + + /* Multiple icons in the same ICO file (6 icons) + * Per MS: If the file is an .ico file, the return value is 1. */ + {L"sysicon.ico", 1}, + + /* ICO file with both normal and PNG icons */ + {L"ROS.ico", 0} }; START_TEST(ExtractIconEx) { - UINT i, nReturnedIcons; + UINT i, nReturnedIcons, nExtractedIcons; + CHAR FileName[2][13] = { "ROS.ico", "sysicon.ico" }; + + if (!ResourceToFile(2, FileName[0])) + return; + if (!ResourceToFile(3, FileName[1])) + return; + + /* Check count of icons returned */ + for (i = 0; i < _countof(IconTests); ++i) + { + nReturnedIcons = ExtractIconExW(IconTests[i].pszFilePath, -1, NULL, NULL, 0); + ok(nReturnedIcons == IconTests[i].nIcons, "ExtractIconExW(%u): Expects %u icons, got %u\n", i, IconTests[i].nIcons, nReturnedIcons); + } + /* Check if the 0th icon can be extracted successfully */ for (i = 0; i < _countof(IconTests); ++i) { - nReturnedIcons = ExtractIconExW(IconTests[i].pszFilePath, 0, NULL, NULL, IconTests[i].nIcons); - ok(nReturnedIcons == IconTests[i].nIcons, "ExtractIconExW(%u): Expected %u icons, got %u\n", i, IconTests[i].nIcons, nReturnedIcons); + nExtractedIcons = ExtractIconExW(IconTests[i].pszFilePath, 0, NULL, NULL, 1); + ok(nExtractedIcons == IconTests[i].nIcons, "ExtractIconExW(%u): Expects %u icons, got %u\n", i, IconTests[i].nIcons, nExtractedIcons); } + + DeleteFileA(FileName[0]); + DeleteFileA(FileName[1]); } diff --git a/modules/rostests/apitests/shell32/ROS.ico b/modules/rostests/apitests/shell32/ROS.ico new file mode 100644 index 0000000000000000000000000000000000000000..587992b6eea0dc7af0f6f519ecc6d172bca513c3 GIT binary patch literal 10526 zcmZQzU}Ruo00Bk@1%?0#1_m_-1_lKMkhlWF3IPU&G6@ET&Hz7mUM?vv1_lORPY;(M zkSqvuurV+ySaV_=XF_jGX#skrraZuNw?)Y{|o&z9`ivVd~}_jKOf9x78EN;dFi z&Meb;8ssJ1s4&%S!pfxvi-RTDnYWf4>nc0=(&g=yi6ZVwQtA#aK|D;&Q~Z`Cx=ECB zO!7H$miLH8qiSbMih2J1?{{_H={^4xvv2?NpL2`%&9ARepY#0p@43%E)t)c5eE&@% zNIZ)5|9bTzo0T(Ie3nlVp1x@I^HSQZ{)m4 z3SfH>bl&di#lOveodh|UC6u=moAF++a=*I1n@>sYcWY7x!^?t|nMI4Jz)F89i(rJ=O*;c>Y+AO(9T!5}U)6NmX1AHZeCw&EdJocXf;I{oo+C zQxerS>l8)RmNI(G)%tw*n#-)vd1{9kCNN)kuIZq}KdB?+c7s`Jz^-j`t=#sN8Z~U% zRnxPs|jHHX8W{AAWFoLi1`rK@&z-4_&53&nH#x{QWF_ z^~%H#nI{+*>Wa3rG~8n2iLB*6c~@0l-j}!8-pC`X4?9X-VtcTtJw}I1^2Wx`Q?GDd2+)qa-69y-(QTbLORB#`Ca~ zjtZSKQk1OAa*fqxjjcTvFJGg$*5$?x&kvcqCv5AI?HAen);#*mo5#PJOcdA*94GL~ zwN5DeoVoZy-J!b1^xNmQF`jwBeW^j(A$&@2?5QVJ+t(VWR3Gg-S=X3)d;KjogU$LL z&PNz_9m;v*RKs(ie4hL!y9dE$->O`KZ~pqUz_K!|eu7*7d-IDDmAz-%^w?4v^uE3c zmb+_zL%(2!L4%=_b^7IkwdEmycfC+Z+7$nyjco$Q^eXr3YuC;Txu3BA0`nOLs|^d^ zE@TwoU17+uQk`R^Dc6^pJ4YE*Ub$Xk=!l!-#~4$l5YRnY@z%mw+nyeu-kaGoxzuv) zYWtHs4zEIHzTc*HY0W1SLAC~&20MR7p~?v*DmU4-Xf|Kk`u2+9r?rzAr#$st<@lx9 zq2pls>fRfVr=7ZPcKr(5gmQng3j$w+|7sXKV&KU-xQc6+6pzB|DDe!Is?L8#0k0TC zO=ET00z%G-Nj2InvSU=(&N;DrYUL~`w)t%`F{ND#IA1uW2nyIvKjUL_=-S-2gUc1! zTegMB2(hI|8>D=_YhBp*Q;V0u-k@@tgLx9xtdXZ;ijg&}R<4C)jqZPJzJ)w9*cMEV zl3>WP?q+*1Us*}6)BnqMM$_8h@P{%E_rB_Vf4O?Hl3J&CGOxp@XoE1@8`HQo=PRjo zx)(8PbiXu?|N8QZ;peX>cWUI%pX2n}%Sf%$eUd!OM#+YCtAD|>$IHe06%9RQCjC{K z;J@7I)z=w+k}s?<<~gA*=whe$>qLcOVW*B~y%0}r+num{AMTH9btkTWVs2bzZ|~-# z)V_jo#|uUAZYQ>~H#MrIPG6iJc^*@ZxZ%)ZA|b_~$lJ!|;L*I0QQ%TS1_M5!fZ(XL zO^XlOGPyTLtL8^>9Z`9>=kMC>Vh`5po0SRG+|paJHtD!>g$qxD6N6cW2%;G0JHop_ zx&<}qPMoK~c7gZEF})+l8ET&YRD8{BmzuoZU7*^F_rTW1Pg1jaV|h+7#Jsw>+-6t( zhWI6{c?^|Sic!7?w%!Z;`g&1w$H}^d+)@ofF|TA}w{NQos%`$OB%9RRb8VHi3Bx3& zt!xTkSroUrHO}kbEz#hz*F%coV)H7^hSPj3S%pR})*+X-{rR!Uu(xoN-ty9~&b`O}RQ zw;N{dTe-S`PvL#l^xt2udJ0ZH;lzAGQ`k8E<(!F6gO8{btuSubG{f$5=za6wCi}P( zCU5umTUe?pIr+rII}DrFo!)h?H1vLXqIdB=y`4W6{9JyblSd1bM^`^-tdd=OLA`N8 zO}EL?UWKFbY#)2QH>@yhSo4}&n4Pc7Q1{68Z7%yJ-9IB_->N1%`9Vh(gI?8%ql+dq z%38;J&K1}@p<+^@r$ml`lN1kc!vr>GW`!jOFEDUq8h}c0sL%@CwN1G@TKr{*ww z9Z^}BV&WC)9CdQj#>o#Zmnr6oTFW^qr!WXRZ8*4C;8LDluE;I_8~P>!2N`xH-ng;U zXI=SiE9Y(DZ)Us^U)h<$a5n(G2xZxL^bkXgw8r|4H!mDrz;j^fyxLQXf3yE~^s z@K<+P&AH>6^{Tqq5&^@T`X-Ld0nOff7r(w1=D#X`L;Mn_4HGX$mA11vJX(B%VaYs& zCD$}Ad@dAcp0GmPlUX4uz>KxvW}}0yUt30d)~#vs@n*{m{jNRTvMx`b~2v zJT{-Y>>|NX#PG|8)#Hg{(!vz!3(I)Cu5SxIeqy^HTfj8)iycka3(lI1t*dvtuXrUQ zgVDY?(Ap*4aOC7BEuIifcnQjT|M#hL^R6AdXtnQ2+suHsNBkL1P}y{V7%7y z*;3v0<^SIv`B(0=rF9#lbJ+d8`K}53yqFJUK0i94D_H)W?2Vh{KQFzs?zw6H>Gay) zyT6t@&Cg=qaCM>?gLLh5T{GTh{ilu!E32pWgx0>>`}pb4>Gw?@KR@=T?0%m(Ur))u zwcoE~3go6@r2HGxeoxD_uKvhtZ2nHVF8O@-Y(Adye{Zi;URJ!tYlNC7j@QOlKJ*u> z-&Fqi!t3hxxO?J2ZvUr&bI&XP}=YAmimkFSFhjm^6u00MlW{ZvMx3L9?T~6Qk z>UY}wW95uFpT3>c+_Fw3*=%+-+q~KPQ(jhE`7`A2+mU*O!S9v5*rK%uux7>Cr){_A z&)EOu^78Gx2|v!tHm{eR#dIZ&SK)os>MvNb=WUxXo|g))pnmjP{TbUBOaA*_VBk=k6>;bP z2gA4j-@K~XSN}nO;Vlyerzyox-^m3SNyLt?A!ZLX@wbYgTPZA%f}11^E`+?AIAgH)j#*^-<7(_aj$FQ zKAwqp+?vT?x-@iy?ser2ve&h4vQ6o@DYDM?`NNgZCNS#6tMB0sxHh3|QO+BYA6sHQ zqL21n56Ro};$!(1?cKkV8&1pFiLcU4Vi0EDa4;EBn!MThHUFCI-F0v8&ON_x?7o6t_WZV6x!{!f#M|rh?HOfcOdDpu@A<>>;I_lUxtlY0 z@bSRfa660(?(Vv8%Xmj~Cz}JaM_V`Jg4fr=_`kkAyPU!N-H#)?7N1$D-r!%qRf+Aw z)MV#qXJ&=UnwP=WV)lma{5W49_5XJ+^N-x;pVis2_OLzJ zw6_J;H?rTC-@DV3`_i`{(Kjyd{)a}IFaE5r zJ^kFieLjO5?}Nqf8?(AGi$K}za69vJ49^_5PPW6+nw;|a#;f_V*XA+3d0(^dL)Ybn zw;;9l8|jJncU=Zm<_#C7bp^Zsd%p1beWQkAdyz^mh01+4(-;@X1)B2M@meY*dmLRU z>|axVI8mA1jrW1RT?t!=^)1T=5w?WI?>8M?miS?*4TnnU`bisK9T3j0ue$Mp@v>>d zXR)*GS*wjOTB6@}Y_E|?>iY{T7{AObk_m~P%Q)re zmznE-?Yp`BV=Tk$J+(z#Yqd|#@J+w2y}r-5K{DX&6SfJZvDdyLw{OqdyWUG_Ym0j; zd28$b=;xb%r#o#8m2kMWwd~~MFIG_t{h1Vhie-99J9gRgJd)ntxh3lN*>Adc_wz=@ zGoRSC&!X_o0*T8`HQC-zw11w}`52sW$#C|uMfa{gJNR~bXNJ2e17?xr`(SZZBDx_ zs&vbWN8$CaLu(qFlYCB>G8{W~eH*Wek7x23wxXMJexH4Hw%c{fW66f@IFCr_wMu(G zUO#>=JV@O|Uu9m(owg4XEBR-<&)MPPGP~EQqi9{-|K_x#m%ClIWHPj9Jby2?#xOp9 ze}Kzuwt(<0zRVV^AD+!(y>EIyqJCwESz7Dw+*LVmRF1?=d90KmVz=#qUGeu{61N*< z1=tJ}nWSyFLT_`W?BDQgSFyZ7e6`IrC52lIy8>_ASo-7L0fpPzWj^1ywexm;VSmMMUfUq2^)@me-RkiS4sw#bX0JGvP?u5>S9 z6i{dT_tCKU^Yqo!>`36uJ@H5J!%_DKCsKX}~ZzY%K3R5W|vPvOlUR#|~dl#BL~ z)0TnDm!Q~0ePSIL^yp=Dk&(G+# z4-#cQap}b6&QyjK?ji62odY!=UWo3Vf1~#6Ma?ApPY3$XvQFRQ?_&KH)I%uvyY<$l zIi@`Orm#0Ic^7IF#{1*GyV(r;y$SO=w&^i|kb8Ro|s1Xh2I`sDl3XhMmPl!M-E^F1lg&R9FT?4HNgaO>P6#vji+I^1{V-29V$ z**tw$N7*m5F7M*E`U<8kvd!yfO#am`dT|-!lc}9E*O#0-@kukuY|h)}{f2x09`DR} z4eeb#iGSw%SFgeMo}FduwW%p*+BWAFET4JT-r2=^FJnsV^itbL>%Z^X*SA_XetJyJ zg+IYhc$fVHg?{KahrNAaFD5&9>~o!U$!)?T{^lRYausf~*WaDTbfr{q!;4>s&VceM ztWUi8i2p**<0=M^q#C;AiZ*JbBp@Tz1Jy4pUwG#FaY>R8kFeCTHHx~dH*avl28T{C zm^XMn%K5<2vSqfvbn7?aZ``&WQU?|?Nemfl zcR4dFtPIG+%$u<*W-{$~N^E#?~_A@E-9atc?X4Qh#2N^c4D{XXJ(7i;Td8u4L=;fm7I zcIRx&l&I0ag+gsYjMWW}};fEQicSR!0qSY-XT~q4QyG`2YWQ|4JAKi3X|1hLMz@ zFwxbbNJ2U2YCwDjhPxA1LFEUAx;Mb~-=DC0U_6f3R!H37R)Q`M;v-{hI+5jJY;5X4 zVjy`CjSZvAq4Pm{(8bXCAT=ONsyMnHT>6Pshf6;$abnFyR|n!_!?^4LiQ~e^=77{7 z^O4zvp|zk)PZPpIS?O)LGt)8NF6SDWI1Fux_V?eWH!1wY!xt z=;k2HA+wRyQ9~S?8R%l@e3%>XiG$?OF-#viO^iBpH6T8^IiviM8Up{ZfcNj@+27xN s_xt_rZ@=H){{H)c_4nuRcYl|EfBV~iu-M*rzaP}evmX*~5*Q%nFfcGMG;o1PC}xDx3=9na z|Nm!bXlP*g{~yF|U|{&qz|im?ME_@K00}aHkGlnx~&M<7= zyqRI<%$W>nX=x0;zP=2`#>Na%Qc?^70sk2$GhAc%|K<$Cv1{)cu04OwFk$6d28RE} z3=m(>WME)8!@vOI8XGe(7^g8X7|Fb0YJhbT!iW?)E5V_-;|$-t0yhJhjNKLZ0u z+e~8yhM8#$3^QjkFw8u|z%cVa*eHfG#taN+(ij-d%w%9VbB2N849HVy3=IEgGBEr< z!(a^JG8i)$Go&#XGt6W#W;nxO4DuPsdShb-W8*XiW8;|&#>QtDjE(<8oRntFV4Rl5 zV4OCS!8q*W3W5^gX10KiZligoXL>JaE2j`;Xeb|%f`kGX~t;`X~r`d z(u~hAq#6H*1VfrJIGoecK;eA`5-c-~8PaB^F{FXwU?xcHKP0Hm7&D}unaPlL<_tsH zng8IROZ#ukkoJEjL)!l{3}-<8W;g>0LgSeX5O@X}yr9rYW0+|S;{S&Pb(%55Oye|$ znQ1c_W~QBCm}&fSTd$MFA* zF~k2eX$=3*%w+g~<_yFCGyfU>|2Jkh^FNK@|Nof`|Noz1NJ|67Q5r+qe~=v@vq5Uo z7!(eVZTj~_oW z{P^*M;luC$3`-U)0OxCPhW-!E=%B0(j&)GB2IYGuCT12=02324Ng6=vS=opMEG%I4 zL~DSlXXhXWu(83_6Qu!JJtr3-z`=o{o}dPF_1rx802ddAdb}F2spsXx1$cO{s>i7T zmwHBiY=Dmsr+Ta!@TnINL$_(ff)6|A~3+jM3j2C24dBV zih+QL2+``n8c0#kz#t|@OZB3nq9mCwDk>^UynBQpfavgnC>ItcEIhU zoE`*F0m1Z%s$4(-e|l!b1bFiorgBC`-1(6gJHS~!U{}t|i@iMI#tpERZ@86nb7Pi= zocIAo`HWvVCnsuo&Q2Jh)GvgUv$G@WBUa)7ynZB3IV&rqK4m5zfa`bSl`}IVm&LST zBYHujtbqstP(M|Hfq}sRxu42{+^B`LXF)wlP(K6I2SV$I%E-ttC@Cp1 zXliOQgocKK`>0M%P7IcomJAIw|3~|&qy5y;e(K=wr!up!u(GnTv9ohaWE2*8xB^`AkPZ?L4^DZo0(|le44~E$ZvBMhd3kyH@R<*4LE)B% zwt#TDA1cp{-F-+sVkS_(9W8#4q`9~-|-Ga{rKf^waj4p@yp{L>4E6SFORR?2GWmT9+Za2$4D)L0bzpLDFUEzdZc!W15(?B z0f`M7SA&hGV{4~;IJFEsIsBADj!x4z~oW+h;kkxkIF|b$3gO_eEelNrG+!7oJGuAf_jDw z3=OJSP32)=U{HZhbAq%C1+34&z@W^)z`)JGzyR`9E&~I@Lv=~KNS2x$o-&&2!k^fLDB{> z?jM|fAkF>YRUi%j|AVslfa3q45C>t>-9IS&K%x6Vv;Y4GAVa|8oEq*QfDA!(_k$Bt z?f?G`w8oGCr-}RN;s+YL|NsC0&z?P_I!44R?cM*M27aKo`_G&?^MCW^%@ku;Tn>c$ zso{r#cK^(oGyj9yfuv$s+zkfzljDcM=Ki#_wEw=oz63EWo(7})iSff=cfYZ*@qZ~P zDGUsYo1x%-Yn)>fpp6KM*c| z2B+I$uEOPh(013Mg0ZEaq2hLsI~f=l@);Ny)Ij~9p@>0lXJBC9g*5*d7#cuJgJ5ef zM`=)KfDU}1EzJx$Ujno`3$kwq#A0A*04uZ7fzA&@Mp+R?adr@fg~Ld*9~1{L3OoTJp>98<6+k{ossG8h8KRSH`(c9! z6w*V_e(DY$knaD1v7f?d2Ayh#6%*_K0kfaF!HqI@1?pcA^#6d_kEjV~$-?b_TH1;* z8{K|T9Y{|+SnP+nW2DjWfq(&GfcBGth9y8F6pRcYl7Ybi`Fs(myI}DGOPh!k3>AS5 zOMnU$Fop?GSkFVW!`E>_Z37*$3B^zmm~~*gL4_7n09tU9?S8WLgWQ0?q}z|s3o5jU z)em(pMqNj9{ix0bIT-~Lw4ZGKh?Izrh1-67x)5^c`k|?gfUDt&5hMMQs~_eLdehKi HfNTl?n>Z)0 literal 0 HcmV?d00001 -- 2.51.2