From 4c71d7c190c204a59454d2f06604f0b6a0426798 Mon Sep 17 00:00:00 2001 From: longpanda Date: Fri, 16 Jul 2021 01:03:01 +0800 Subject: [PATCH] Support WinPE which contains pecmd.exe --- .../Application/Ventoy/VentoyProtocol.c | 2 + .../MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c | 4 +- .../grub-core/ventoy/ventoy_windows.c | 36 +- INSTALL/ventoy/vtoyjump32.exe | Bin 109568 -> 112640 bytes INSTALL/ventoy/vtoyjump64.exe | Bin 129536 -> 132608 bytes INSTALL/ventoy_pack.sh | 1 + vtoyjump/vtoyjump/vtoyjump.c | 355 ++++++++++++++++-- 7 files changed, 348 insertions(+), 50 deletions(-) diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c index f9323cb9..2ba882b3 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c @@ -483,6 +483,8 @@ EFI_STATUS EFIAPI ventoy_block_io_read_real secNum = VirtSec - Lba; } + debug("XXX block_io_read_real sector:%u count:%u Buffer:%p", (UINT32)Lba, (UINT32)BufferSize / 2048, Buffer); + if (secNum > g_sector_flag_num) { cur_flag = AllocatePool(secNum * sizeof(ventoy_sector_flag)); diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c index 56dd7dd2..732a96f2 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c @@ -462,6 +462,8 @@ static int lzx_uncompressed ( struct lzx *lzx ) { if ( len % 2 ) lzx->input.offset++; + lzx->output.offset += len; + return 0; } @@ -614,7 +616,7 @@ ssize_t lzx_decompress ( const void *data, size_t len, void *buf ) { /* Sanity check */ if ( len % 2 ) { DBG ( "LZX cannot handle odd-length input data\n" ); - return -1; + //return -1; } /* Initialise global state, if required */ diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c index 5d08fa68..3bcadc4d 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c @@ -548,6 +548,8 @@ static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource chunk_num = (head->raw_size + WIM_CHUNK_LEN - 1) / WIM_CHUNK_LEN; cur_offset = (chunk_num - 1) * 4; chunk_offset = (grub_uint32_t *)buffer_compress; + + //debug("%llu %llu chunk_num=%lu", (ulonglong)head->size_in_wim, (ulonglong)head->raw_size, chunk_num); cur_dst = buffer_decompress; @@ -600,9 +602,11 @@ static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst); } } - + cur_dst += decompress_len; total_decompress += decompress_len; + + //debug("last chunk_size:%u decompresslen:%d tot:%d\n", last_chunk_size, decompress_len, total_decompress); if (cur_dst != buffer_decompress + head->raw_size) { @@ -656,25 +660,31 @@ static wim_directory_entry * search_full_wim_dirent static wim_directory_entry * search_replace_wim_dirent(void *meta_data, wim_directory_entry *dir) { - wim_directory_entry *wim_dirent = NULL; + wim_directory_entry *wim_dirent1 = NULL; + wim_directory_entry *wim_dirent2 = NULL; + const char *pecmd_path[] = { "Windows", "System32", "pecmd.exe", NULL }; + const char *wpeinit_path[] = { "Windows", "System32", "wpeinit.exe", NULL }; const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL }; - //const char *native_path[] = { "Windows", "System32", "native.exe", NULL }; - wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path); - debug("search winpeshl.exe %p\n", wim_dirent); - if (wim_dirent) + wim_dirent1 = search_full_wim_dirent(meta_data, dir, pecmd_path); + debug("search pecmd.exe %p\n", wim_dirent1); + if (wim_dirent1) { - return wim_dirent; + wim_dirent2 = search_full_wim_dirent(meta_data, dir, wpeinit_path); + debug("search wpeinit.exe %p\n", wim_dirent1); + if (wim_dirent2) + { + return wim_dirent2; + } + return wim_dirent1; } - #if 0 - wim_dirent = search_full_wim_dirent(meta_data, dir, native_path); - debug("search native.exe %p\n", wim_dirent); - if (wim_dirent) + wim_dirent1 = search_full_wim_dirent(meta_data, dir, winpeshl_path); + debug("search winpeshl.exe %p\n", wim_dirent1); + if (wim_dirent1) { - return wim_dirent; + return wim_dirent1; } - #endif return NULL; } diff --git a/INSTALL/ventoy/vtoyjump32.exe b/INSTALL/ventoy/vtoyjump32.exe index 1c7bea1f15a5527639bee37e42c16c3348bdd62f..d0535a502cda3ec07cc3415e211a3fb4b31b5a8c 100644 GIT binary patch delta 25749 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 delta 22844 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 diff --git a/INSTALL/ventoy/vtoyjump64.exe b/INSTALL/ventoy/vtoyjump64.exe index a0d605629b30d3b2b6524fe45f4b54f12ac2af8e..73cd8eed4260824b3ae1ea0f9cad19f69d137036 100644 GIT binary patch delta 44209 zcmZsE30#y__y0T(jIs@b%CHD1>VPONBrYH>gMvONDCUxDlBkhdqJn9ugAEw?IECJF zYJ@Y^Z~b!6qA`gSepnZ@z3uFd7US*+)|Q zken*XkbfW3kRutwyw-MTyH57$+a&|(DJkXUeZQ2!5RD9aES&jB!6OF4$rA98(69>O zC^ks$+~q5v`#v^nd1MNym&Ix{J)boOxkfc zV7XDQAIs8PKN^y~%wSNQY8Y}#Jd?V|8=*E}*^Vz-=S$&7pE4LSocr(RDe5V0$5T5- z20!8@7meESVQ7Xd8@sXF;a#M^cXVnSC&_Eq?Z}GA^_91-U>{pEV|uKY471JiO??q6 zj%s(RdDrb!wKh{d^M~2)Z3W91zkWxjm|$7{YY#Mr*J1Vt4v=v)5yAWjc+sb++YEA(idbq;>8K4)Vy(DmhZn zM^BrXTeXj})~@#xJRK@dQ-35(Q@_y8gFyw$)(-Wj*cxj-h6k1M)$Rya9x4T#KIP!? z;|fXCh zp1}sQ!EJe?Ezuj5l8VAew`F7m=`c-Y3z99;Z1!yO6mu_KKqG;N-Ihb_Msk?_&V0$x z5TiK9S@To(xFs_*oOD|(_ar;0XQAd#h-sbwb-Q);Z{ZSe`T8Piey8bIV*7xdo>-B1 zMo~|=E$>05q@o}Y+@Fd2%Rg>+L$uq{AF2mNqwWQ5!0P)QcxsJy0^9?d*6og9Liqmou5u`fB_V@27XU4Ou{nMr8EH0&gC}l^LcQm;RquiFEdO}kgTbdFd zo&%s(tF_w5p41b10|Y@$9Q!;a+};D+OpFIxntD)C&mmu>D$N>=ilI%*FwoIl5pK(F z#ME(C8`Ayr1a)zRmU#zN3dtzz0a_5%<7{eKd#x|1iM*ZOM;b-lYTW=`Y88zJg$BS6 zT~G|iq3qP@sSi(Q;|KJRjUSAsBYiT;#s+1T4GqgG8yT&vyq4!h6*nGu8%h!nDP_ghY)~?s zLxVEaBl~EA)2L3sxK+wfckR8=nEDmw_BPDAOz(u^Bld!zqTBW-(-e1wGLYn#{j8^O zTfPdB3}|$7@fuWeOOUy^7~vk?m232DsLG4ukj2VFRE~p+v)F2b0FCE_RL2nv;=T3% z8VqQ4NI{N@;I?dnVqL^tk?OFM6zFlD#Ci%L`4l7-=Net9+mZ=XKi7>;Kr7uV!C#&4 zm4F(m`SX9Y*jO}K5pS~RHtS7hr#8#^KiUkV=8MD&yw#o@MTOsKT|!CAKC|W{R1cO@ z6WWT8@D`kPUkma9kJ+C=-cA$a|=L)M~e- z)`Ed~(_HK#0_vWP26bB=1hxKoorEqHZEVx?xv!yh{kKHp4Mq}bW*Z5(F?;ov^)xl< zAVE7iBm|OVs}fL9PnP!ze6P4a1)~t7&;fd_+?HLy7#L}nF_X{FMX@iy%zlFiSsfeZ z&PBvC&FK|d@hvhiyx|m;HzZBUHP(65_B4=s#UfmJhiLYa7FzmEw>yni2NYq9rwBa%8C}>9gJb27+pqvzH~XKhJqD;FbO{6W=wrM9 zyZ?d#>Sm5Bw$iGP9L=p-x-A_bm{`%!(QUbo#K_q;2Ptc`GDz#CGC-hthEnrT!=_jf zt~^BT2dnh(G~T-Q=4oOZt2nON(6ryb0i|R_(yU2}`VI6y0{vPyXvd5rGeWF5r7Y7L zO|gVDr_G3bF;o)IV3Z_aNMWeHiU!5{5R3H5ynMg>>2`}^WkNN|w55|Bg>oFSO*zO- zo=#<*JjCY0Q3M6Vti{5DGTJ<4M9b)uZ+Oubl0S17Rh*52yWA5y?jX&>w~c+5-(k0HzHsnu-~2;`-25NxZFQp~Ffl>;(@F3^w$y zDC~prchrv8LfW4unR zC@pzHsEEC2Oa&#)#fnaN` zz}ag^GZ-SZO*E%@D?V{AcX*=fO{_e+nydZ$sb}3iEfKK;9gGe&!%`a=I`3; zWP-?>HSGscTM4YbY7Lr|D{T6((3lkvOx4#+ z?apudA`vhXNu61ZY3ecES<)gpvR8(s$7P}zncV3#m%M_Sxh+@xNpyT8GQ2y33Ra;l z{*Czz?;=0#&k~2n$m9IkWS|cItYmnSy(h%sU$%2wO!pEFnZ*;n`K#Mqza3)`V<@w% z&)Kg~r{CZxL-%NiC}l>CNKZpdi#>&ZZr~qGkdh~nCM~)9h=WuXOCn?oU|me4S6lu! zDX>f+1x~wZKGEjrG}9);8^|ExeFaa}7Mk!bDh_T)yUQ)@HGpm(PtG4d*MTi*0#-7;*pIMPll zt>dWMZ5g7Y&#bfoArFIA2kqiXw;N6Dw#)=Kl^k_v5Y`A98E>{_TQj=I!#A+6Gm`rT z3^f>>6XewGUWqW-JFUI-I{)S)fhvKjduEq)80~>IK5W>C&i3J;Vv^cW(y16tn)??T zg~znvFbo&~L7>kh`p=+a437XVApAA3`ZY;9X}8e}^jC>~pqX9>y3p_@aW-=eK9r_j zU-ID@qhfk}CWW)VMkLF>t!D`%E%u)wZ`+lMg~m3x|5R-7kkoBy)erHdghavWZwoBnlL2|hE6HyjrzGQ?~^!8 zP7dwQCzA2W_M|Stc%pSRT5EyQU}?*4h=qrIpZ-8dkp7=Ey)WFBX<#~z(fn%ASzls6 z9RV{nvw9Cv(I3{!HCA?r_cRlZ!+ zEmAe|o~ok%QI*G4v9Y7FB9<{!h!(68vYqO;iVDa2G#V^^2K#hWMBBH2(mQ_l6o@&q zqMHro;c(VCD%Kj}4LZy`?b2cMwt11*_-Ld*KAHDL+E1+i=)U%4;BdP*`JT-4)40s_ zA7K}-(|}V?DP;qrPhixi&`8JJfC%hjA0kylOj}fie+E_SgS2E9(xfH#aeYeJS`r?i zz?6!hkbInph-e4lZ)7^NjWcy-R&*w|1t_#Z+YyHRFeyoBJ~WGRFC#o%$5|WQmd&zc z*aw?p$Sfwlok zoe9VfU773Wh^=&%7Vj7i^ULFF>02IcetoV#Rz4505f98+wtJ8z>#Q z%TCLc>Fn_b6TOPv2Da(J4i9WV8jq8lle!nBf@P}E=eOIE>!#xh-KnJFVm?l4#r}G* zN5bvr{-+}Kw%w_2OE1W0It#m_ES;fOt;tdk<9I0kDjPeto81JG)^r6Gg^Aw+g(Vko zs)5ksT;DthQH?yq zkRyS*I{0$~!w*q|6z|isGX?;mA->d=@_rZQOECe1-X}%?HDFx9W6*xuh7z7vzgXo><4aj*qbWo2gM=wQi@j z!af24Hn7uh%w$qXZ3I#`1OUw-WYSB2m`Y!;5C;;U^OD~ryCFvG{Ur~%ujC!66}FPO!=y z9%kJqL}W#N0*RiGK$`|ZTC4=ew6VAkXdWv`$X+I0o3EnB#_4Xij{mxZ(xA^tVA5gs z;)F-#ib{5O!qk3at1wT4j8hTJHm|5Qw=zxq5|mcPM-bThR}}^#Nfb416E-jnnQ(J( zMDitD`%rXzYlz6Yqau;OXAnqqH&B8O;AjKjhQP98W|h~4M_czz>Q+h`*fs` zj`O-nG0lY-r1Pdqef8muTyVft34ITfzRK_Tl#8bP;Tc1pmPMmaU1p7=c{i0^nK-a# zYsi)v(>_LuhmZoPgDJH?nwutZe;RO3QvlKWfzRemvZlVHPtiX4ucMr5_eT(vr>Pfu zoyqjNoRJ(~XwOJqcAKu#_z25AXsoZOELZPM=P*=65W`+P~lG72bz<;u*JPe-n8p=8|og ze{M?>5Cm_7iM{_Bh&HSN4o6Oy0AB#pS-R5{_XWDat4d!GGt>$*+dX-T+4(sJ1bH!{ zzU`(=?0rxlmK_j?VHs7a56f5tsTh_teXmZ$vEo$ZuMf&GmF&GKF|8+osQ2H>gVYGx zX%o9LrLX1l{*cWdcJ!(IRKzcgNG3!Gbt+n9zu=~yq$LP1*mLB;E9?L5XOHMwIJ1d9d+ z+ACj$RCab9a-tq=5R~c z40xotsc}xrFB@mgP8y$IfP1(0Y3P;x{_Zb`rk#PYfmz8e^(uOrT6v08comzid{ki@ zG;3GC#*BxuZUd9dj# zzBmL+BKweln&_*0RVC_OL>7Z?xDZAY2RoEMxoRA5qFh<|&9{_|J*ZhS?c_mFF5F{C z&!^7IL7u571l$H_%J!zTv^wER29d7@Hv!QT+1+CtWs?HzvJG>>6Fm&`t*fP^-k%348U5CZj`76441k1dlWw@%v^i{VbKz)zq#ZzVsQH# z5ePT@{0&r*S~{zaW_W}_J3&QsT3W;JB&xO+1Cq`tN3fpLLhOkc#Ky~tGrcZVuWV*~ zg?X1epr^TbE0hkH$`_LVGN6!NUWaCE7*86VlsR96zrdOz2$?EuJsL&(kZ3AeP%otR zBt{wX#@NrQE5&7s{bwXc^KOAIjp1}vFS}_kV5)jvTS@1wCGLX6r1ph9g$_vXBk5Vh zbB?bAJ__6b{_;AQWyPzhemd5s|8AFUdOms~kbv}SRw%G%I!maXkr}Rgwbrn~n5<@A zV!Z?A>&IG{&~8hbt|P0i*~mD$ipp8aNMRg07-pi5TDPS(;SbC=oV}daFGNH>qQG+? zt~P0#&e&;{_yL<3ufnb<*CJB$+!-jLNR9# zHGz#&Ps?Od^b*-9REL(INkr%k&5o?C((JNn+u_b-rAu-AHhn-kWnvl+A$ayRS^xw^ zQT2rXoMw^Jqj2>}t|VRj(V_4WMB?c1&29PaH*~AJpoim*-|{X{WTo7;oyMWAhSBG? zyahhUCREgYP>a2;w=&ioQ#=W-f*_eLelWL(%XT2nJaBX?MN>sFVZy~@w2_$#YRR@v zZyR^q<1B%lVmg8qrm&S#Ss66@R;AlrDF1O#sXP)?|G1g`I(=*4!Bz&tr`UZO%EGjU zAofm9yu7*<`zoiiTp!K;&1pBN)he8ihNwl=kSQ_FeHPk$w3)PdE5nJNv9$xulRVU? zAVN`x2C1dGm?@3Ke6>DdY|z|QbL=_cocPCRwDsj9lWHWQMmYSej?zw zmIQA!8mn+d*-%aUvJ<;9BeYZXi`@Im)0gtXQ0+3b;;_zbIav>DRjpk&v54H>_63lm z@?>&hK-xK6jM43cso{NX z7;>sIz&*p!PIFXI4>z>dc0)>wZ6+pGuvIOC*ri;nobK4+J@cAmYVvDthYo)1-&yTq zf9#THX3U2lV-yd0-^?K9PCIC?m#AR}>% zd@8=d3G2b0nw=P!0u7#lmFvqsoo$tU{n(Y+X{Li%wM9Q%^I^RnT`eC^WcwerCiEIY z6)a3kFZrP$kRHl>soeTQy%_&(gREYpTrv`AaX6TvevQ_xOJc3_ddttWWlCOtXaX#_ zP&x@Fr=csgSm$_lDlbBQJDy$3i;h%q?hr(`VQ?PRYq+n?S8{Q51M@%ZCR?&B(hi$v zfLD=>VkqkPI_%!mXM8Z+%)7mpIO=3rupm&vh_cH&ss0Oy7cFlx6!P($^A%#!iZ1FcvKy6meQf4kC$(LAEeqP%N(+N*rOR6#PH%14OIf#U2-7;E z>@0G5f+Vx7<oqm!q;yt;C&c z{W|!>$C>|QAN0C5h{|ycHg*3nJ*Krz(8py@UF%Y#qpLkXZOtwA%VSf6 z2gRX>srC9`67eprVw2}sJ1!m#7b|Nru7{J2J&N4!0`J5N4M|F_aT);ZR@)-Ban1ww zHc@&nc61Ev4YyY=FlrecG1xJsaZE@teb_rO4YYiVN7Pq{wj%-91A|uDEINZkE0KA* z_Rerhu+(oarYR;7{&8EX>QK2d<92MEH2-V^-hyCP3ZtdHKSBs&Xc)9Uq-9)|AYlj^ zw2mO5zjG1L>Vz>BglMK}{87bZEHj3z!NgT9RY0ogbNs8V!DW)#M1FC}g+fY@+W~r7 zBUMAF+T>VfwHX2meL&v=(sAt?;WLR>0+b^pyI1G#Ex> zoYsC6Yd^2u(Ye@NpI?nkjoG~S{vA&jyI+80DD=|>v|rFFdwsnP6Qeov>7Qg{)x0z#-pH6zE#FUh*4pyj3-5mAHvVApw;a#rL6KMH_mX6u9{wZoD^qz zM|+48Y~Wg*=mRQJj=#bNKAs?te4NdHJUr~sDAau>_CDk;_aNgoQM}Bu(-c$0?} zgg%WsnCY~1nakdo?~-i`SpWQ)@_SFSjrm=b_i(eMsA?m%LPt~<@jAq5CWknZvEpl` z_elg`U_hdlr1S5i&unC^7j(4SI4KDIc%X>1#Glf-aT-}Wf>9jeXoKHOLt8YlP^Ely zWlD8HTgP6U^>CBTg57I_`5gEtKl?e56Vq-dNC9Q4`Em?ABCl zllBS8tAW}F6guo0y@XUp;{^ds6iFC0cAb5{ptC&ZIty4hL-w1`@)wSiuPtPU7smCJ zF{sP&I=6yyQ7t1E&_LJYwR`pD^7I%mFnN8PBcrt<7PV-U{A)gYd{Gz6q)$-9!r;Ad zAKY3cT(m0V&`;R=i=r}mkr!M_u&ZH=CZSfC;=>@Qls&7bRgFnH!XZPW z8?sQf*94{7OR$^Gt)}4QLw_PbjxQ`2oB3q6oHUm0dh*S%M%1U#?F)xfeU4OSq?|-n zE$UhRl8C`p%x|0=G=aXK)M7<{5H`A89qL_XELs68JJhGl_%tGl>WGHPfVo*o~nD@ z30^AD?|%RJnLV|1r2Iz?t6JJses(tdV`-mIpEG1N%*EdNU?t}hH$nbq*x;u^r5Ws@ zr`AQCItz{AXtw;uQq?fU$snK<~FxT1guGl=&;#b~=FTpyoliesdYyUeShrS=o9 zZ4xg~ckVgPUbe@`M=rBUd+&K;aYLY#t<*=q;|-dF20r4i4$Fgk&@f) zf>CgdC>FfMG`u#noF;WE(AC(Ta0mN-i`d540jEi01{YNY!inH40?{S<`ONY%)rS zbAjiFvau^WV!X=((|I-K8 zV(P*Acl5z>rr>)mvk#6}4$umMRtj)iw1e!mQftiWFVLvD8fdL>Sq=bCastv~yER%- zPbgkTH2)#&=hEodbTA=?m-o3`ESPTIRDW$Eon|{a85*|ZCc`z_TMA`qWx>%ik5bXy zmf(Z>$iZfv9+5gNM0ZJ&_MRDOpE^ zJ|H0RO(=uR0R$SJ!BK(eWzO{k;Dy*HK;#uJvW7%ds=j03v#&u^za3oh8p~N7BF}z} zEm_?$cy%S%YBgrJ=E9_)khrWA(9_R<>@$_FzeOOS|s5-zvO0NY?bjzEWcE2&iEA-OT`P9 zblmqM#CIO{Ge2kVh%dTfW;aO%p?kd`tL*?p(?>Z5&YZ(0IXlV=4zuOX4Ebgzt9HiP zTXSi1aTGK=M|o)ymp3^Ee*Bo;WVGC^bpHcg=3>ltl)d}A;G`Z1hJGx)Q){RVPNd?L zxm7BSBf1HoLu9OKq=J75YIa$l575*Z>Un&PWj{*pwEv7^wFrlXu{CVbbG_xP8uspU z@p4=ZJO5mdC?BXz-4hf|HtmEq8)K?r?p{1H#uZxO=d8o?54V01TWLkbZJdk{F8j0- zZ0++sr65-MeDI(I&xVx0 z8)AZolIp0I(#ni7q75z6RO9V=Oj_Gc{$?KQu(r$i58ZB^;B*X#{!&9;70{DvQz}R_!Gk6?(eQg){&sFT`+D`UU zv~^v9Aps-vDQ&;dhE``bOzEkzfgcm|5zc%~Fk9|v3pEX$FyaokGao+3LElZ-ef zEjA)px@STCLH(tBG=JJYj`B(6`(_fc!+zwuD zGVfa$W_DBt)jv#ZCv>@EB7_>gbHkyJzG+Lm;2bGw!;yP=qMJ^EQU=N;xJPxu1j6dx zLOcCZ%#O3zPA4HlZeTevRLhQHltm5x9d6AJn7WXAqnKG<=xY9`FY&9DT%zR_vr#XE zwHwxjXvX1sngG1zs>Gx3E_-xhuVPmGLNB>T0^9RKg8a`D?3Wjk0w&`=SR7nAcJz30 zh$LUDW((K%mv>gP57&2)|5MFQBUoL{{#-vv-Zq4xr|@?be|Pcc^AWySioc%t%f#O_{5^@k zb@FO!tmcira*L_V=glGV zZ$2#Z&DG(%-lbzpEbHcC?3JOEo-8>{?WeHoZ^p=mEi7bHiu~zhHg;17dE+~5@uscv zFO!({tquV_;WDU=4JNlG<{dWXtsVjY9&K)lXPEj{ggko^+w#^2@`26lq0JA-#S_`; z&3pXLyu}CbU;nb{o7=M4Z<}S;L+r`7-;x(>W>N3N$VVrzw0ELIw{OzNjlb72Yj#@7 zb^9j`K5omMP3-A+28B)$JeZ7Z^>DolYmnRW_9j;IPE?!0cs5vnt%>FW9-Cr{22NPF zCA@Pk$W?|&^r)sCcDu{M>UTgUzLuVoI}>1~$cBHobBAq9m^AR!aGHo0QXMDUbYGGZ zH5TsE@)eo6cQAbhBR)b6#;*TN!OWXO!W;z;qrYe2r7BJ)jUDE*7vCMy?&1@=(BI&! z1IK-^elh;#e)EmC?5}sbuxE}(%7=HbjmH;z@9Kzg-1bDa{P)Lf-ib7MCk4G(iz=%e z(vx+oS}MoC&fck-8u_n+g2vY=PMqe^?ZK;6Esr0Efo-F;|Ae)#?k7L>8k<;cmGi7@ zMRmH|!OFg@&Wyf}lSw_*R7!=XW-p={s=P!>(@yrlkwm$u6PtZxQ15xKQLn-@Hm*#* zcoByVMlF2@xe2515qg6_r|VfhO5zFa-6!zrcm zw$X95J=}?%S?r1TL*&o)vsLdW$mh4SJ@1c}PbV_pt$pOXCwADj2Fh)Rz#%R#rz!rr z3=L(*$`N=UTh@KTESC47&AbGt;WIie#8FGiOKkUtqvc&Qna{TN;V;ev>p>;=EOPoa z10GG8H!d8zub9bf+eXOiGuWDK9pzpd*!FG9QY5g9Ji&#!}J|({+N6UZBVCS|^?RS15=03W5?&s9i1M8rfJ5KOj)UOX4&!9vwBpcULeWN~tG+yua zPi1)@mHL(2;HOrX8H;V~?~k6B-yh7>kH3*?2C>;Y*7UHDQGw$3_R)ll+LnZCDclfW zD2$}qe}bMIFc9CzfwelOU5#bYJFO9!gPBQ!Jalvzr|A7IW?l zi}VMJsF&Y?W=G7Oe#l61bcWB8F`rfLj1Js35UbDIocrcLc712~u2QFyd6^#jSJzj7kDY|Iyg0VpC{i46Dpna zCfvvS+rxW+^ZMV%JL%y?abCOoc>6dHt|0UpIsa~?WO%5cCHZ{F7}F9mdr%o_!nlL< zJwluysK)4S7-bi57t<3-8ItPfj)}$!Brj-1^C|&%nKh24r|^ugKvoZy8Gnsu-S>vs zgS(RZPzP_YFPclg-@YI(G%< z-s0Tt&D>o&H-~d?aPB(d+VxUz)Y(HgyMeO{niH?qxmM2ok#i?Ba|?8C3(ozSbCa66 z59?fQjouztIJa#xSD9$1IvwTg3!ME=TThL9>4~>;?m5oA)Xa_4xzBO#DbB5E=C;te z`NT~$zDs1hk0v3#!i{)egzuNEq5C3xd%A6rkOiR z=N579N1Xd{GuNhbXK?N&&V3=AzN@Y`NLQVm#@R1&_TuKm!8$jVb6uP}v6*{!0yU-& z=dR`4{>@xX=l-%aM_uwsG6w}LQU?iiDb15JwjT8dB@6PU&ps0)3!xLTJ5|6gbk zeArGpemP5ekq_-FA@JF1w(9ehp|@Yca&wLn~Y-6!l<`;yzLM6)xnSjip8z2`BVOfxja~Ds17l zB$lz=`}@T$O_Z?YhHImaz~O8M*Wh@a?!2R>#vmQlVAJJ&g8TFo0DaNVT^E2M2yAe>FX>Q-*U&94JYg(uY%UYHRAjDV;ba z2^1@*w9+Z|kv5Rpa+3QMT{XUEVG81uUpXZYly;nQfm8B93Fed|oU#NIKTg@LQ`90_ zO;Sw%q9IW3H#rgGfryQq=(KYx)>fi^m@sGlofFrimw-)jk9NOk8@59&!r`he1j zQ*4|P1WGuk^x%|ZB89>nugad2VK zyg8$S;!T)uxcjZ9_%$A{p?DpS*HZi|9E)9*?8=R31;Dcs7qGQ9O;uZ4^)9afRaDcs!fp(L9d3 zLxUFllHUGmJ^>%jSVHlCHt4l4qIe^Zms0!(9xtbOEsy6={5X$qq<967Z=v{39^X#! zEj+%5;;-^}1;(F2E9an^7{xrkf#OSeyoTcQc)XV4IXqrR@o_w^QC#8iMv4#M@g|BV z@Hm}dYE~Zip?Da@?W!6?Ab>N%C~n~KXo~;o(pw^q;u?=9Q2aX{Poj7YkJ~7Ih{qL* z@8R)mif`rdi4@<+<2e+!zraBrfl?mNr}#1+UqbPG9xtN!Odc<#_(UErr+6lhZ=kr1 z$2U^EH;-?jcpQ&!r+6ffx7aBpDXB!?x&&TW+^g zrPrJ(rstB_cV7dpL!?bkrih9muvH9UwQYV80!GDDqSs6wq-69qr<} z|BdEDhZ`@jM~?N7zud#t9*gLov_e1Yv1F=QIrv&HUe)VY3S)|}@HYL|Sw#OAP(JJy zv#`jY&^A7gqlZW)AMYp^l(X35lQ(H6B-0BU@7->F#{N2)Aq`@KPxUaF@1yr)Po3(8 z>$(q4<(lTbeoy`d7FDxU`iZ$}66KEXvg0)ldD_ct%;{LOaX9wG`iq*(L`#w{TXlMp zy!mN%<#b_mELKl`4$&|K+sPg&CfhI^a>OdR_!5?7Lp)o2rhUNASh~bPVGw)cOwV2e zKyXCE!Zb7L>D>?%EJ=y_G#v`^?>{Ap35dsmV<-zh8yAq$oJ6Z&S!Y9ow_r6OT|xI4 z$!y8lA<`G@)3fb6o_SK=9^%TV95Gznr9!>|F3mB@0dLK_vVYF@HXrXoPQ^ES4M7-Q z_=%jsUrm?WwO|{+N^22WhO1!4e)+0h=uV5+nNJvorg{BE0k<-`ul#Uv@9=i25?{6seCQWts7 z3RZk+jP&e|^OwGq%pLy5^-+c5I3g*@rq4RE_v%JgybN^pKM00-4xiZc=~z;J?9^{B3{G>vY-j^jtsbPPUT zAz0qy%-l5Q_+f<9kDdIXb9zrs%WsGL_1!hS-7`G~h!a!OQX;!!T0=;uPa<4qn#_YK zJeb;!_5X3&upcpY#NkOGq7C%m&NdbrngTX&w5P9bP`8hAg)y9v+LGTFr+ zqvg?0G53!H!csYljuH-FwJ_kuBnMvxn#IQc6elnJjxGO534DGjM*3;`DI?YR>{532 zr%r7j2C3mJ`RmqMxJ4*yffLl0iAV4yFc$Rlqv74L^~Mzv{T|i0)Cs9{HiB~}V~;;r z`Ol&D6xm}P{Rr}e26OSd*qVWae!K-un6Zt!bPO0Coi`b?5&i3oI*Z?`Fd-3D`cYENtKUc~9 z1Npv)I5s-?amFJBnKx5$+#jT!w!_@w47r873PaE8xD&kW0f^4=i0T(>%P4ErG@cW0 zXhBcXrV0k?3c7^HY%sQ6D~uUsD)^X*yvt0O+C>X-GeAXm5;cko@6@>KPo zw6d92E9SXZAoFj`7`>6mY00?(^!1mKL6{x;Hky&04VPi=p(2~PU%}#+{7{J3Nh5K_ z8adTqxH%Np0{DIs;b7o~A<#M3#5Ogi$uTBY-)NO{zhUMZ7TM96#om}DPddw-HA)@glNigY9P83)J`zl@3C=j zFXQWNU^Aluzc9MwffQ35sqKQ59|!bB{_MHmI|fe`!iNwFEx)ouzjqDX7X#U8ya=uR z*+0KW$!~hIh(BVZrc4$^D2r^Nm!RvtwA#ZvzqB%heTR{ojkXP=<2{ejxs?CU=VTC%aL!8O3$!T{~p0DXWCYBI1c zf5pnOTm$--{-?eOqJ zdKS1Hi5!nE)^A7P?OC+VOX#Le3uN0hGv;7n zn1d^|!j@VH#iuHczw4eHiV5^RPA>M)Jb?#^FFWDKX7NoFeACix$yr&O;|02ht=2vP#$&s4+8PhzY0h|+NliVaO!h!iT=<>4c!ZMe zgNfy~ybd-g?(P`qFtUYBncep(@3Wekh@`zd*EEB4agLqih^P>Cdmzgt_6nCAi4e)h-Tjb3~27}!sD=7;RY{N^%I zi>SO|RNmHX?mutH28jj!8`*8dD7{7Qz?x{oAgw0VuY;M^vt2b>@5xLh7hl=$zQ;fb zqGUY*uEst>61d(!yDgz0;Sy(y_8WWt-vl|!z$*V;lv)crv@*$o91BL_xmU?YFg5jf zm7x0LJ0@rO_Z4TCEkCO{jCwYqvmMLNw#5$Io6wf<{sGM)HW1w z1+E&iBsqJ8Ym_7<`}~R%I`rmiuID9bO8cMY(RB{J7C{F*-asvwD&ulbT8z`M7c*ST zy`=V$^Dv6>5@#PuWlQ7V8uo=2tZ^M1TzkBv#GLTcWLNc{wkgO?a}Jm3ouB3fs(w*8 zP{9{`;<1unFh5rbEpXb9KJ|0*lARA>VZm38zI0oLlT!W*wGU_?qh#VcQ18rhjr5j= zbR3OM0<9SV$_B1&MMT2|?IM2e)RAN?^w);Yb8YjM!tAY}CllW;Qme^3ctwFl8^3fK z%%P&5L$TV`@M4*Z$H6XwaPBwi6bzY(5WQ8aM7Wh(m+`npao`JeG1|AtpvqvPQ7|1* z-L>3594-?c;=qqD4ulpcr>`xY)GAN8UBir0mhZ2af_VKuVXo^{qZDSz3&vX%$K{q} zlq#}R4G;ex`^k00D8>7(;gWyNas6wQW~ItF)}*$?%!$xef+t#`g&u`xWT=ma8Z}Ev zJcFl{lC}WL$m;Rf^`$G&`uvZsO)aFFp&7?%ewd4kkN|V!L%eMnp{}XVZX+9p+)R7G zr>Nku5o*8#7*?9wvSApildfStjVoH7BNvXsrT?-YT)SFI9Y*>W^+a!{RChdL%- zaozTlK9*8lTm7ZI0V8dCaRS|zr8d`s04YR%_p+-jKw8w%r}|zo;x6BH&rTj+TVT0Y zj^N9#b|z_fr~`NHjwU1Z93H9)Tiqhpwag@S9CdYuJ|sro;}n3xjo?K3J>=ABsZ;S= z#<RZ}gDH&=_hI(5o$acwQshc#!)zd6R$WOF%1qMkyT~C{(aQXNs*Lt(mE^68F`!(Fg zFEZ*IG-%K^k9M6#@>Yvzxr5p~cug>7e;P=QBKwVUO$?Gc+kM;XLv2(rf->VBJbgeD zzd*z?(~pG8jK6VW6(=@v;uTKpAFYdA;HVqdLJugQWrCi-_%%oL^(!bl&CxTQcg!2` zpewKy#+TnQ*R>GoMS19@-N#xEk2ky5Pdc!<)t8?(DXkM(wq?J7MPz8QTd6$BS0C*Vu& z&M{J|zH8Dx&3Ap@Rmuprrt=34`mPl}Sx|~z#2(}Jc2|15l;~Rwc3GVEQJQOIy!5g> zrk5+Ko0JySK2ekul`IU=)}-BYCUy>Wt>`8VYQ23YM4Y4X%{P3%#U^PrPqdeJ5haedoedP)vUa82kTwU?_ta6Q=r><5Q{jnk4;*Nz_2S^1|PuF{@TXZdtb z*GE02_d~KTQ!&!$XNtY>Jr(^d#=Fk7FhPp(tM7qzZNI;^c9iRl1gS071J~yX(s;RJ z{_fxhq~5ai*)OR~x!;iEVSFAI72lzq=&19?yBa8p#Q?TiAznC%H-iY zc8BzqyrsaaDfgPnFU1wtM~acRrMO1-k*2n)d|x!pF}-Q7&T@U$NBUD}g@KF1exD&=rtd^)UcEVe-2*mQj85i5*!y_+OO1e7;x8WroR zNs{8_)ZMOslccHg&^^1SBugEAbH5rjE1PcTrqy@&=zg-2n}t$fzhFr{Pct?6 zsMh4l8jAl_iSl2`_o4}L4e$(=)6&ZH!#fZrb=X_fqSIZqL!~51akWa5EdKkkdoS0y z2VEo5q^{#Wg0D+oWSM(pBHoC8Q8d%X=dPlb6hS5G<+YuQ+we;<&9&Ay@w~tzq3(Ye zTECU9>NKfcWaxkK(3CvM26*bn*$w$?yX^{X)C`6mB5WtZ01-CP`4>JviLge56(W34 z$mv4(XToJJKSzX%MYuwQFNp9x9@-6`2|~39&x`Py2yG$^5gGOnp-qI@BAhD1c_LgP z!u2A2ON8A#`t;C_ukc*rCH_T(--+;rA36O^5q>B_StuHJmGhqvE%1~GSBY?g2)Bx` zT7PfFGN@?!bTDLd`}mH z_=F%rpI8wliEx+*9~NQ02v>=4qX>72uttQxh|v27t~X4Cy+k-ngfo7iLsEQ-1YwH^ zKNDe%2)`5IFCuIbp)6V=M1*l7OcLP;5$1?6UxY;>G#Fax`5X3$KHqXl!mNmi`Kr`l zqq0xj%)@`)=HbRB9wr?|xVA$Z%f$7ZkPs^A30`;y7%Dms7XOzdy4WyaOJk_1k_ZXp*~BCxWEV_X>M zpFDw|61Y_0e*}I@V7I{Acb8>L(?jg}|KWP5+vu}IV0fkar$}HrCZ|uSz&Ib#KN|#Y zA@D|lv4z$@TLkv>j8$0w zXaakNMx(%dXkb1z34&*A7+&Ko;u#x00@J{yPmsVC4h>-flPg4@Xo1C8GQqCj`L6RVN#*$57&sb6fj?&fR*BAx%jID_Rd&X9dz|lfJPhdW_42FDxX=qXYhPonN z<4z*M5+Ps}xJY2yfzhW_;8+d~2d$0{aL&RNx?i z(*zC^m<%C(q6Hq#p&?G-488q9Ob~<-LLf=tkpkNU#;KaJInN0#6ipg1|Wf z;~ZT7Dbc%qOG7C28}i@-|+4iUJNF!g_!AZ!o<;R0_FxUIl@1db56THr{5 zYXy!HSQEINz)b?T7ue?w$!4boI$99IKp@;f;5dOh3Y;WxCxI1#tpZOJI7Z++fnx<; zB5-GcOW%;}dWKyDVS^CpD)1J8;|1O$a5sUg1@10zoxnW>ZWOqez=k(@1$zq|^roE? z`Upa_5a=s#g24R*wh5dhaJIn70_O@H~N=1YRky&s)3&B;6yy z{0kEVZ{ebZiFw^p;5fne6*x&?KY{}kJXBzx&AbKX0#p8mXhD#KkCh;>x4<@mTMC>lu&=;5 z0{aP^FK~dsMFO`KxLjad+3Wcmwg|#pA+SeaNjPoQ0(%QwD{xDJHGzEvZW7o}V4t^n zjROP@6S!><&)*Oy2q{7!NnlAheTu-|0#6jUrNDUt`wF~7U_XIN1r88+gTQU=g0Mvp zQUtCLSQ1`jjljMF*9q(=aHGHh0vq1pHEt_#kiaPd#|dnggqN8l2)+U<0{aO(QQ)=$ z=Lwu5aFM`LG>s^HBT``BXdN0h3hXEFc8=|a6hWx)D6sMbH68^5*Lf5O+$eC0z=kbi zUdQqDK?3^<94)Y)zzI4=|I-gT(8uOUAaJ%PfxtNeO9@;)-y<(@kw;$Oa*up(F2B(u zFYtE4H2(Yqp~90Oi6^KL*iYa(4}SpXH+uL28{QQyVB`ECf&B!I_TV(mPXN}}e?Ns2 zY#xD3jDo8ugTy_a#EFK}Cdiv;%gibJ@V!Q-BbhBTB4xdk5o-?Ir7@`epUpjHsJ z2>h+Udj$SS;A(+43S2Aj^8#xEpAxu9;By}T-{(EvbZ3M>n85D}94GKzfs+J2B(Ngz zcLGlo*t0*#6Zp8`FA?~Fus?=UL8ul2o*j^93$;P;UlIK60?+j*6dM-L9~${4W5Go&%r{r;J+yp#yzY4sSx<6z%>GYB5>VS;r~|(LZcA)N?^kWyhYv;I7r|R1dbN?vcL%f zGl6Xa*9n|0@TUUjd?5V)lY)>h1g;2NB=7}+%LTq9@J4~Z5qP`6hXwYWlynlfLhwDi z>x1OVs8X+*xlY!uSj#}yjKTq&Ir(=EsHwu2Hz@C$j9s(Oa}J-~@p`6xb$kmcZEp?-Dpi;Lki*Y|{sEY&YZ!fl?t5Cj>laIYol+v6P;1>w_B+;VW5rWq3LSUN^s1Vq5GU7Qz+MU%>El`)JKzn?(>Y(PYQJn}zO;jDy{Pn7h9-pteT9@=w zsv}zdzQp~%K@&ccs6Y=WQr)QeYgKR22F9pv()^`~@|r(db*tttQQfKf!NmPP5m3BR z3v_9L<*H+}I-q)$ z>QdF8Rh^*~7N`zt{-dfxs>@YJR7V|6$kPh?scz5$Usvtd5nZdgQSQW`~j+4z5J+Ipb4FNz!ueAsyC^QseVFrT=fpsh1$R+s?GPjDPO2Mp!ow;=ehaJ z|E-#k2%+Af+OHMdo2WqbcU70FzAJIO>c|U3aCD) zx>5DZs+&}|s%}-iPj#p2S5_2Wvu13oKHdcs&1G)p5=Lq3Vo1-V`5D z?N|LB)g`JQQytV98IsU@^!~q96GD2x?W!|$(@jtv(fqp;TJuX)H)#I-suNN564i~G z-=MnWiKsV%>ouWC3w&AiLhbQT)vcPpSaqlBTGb&fKTLI(=6_!GAnouqs$)?tur86% z;C0BaIY(Zssza)K zsg9_ATXlo#M%9g~pH$tXdXJ|^nO05Mr3E@w&rsdfe#=+v*9NAPj&6TrtKF4S7+zDe zGI2A%>E?2OvYt`1EbPBw%*x6BF)N)7+w9!lZY|DFw%G@>r_`=pT^+6qOOo@C?e^;7 zw@&oetn{y_tXvhT33J+cdP!Y4?5|z1+PP`F-8Eu4_b>WJtwTV9dkNnyd z^H4t0rhc5Wb%$N-yNj0ZT(vynU%qNteNBY1RaPupHg4QF=Px_#5V>}k znc@0ixN><_u%fPFxjS@8HKuCyq%q4@`77#{-Ze=k#7mW*a+~_;Y2&6ZoURER?~ll_ z;rejhO8=4-b^eIdH!i%!ov5kHtLE0!hK+J!qAqk)GKvx@%(z?Sj0)DE%3r_2KQFxW zmQ~@pweu^MtqM7^glE;()K_|A zW{8!O##EUF!RfPZnpNI2w*O^h7ZveqN0J*_9SPS^vpabAD(K|ww0nomT~%9IEqlwI zO8-&Vilw<&g_2YM98n6|yH-Ak(vSOQ>*Vb-2o@IBEMi8+O^IyxtX`?ChQ% zC~Nxb&O?L$Yw3Qc_!(Q$yNUiZIbVFney$+I`y)moNzVJG3O7S9eC9 z%QG3}ml#Rgk1djPLp>kUQkSH;#~EIGPpaSgGM(IK?U;fNJ-G8y-s{IBu8yP5jA!}i zt9gY=d#9M*^{M7_pWr)Eu?$J0qL1q!d6H&cakg{p;Q}Q!y`%he{Xe zRJV+&N=r(2{`IWAqTsytE5_s8^l`k-f7F@y9B*7b^NO?hIeSU;Oi%x^%r{3*~rs%qgzEleFqY8hsRf zFShPgJI9@fqy$$>B|QhxKyt-yh+?X$t`w9!O&w~=Yu@zT#5}n<~-VB zuf1fEo6cmGXPC}Od4)!`^bxW5|Fiq2pxu1(w`A@vTC2QZ1 zG?V>sMm#N+8tD~Ep$@jHtcrBJoO5TUF8*8V;fDPOvE|xJv$=W7$gvf1&@1UOV&PK10P}$dj(R0a-6)H?Oh5sn2f3ijlbNOM|n`b@3_6p z-Em0?+Q4`k7)JwFXammrJ)AZy(0BIejwzM#kLYc3iYJ&H;^Ar9kq8UtYv^Mds;)74 z#n+lV^5{+^jX_FhB;WFSdB5Te)2}Eu;^U?09D9{Xi>G>nbQhk5Idr8-Ee@D2Zb4_U zwx2RVgVM~PcdnRY@~XzNx)a=t%a`&7A<1NRq+qhX=wR8FRBA4&)VY7J9ehV}IUgVW z8C<`>3@)C}Y|b^iE-d;O=)Un-s;EvAb@DO%9*1#7$$-iR!GFLm}+U(#0DJMDK;ep}zv90r++uH1? z+igLbDX8zqHpn*xC$fV1xv3_%INjtHWknLld?RYiW7r<8yN`PT>tizKrS+7FH1Hkm zU*>vC86h7xFnyd~x7i^XvQSOEd5F}x&-S03pT<@$N(m$?ziuNxZir3bE4JiczFT>^ z$t=21`8b}l-HV-`?@WH)4(}Pv?|Cx0{XsXqmh|D$l6!i%v);z6?`76ob=I9d&)ZSa z#Dukd)0k73)pq}if5m2F24B>Vw4Q#*BrkZxm1e~fDY<16QK58V%_uD{knaeU~r@o`V|)eVR_v3<6%Ffr|F)3+!y;OySdxe%huH%gZSGN7J8<#5%=HhB+cNAd?`m;uFEWut?m>@6)l8UJvaHSZ@MU6c}Z zx?i-Tdv;ATb^Q=KywK^}VJG&augKs47Cj-fU_kbNS(i>sG z9pNY%7?Ec3ZN702aBp$W@Pl@gyO&z2T-K;j-`tFAj*DMuP3%|R+Dh7h)+Ifjuqa7+!!(OA=%Kl2fGN3F`mMP1X3zZ>dM7dF!xP)v`-Q>}^ z`Gg&5k2p0a>yOr_w`>4+5^UYzUGK$bW9%Ih_lXhnQ$uD`bq1xld_WYmQ%hK;i6hEQ) z?#|%P=^U@z|DEky-?X*8qd@{57lIwu4SL*8;A0u-!jo77ehe-i$R!>>1g{*#Q&s!` zEb{RfN&Law!iVy+MEG4WJe(dA3y8p~VbIerz}Xg#ZX&yEK~T@z_byg&AX*HT)QyNuWc56BmLWMB$SoA`&V2 zBQ}%>h47zP0AH9+^rI9%ISL}tk*q>GO}g+FtR7z&!ZzXy4`W;KyWkgyinQWK;G0qY zNRKXrN~{|)nLt?N2!(`Gus898unm*&iBLi%AL1v6OyptRF|3f#hwyjU4ft_*mRA+$ z;wMKoqRC;8ul93cEY_B6im$551VJGq9@cv@<0e&N#d<~Ha zDFY{7Yv>_9Y`>QE?~mw2j4kmp0&qJfv(f~2UeD8XHdHH|Gtu*da3*mUNxu+tv2N_; zJn5sUQ}{2e1mE1iZ)0K7a2y^a7E>nePKqXiGS&^w9G=Y1CqsA?YryYx%S0LB)zz&3hlr~Y3$W}izC<3%=c0$=3lH5%kO036er7pSj30sx zwVdnt!eMnBgCBr5W35sK{u z=^gNqyJ)c6nk}$Hj7o*?W1(MI^C8@`+B+lK;6rQaIAu1&n!DKt_{-oAFgde2;Z5sU z|B~0(6ga=Zvhiaua1YO*Bpn{Z+9LDly6+m`M>@vTucy~;9szl_~&531~wNX?hkLqq@o~A)ER*%Fe!ghh?!To{)@BrKGx(7Yu3Tc`@Ms+;h!HMVtj(l1$Plw z$-tLynU6onnIh?M`$LQxzX_gwnCm=#|8H`ZZe}y$m%(M2%!=?mOga&Vd!mnUZKqHh zobaeus2K8TPj|$^C$PMq(Ez-13)78178X3l65#iTMVQQ1FpbbgKVsAH&9?~J zY-10}v2ZRXGa3~qib?M_!j0Rx$WTal6m!=ezODW{F!Kp7eJuQ;`dx5Hlb1deuEXRK zD|{Z45qH7xQ(POUzaF+fCGP^E7pD;mzRhMMgAc+QJ_Kvx_(DGC>K-gSgh}~h@ai32 zW5qD6emBh7#pU)S7c_WuH_L=C&*Gnbj+wykgzsP>{J8Amj22EgIRNHk%kcehBo@IR z4QFH0a0ni5W2#9%0(U;oNbz^WZ3kFy{3dt?lbI8S4|=C%J-qD)43aX7;B}pxaZ#qF z1m{bby8+=#>K}rwFEawl2xlDPqJ&=tvkr5L;%CDjVKTi(;76D=Y<|R@50g#{Z&p7D zhaT~kMi`w%_-P#n&xM~l#uVe1!t~>uiuf7u`k#8Iung6n@AXUNaIN{7N~OhzEQ<8{xkhu>6xGnAl*lo7s$ zNrz6t>$<)461WbN4hehx(i?FqdXH!S=uXB2)ZOn--4GkymAIwk{XjN<%L#h~A@ zGcm~!*1qdi8i7w?GRmjngx|AFRI~~H36u0Q@U_z{6X_@6(m!|utA;OPQfCJ|^;gQj zPW|wTbF9B)jK%p6Y&01Su>aqfBK!dC#)9~9c=tcpbolFFBPJId;ZaPc+JBzQEmlPt zKEG~$i@Ae=@4e4VNIfw91FzE=A8`I(hS*0&A)Kxm4RG&=G){U49RCrUh{gi28yk%; ze8I3>`1{}_%bLnm!#Yelw+`+|VNm$3@ODCH;)mdQEZ)ua-*pJiZ6+fQx2AI!#D5&- zWpFAny}|?Hb45D?CuQ;gg4=W%d=itpStsn9#py6_qaAEU(=ZXU_i z4`28)Cgl&orct!{D%XE;R$R&~P$&Yg8_njx?}A^wf^(I-;zl?*;Q6KS$r3t1`qS_T zCJhT`T<=YL89aXj$5BT3m&w+YR|J_K1WQ>Ljr?T$& zA^3Mpu8d|H(}~I5tPK7blk_*?zh6TEdccTJXZ z(QMYg-yAY1)E}PtEF?IYH{Y7oSP8zoP_z~6?)E4z?uajx7jeWF%FmaGFO=6k#23nI z9^wn-^$qcbbH$G$#F5yuWC-t5Unnm{NV-s7h7eyUuONsolz_kZLf=Bq_rp^4g%S{# zGD3-Ai!Z$HFn=Nlp@gd?LnxtY@r4DqdcN>-&u{eFKxsLbWeGXMbcbEo=$2l(qz0 zLM@S&hL*;brk2*0&X%s0SWCQx!i}8T?bH8mTkPP_v*=d#AUORre>y#X-*?+H&)c*1 FzX8^30`~v_ delta 41210 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 diff --git a/INSTALL/ventoy_pack.sh b/INSTALL/ventoy_pack.sh index 08e2121d..e9b1a1c5 100644 --- a/INSTALL/ventoy_pack.sh +++ b/INSTALL/ventoy_pack.sh @@ -146,6 +146,7 @@ chmod +x $tmpdir/VentoyWeb.sh chmod +x $tmpdir/VentoyWebDeepin.sh #chmod +x $tmpdir/Ventoy.desktop chmod +x $tmpdir/CreatePersistentImg.sh +chmod +x $tmpdir/ExtendPersistentImg.sh tar -czvf ventoy-${curver}-linux.tar.gz $tmpdir diff --git a/vtoyjump/vtoyjump/vtoyjump.c b/vtoyjump/vtoyjump/vtoyjump.c index 9b10d1af..eb9bb022 100644 --- a/vtoyjump/vtoyjump/vtoyjump.c +++ b/vtoyjump/vtoyjump/vtoyjump.c @@ -309,11 +309,44 @@ static int Utf8ToUtf16(const char* src, WCHAR * dst) return MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, size + 1); } -static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...) +static BOOL IsDirExist(const char *Fmt, ...) +{ + va_list Arg; + DWORD Attr; + int UTF8 = 0; + CHAR FilePathA[MAX_PATH]; + WCHAR FilePathW[MAX_PATH]; + + va_start(Arg, Fmt); + vsnprintf_s(FilePathA, sizeof(FilePathA), sizeof(FilePathA), Fmt, Arg); + va_end(Arg); + + UTF8 = IsUTF8Encode(FilePathA); + + if (UTF8) + { + Utf8ToUtf16(FilePathA, FilePathW); + Attr = GetFileAttributesW(FilePathW); + } + else + { + Attr = GetFileAttributesA(FilePathA); + } + + if (Attr != INVALID_FILE_ATTRIBUTES && (Attr & FILE_ATTRIBUTE_DIRECTORY)) + { + return TRUE; + } + + return FALSE; +} + +static BOOL IsFileExist(const char *Fmt, ...) { va_list Arg; HANDLE hFile; DWORD Attr; + BOOL bRet = FALSE; int UTF8 = 0; CHAR FilePathA[MAX_PATH]; WCHAR FilePathW[MAX_PATH]; @@ -335,7 +368,7 @@ static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...) } if (INVALID_HANDLE_VALUE == hFile) { - return FALSE; + goto out; } CloseHandle(hFile); @@ -349,22 +382,16 @@ static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...) Attr = GetFileAttributesA(FilePathA); } - if (Dir) - { - if ((Attr & FILE_ATTRIBUTE_DIRECTORY) == 0) - { - return FALSE; - } - } - else - { - if (Attr & FILE_ATTRIBUTE_DIRECTORY) - { - return FALSE; - } - } + if (Attr & FILE_ATTRIBUTE_DIRECTORY) + { + goto out; + } - return TRUE; + bRet = TRUE; + +out: + Log("File <%s> %s", FilePathA, (bRet ? "exist" : "NOT exist")); + return bRet; } static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *DiskExtent) @@ -425,6 +452,121 @@ static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *Dis return 0; } +static int VentoyMountAnywhere(HANDLE Handle) +{ + DWORD Status; + ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters; + + Log("VentoyMountAnywhere"); + + memset(&AttachParameters, 0, sizeof(AttachParameters)); + AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1; + + Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL); + if (Status != ERROR_SUCCESS) + { + Log("Failed to attach virtual disk ErrorCode:%u", Status); + return 1; + } + + return 0; +} + +int VentoyMountY(HANDLE Handle) +{ + int i; + BOOL bRet = FALSE; + DWORD Status; + DWORD physicalDriveNameSize; + CHAR *Pos = NULL; + WCHAR physicalDriveName[MAX_PATH]; + CHAR physicalDriveNameA[MAX_PATH]; + CHAR cdromDriveName[MAX_PATH]; + ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters; + + Log("VentoyMountY"); + + memset(&AttachParameters, 0, sizeof(AttachParameters)); + AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1; + + Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL); + if (Status != ERROR_SUCCESS) + { + Log("Failed to attach virtual disk ErrorCode:%u", Status); + return 1; + } + + memset(physicalDriveName, 0, sizeof(physicalDriveName)); + memset(physicalDriveNameA, 0, sizeof(physicalDriveNameA)); + + physicalDriveNameSize = MAX_PATH; + Status = GetVirtualDiskPhysicalPath(Handle, &physicalDriveNameSize, physicalDriveName); + if (Status != ERROR_SUCCESS) + { + Log("Failed GetVirtualDiskPhysicalPath ErrorCode:%u", Status); + return 1; + } + + for (i = 0; physicalDriveName[i]; i++) + { + physicalDriveNameA[i] = toupper((CHAR)(physicalDriveName[i])); + } + + Log("physicalDriveNameA=<%s>", physicalDriveNameA); + + Pos = strstr(physicalDriveNameA, "CDROM"); + if (!Pos) + { + Log("Not cdrom phy drive"); + return 1; + } + + sprintf_s(cdromDriveName, sizeof(cdromDriveName), "\\Device\\%s", Pos); + Log("cdromDriveName=<%s>", cdromDriveName); + + for (i = 0; i < 3 && (bRet == FALSE); i++) + { + Sleep(1000); + bRet = DefineDosDeviceA(DDD_RAW_TARGET_PATH, "Y:", cdromDriveName); + Log("DefineDosDeviceA %s", bRet ? "success" : "failed"); + } + + return bRet ? 0 : 1; +} + +static BOOL VentoyNeedMountY(const char *IsoPath) +{ + /* TBD */ + return FALSE; +} + +static int VentoyAttachVirtualDisk(HANDLE Handle, const char *IsoPath) +{ + int DriveYFree; + DWORD Drives; + + Drives = GetLogicalDrives(); + if ((1 << 24) & Drives) + { + Log("Y: is occupied"); + DriveYFree = 0; + } + else + { + Log("Y: is free now"); + DriveYFree = 1; + } + + if (DriveYFree && VentoyNeedMountY(IsoPath)) + { + return VentoyMountY(Handle); + } + else + { + return VentoyMountAnywhere(Handle); + } +} + int VentoyMountISOByAPI(const char *IsoPath) { HANDLE Handle; @@ -432,7 +574,6 @@ int VentoyMountISOByAPI(const char *IsoPath) WCHAR wFilePath[512] = { 0 }; VIRTUAL_STORAGE_TYPE StorageType; OPEN_VIRTUAL_DISK_PARAMETERS OpenParameters; - ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters; Log("VentoyMountISOByAPI <%s>", IsoPath); @@ -447,10 +588,8 @@ int VentoyMountISOByAPI(const char *IsoPath) memset(&StorageType, 0, sizeof(StorageType)); memset(&OpenParameters, 0, sizeof(OpenParameters)); - memset(&AttachParameters, 0, sizeof(AttachParameters)); - + OpenParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1; - AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1; Status = OpenVirtualDisk(&StorageType, wFilePath, VIRTUAL_DISK_ACCESS_READ, 0, &OpenParameters, &Handle); if (Status != ERROR_SUCCESS) @@ -468,7 +607,7 @@ int VentoyMountISOByAPI(const char *IsoPath) Log("OpenVirtualDisk success"); - Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL); + Status = VentoyAttachVirtualDisk(Handle, IsoPath); if (Status != ERROR_SUCCESS) { Log("Failed to attach virtual disk ErrorCode:%u", Status); @@ -476,6 +615,8 @@ int VentoyMountISOByAPI(const char *IsoPath) return 1; } + Log("VentoyAttachVirtualDisk success"); + CloseHandle(Handle); return 0; } @@ -789,7 +930,7 @@ static int DeleteVentoyPart2MountPoint(DWORD PhyDrive) Drives = GetLogicalDrives(); while (Drives) { - if ((Drives & 0x01) && IsPathExist(FALSE, "%C:\\ventoy\\ventoy.cpio", Letter)) + if ((Drives & 0x01) && IsFileExist("%C:\\ventoy\\ventoy.cpio", Letter)) { Log("File %C:\\ventoy\\ventoy.cpio exist", Letter); @@ -1010,7 +1151,7 @@ static int VentoyHook(ventoy_os_param *param) if (Drives & 0x01) { sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path); - if (IsPathExist(FALSE, "%s", IsoPath)) + if (IsFileExist("%s", IsoPath)) { Log("File exist under %C:", Letter); if (GetPhyDiskUUID(Letter, UUID, &DiskExtent) == 0) @@ -1050,7 +1191,7 @@ static int VentoyHook(ventoy_os_param *param) if (g_windows_data.auto_install_script[0]) { sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.auto_install_script); - if (IsPathExist(FALSE, "%s", IsoPath)) + if (IsFileExist("%s", IsoPath)) { Log("use auto install script %s...", IsoPath); ProcessUnattendedInstallation(IsoPath); @@ -1068,7 +1209,7 @@ static int VentoyHook(ventoy_os_param *param) if (g_windows_data.injection_archive[0]) { sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.injection_archive); - if (IsPathExist(FALSE, "%s", IsoPath)) + if (IsFileExist("%s", IsoPath)) { Log("decompress injection archive %s...", IsoPath); DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber); @@ -1173,12 +1314,12 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) CHAR ExeFileName[MAX_PATH]; sprintf_s(ExeFileName, sizeof(ExeFileName), "%s", argv[0]); - if (!IsPathExist(FALSE, "%s", ExeFileName)) + if (!IsFileExist("%s", ExeFileName)) { Log("File %s NOT exist, now try %s.exe", ExeFileName, ExeFileName); sprintf_s(ExeFileName, sizeof(ExeFileName), "%s.exe", argv[0]); - Log("File %s exist ? %s", ExeFileName, IsPathExist(FALSE, "%s", ExeFileName) ? "YES" : "NO"); + Log("File %s exist ? %s", ExeFileName, IsFileExist("%s", ExeFileName) ? "YES" : "NO"); } if (ReadWholeFile2Buf(ExeFileName, (void **)&Buffer, &FileSize)) @@ -1189,8 +1330,13 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) g_64bit_system = IsPe64(Buffer); Log("VentoyJump %dbit", g_64bit_system ? 64 : 32); - if (!IsPathExist(TRUE, "ventoy")) + if (IsDirExist("ventoy")) + { + Log("ventoy directory already exist"); + } + else { + Log("ventoy directory not exist, now create it."); if (!CreateDirectoryA("ventoy", NULL)) { Log("Failed to create ventoy directory err:%u", GetLastError()); @@ -1226,6 +1372,14 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data); sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName)); + + if (IsFileExist("%s", LunchFile)) + { + Log("vtoyjump multiple call..."); + rc = 0; + goto End; + } + SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart); break; } @@ -1256,6 +1410,120 @@ End: return rc; } +static int GetPecmdParam(const char *argv, char *CallParamBuf, DWORD BufLen) +{ + HKEY hKey; + LSTATUS Ret; + DWORD dw; + DWORD Type; + CHAR *Pos = NULL; + CHAR CallParam[256] = { 0 }; + CHAR FileName[MAX_PATH]; + + Log("GetPecmdParam <%s>", argv); + + *CallParamBuf = 0; + + strcpy_s(FileName, sizeof(FileName), argv); + for (dw = 0, Pos = FileName; *Pos; Pos++) + { + dw++; + *Pos = toupper(*Pos); + } + + Log("dw=%lu argv=<%s>", dw, FileName); + + if (dw >= 9 && strcmp(FileName + dw - 9, "PECMD.EXE") == 0) + { + Log("Get parameters for pecmd.exe"); + Ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "System\\Setup", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw); + if (ERROR_SUCCESS == Ret) + { + memset(FileName, 0, sizeof(FileName)); + dw = sizeof(FileName); + Ret = RegQueryValueEx(hKey, "CmdLine", NULL, &Type, FileName, &dw); + if (ERROR_SUCCESS == Ret && Type == REG_SZ) + { + strcpy_s(CallParam, sizeof(CallParam), FileName); + Log("CmdLine:<%s>", CallParam); + + if (_strnicmp(CallParam, "PECMD.EXE", 9) == 0) + { + Pos = CallParam + 9; + if (*Pos == ' ' || *Pos == '\t') + { + Pos++; + } + } + else + { + Pos = CallParam; + } + + Log("CmdLine2:<%s>", Pos); + sprintf_s(CallParamBuf, BufLen, " %s", Pos); + } + else + { + Log("Failed to RegQueryValueEx %lu %lu", Ret, Type); + } + + RegCloseKey(hKey); + return 1; + } + else + { + Log("Failed to create reg key %lu", Ret); + } + } + else + { + Log("This is NOT pecmd.exe"); + } + + return 0; +} + +static int GetWpeInitParam(char **argv, int argc, char *CallParamBuf, DWORD BufLen) +{ + int i; + DWORD dw; + CHAR *Pos = NULL; + CHAR FileName[MAX_PATH]; + + Log("GetWpeInitParam argc=%d", argc); + + *CallParamBuf = 0; + + strcpy_s(FileName, sizeof(FileName), argv[0]); + for (dw = 0, Pos = FileName; *Pos; Pos++) + { + dw++; + *Pos = toupper(*Pos); + } + + Log("dw=%lu argv=<%s>", dw, FileName); + + if (dw >= 11 && strcmp(FileName + dw - 11, "WPEINIT.EXE") == 0) + { + Log("Get parameters for WPEINIT.EXE"); + for (i = 1; i < argc; i++) + { + strcat_s(CallParamBuf, BufLen, " "); + strcat_s(CallParamBuf, BufLen, argv[i]); + } + + return 1; + } + else + { + Log("This is NOT wpeinit.exe"); + } + + return 0; +} + + int main(int argc, char **argv) { int i = 0; @@ -1263,6 +1531,7 @@ int main(int argc, char **argv) CHAR *Pos = NULL; CHAR CurDir[MAX_PATH]; CHAR LunchFile[MAX_PATH]; + CHAR CallParam[1024] = { 0 }; STARTUPINFOA Si; PROCESS_INFORMATION Pi; @@ -1297,6 +1566,11 @@ int main(int argc, char **argv) Log("Current directory = <%s>", CurDir); } + if (0 == GetWpeInitParam(argv, argc, CallParam, sizeof(CallParam))) + { + GetPecmdParam(argv[0], CallParam, sizeof(CallParam)); + } + GetStartupInfoA(&Si); memset(LunchFile, 0, sizeof(LunchFile)); @@ -1310,6 +1584,8 @@ int main(int argc, char **argv) rc = VentoyJump(argc, argv, LunchFile); } + Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam); + if (g_os_param_reserved[0] == 3) { Log("Open log for debug ..."); @@ -1317,28 +1593,35 @@ int main(int argc, char **argv) } else { - if (NULL == strstr(LunchFile, "setup.exe")) + if (CallParam[0]) + { + strcat_s(LunchFile, sizeof(LunchFile), CallParam); + } + else if (NULL == strstr(LunchFile, "setup.exe")) { Log("Not setup.exe, hide windows."); Si.dwFlags |= STARTF_USESHOWWINDOW; Si.wShowWindow = SW_HIDE; - } - + } + Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed"); } Log("Now launch <%s> ...", LunchFile); - CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi); - while (rc) + //sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe"); + CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi); + + for (i = 0; rc && i < 10; i++) { Log("Ventoy hook failed, now wait and retry ..."); Sleep(1000); - rc = VentoyHook(&g_os_param); } - WaitForSingleObject(Pi.hProcess, INFINITE); + Log("Wait process..."); + WaitForSingleObject(Pi.hProcess, INFINITE); + Log("vtoyjump finished"); return 0; }