From 3ca624f3eedf94125458ec43c9e4f59e1d7e4388 Mon Sep 17 00:00:00 2001 From: longpanda Date: Mon, 4 May 2020 23:46:51 +0800 Subject: [PATCH] 1.0.09 beta1 release --- INSTALL/Ventoy2Disk.exe | Bin 290816 -> 293888 bytes INSTALL/Ventoy2Disk.sh | 85 ++++++++-- Ventoy2Disk/Ventoy2Disk/Language.c | 6 +- Ventoy2Disk/Ventoy2Disk/Language.h | 67 +++++--- Ventoy2Disk/Ventoy2Disk/PhyDrive.c | 124 ++++++++++++++ Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.rc | Bin 7990 -> 8660 bytes Ventoy2Disk/Ventoy2Disk/WinDialog.c | 213 ++++++++++++++++++++++++- Ventoy2Disk/Ventoy2Disk/resource.h | Bin 1976 -> 2912 bytes 8 files changed, 450 insertions(+), 45 deletions(-) diff --git a/INSTALL/Ventoy2Disk.exe b/INSTALL/Ventoy2Disk.exe index 228eb99082c3b2a7c883f7c67ec0b6b03ba78227..a30726ed51f7d4fc4a16cad1727edbd03d898ec4 100644 GIT binary patch delta 45749 zcmce<4O~>!_CI{~VMYfW98^$5KulD8jYJAV6cCUUbPxp1*Yc$kS((k4l{(OXF&@VB z9(C+W1z}z5ddnLs*i{2H!LF5+C8ZU0t$Pe^VH#4A^Z%}WW)RKp@Be$A=kri|&N*wZ zz4qE`uf6u#YwvR`XzEqa-fPnYQDB=Vrr4Io4>$Lays5hNq!fkchuL?MKfj)qCh=>t z^ct?0Uw@nDUw*w-ip2A9v!C=ATqDIFq8n19-Ar% z8B8zybnBi4-n=G3WIdQs5L%cZ91%G^DVR`GvCEZ>%`+3#G|#wRrk-@8g;VO&8wN}%0NPb5hiqSt*%&AaD_}?m;E0nqZSH;O_YtI?tkAceWo}uEnAmyE& zQ^ynO8+f4_G+u}+@De8n@rHb8?d{-Aa`&s3ZWobhXTQL z$pHxwyU##s-^@QM7pqs@ZaK4KVa&UZ=o*j^7R*&Qo>9sJ`r90t9qRj#jNDq>W-1zh zOi70y=eodrAx|wH$OQW_qx1P-Z$`e5tv<}52Kh{O7O1MVy#zv%-?O*7O+_DpyqeJA zb{E&0ijUzTuDjK@LIq=vZq2>qPvrO2gUd`!NG$ zZa~qt)PF~qiVARd$+Rx@9LHHEr=B-e&uU#}`ec156nL3qeIza$Qok)(KNL4|YP%!N zXsS+aQ=Gjf4SW*=K|a24!CWqh_tcQz-0p=7Vru#G$&*S&|3KTgYa+EL1izXr2-&%L zj?5NQ(H&^ED*fUWPn1^*9`S^S-%LCP4)utqMV$k4aZNl;XpH&^D3W+Sz(ZVj+l}&R z*Q8feg=`YfNw0WJKXLKc+nK3o8#42mGgnui#!ZAKz|p}}85GF!c#PY*BvOz+a%Q%w zZLng_=Sf_}Zc9L(b5^VTPxXWAA4Ppp=r#=#1nVtwu1;Os z7mU28z6?EysU=xvcEr4^)}K}~`-J&Pup9Pcfv8`x^ht?+vo~-vJ4og+@6J`HoyH@S z5aXHtpvCqUV{V@OizBn$wBH|vzV5T6JMa9>y_L+sh}i+u0oKvZ^sA=*dde`p-e9WM z8vw3r(mz}HwHv+Q<9{AGKBww_@%8zjxsTI)4f&K$5ar2Mqnz52>$Vzvj+os+fv+lW z2M!F~@)E|*hmKf2w)n7gaFgMHx%g91UjrYJ$W_9F`itom%J`r#o5#2?N19F>$ucjl zPl4PMLSIW3);Q|*o63^~@FgtpwzRXg0n}Q#ZtRDS)OLFU;Rz+P+}0lI7`NNKVU`;T zYfsohU{g^LNRaaT(-nhBkE>07Kc>x@#2l%YH*H`^MYYzSM`m6wKCy0@>^2?NO|;j3 zY;VtaY@%s@fiW^sa7Pwj9-Jr?yu+GD7Q8dId1%2qLz@S+9bp!I!8>AezqTVH-QCvg z-*!Z2F%-Nrtl6jF9fSOSnpVfPD&jA$c>$c-V%o;X(x|X@EBN|T04hT901Xq}r#7Uz z<+be_8VbH*C7D+(0T|qVe6%2=xXl`{E5c#~ER7o&zzWu06|6yk_Cjvpu5OmT$Zh;t z8($V*V3e$ngIFsfI;)U}L6b;>7RJ=_tLz?*_C+F1K?*?{h%|Mu@@n6?vja8Ny3AFJ zx>~M>B3!xXSlceoYM0v`nXPi2>Gk*PQ!&OcA6Q#Pe&CqZ?lg{#Z&;-tdBl-wlrt~O ze~-dYiN9(!$c3YD*KAYf_ZuF|wUn8l?(J@iUt0W?mH)<_^;Xk@>N~e(_;}t=7Ju~K2K2Q&t3%E-*01Ne(DQ5ED5qYo`@z@eNS^$G{GM6$r;!Qd z29{}ryz82LS(?G;R7|a7RtMD&=c_;J2eAv}7TDgRdPla)sfLk9;@eGA+Q)CCI!r~o z!JW51^E~o_R3^6n-}ZPB?8blVaj;P6wo&z#F`BZy`i0hm-I)97=CturLW)M_Qrb^#)RyF}fBeu_V1 zdg@V(lV%@0p!ed_jH~?MctG;#PD2Xeh;z`SEKi>pU&p8b8dd{MKbZ|<6e z8S6c@?uy40j>EL8DeHSZXiBgQ=8AqRHBW;-{U4GS&Gfz~_%oyzr-?-H|nKcI$Jjw2~_!T@U&NCI4BkzrQ&dEL- z3`Hj_eaWLqyz?DPH+r=Gw84;u%lFgmSKXG!F?x*hCs}#$Y<|9Gz!omRVB^jnW*n2e zwj-wY_?+&7*CD**oX$3MOXHL3Mdu7g6>R7}g+KpXLn=S=3JS%ynr5`-X6LC9eYr{< zPnqZzG*<{SQ)d+?tKuVWGl&JBDGx>2#a};FE=6UA9P}YMw2wUtNyPPE6_I7ye^ma& ztS&*j7;7F%9 z@_f^2sz<+_6!0WVx@q=5m=wG4Czod(40 zwi-E}+uAPGqF>egmE4VssqJya+VemGy5``C#zCjwDtQ;SkAYM+X(#O2Odge_|6hc!Hh5LC@-Wc~pj>gn!M{46Wrdr8j z@CxmbwqKP`&SJg7W8AzK{yigIj1I(1dgge z38&F9>zu|r#Ny0U^Mx$TA?7?yFi<#m5Lb%KcC1&&XR2MgO@->YtsR{+CIkuYHC zp1)8Fbj_B0!L;)oUuSBgx$Z09nOPoknb)c#RX=}&s%r{z{&xy;zN>;nFREHF(dr|b zld3*WS|W;xiB<6_2+WuhmFLnD#CeIzxwPTp@<~efDfeJ--alo!81$TSU`m8|sZ2RL zr9@nmRJAmHE)$JAlp}ZDA!h8U`t`1XdSm*YWMNriN%*qL^gYVZ8RKT3G{ZZ4&;2G{ zP1U0Ph-hz*SlQj)ey6pySx=Y#F|~!ioTBU$tiB&N*1*&Y+%br0lXd$tKoREM2bQ+@ z1TIW)7y(q?m@z!Cpfd!Jm*t$*Sf6@Ym!}nnPQ`&w3+`dZknvTl68x? zBB|=#tR*ab$L20Z+p`#3F8fcwkgSMnP-bMG^Z#HLgBi(RGSjRM-JrzfETi_8=PczT zwR>*Z16seAJ7(>?rnASij_~xl*5!q3k7)|q&_!X7c@(xm>-A7XtFUy8IpJeHFCXud zd9FvDH9)??b@naj*)zHQG|OP!?#L{=R$uK+>#OA*-`YjRYI$|JT4m2oQ7-0=r2Y=i zv$C1gj=BqmlIeZwQ_CQCm`bk+^^m{8@Mz>4e@8xBBmYWj)i<*TFk3nngf!HQ&G&ef zxcqu0zNzePsEo_*IxDA%&ST|+4MF(Yc_1phQ!T-)Y~6ha-}db@Sc`|2tu{VuU)ZyJ-dI zOzYKIy5MPL`uq|7ZUYLR?t#^rH|goBXXf9<#3EbOXA8FKFxaXdS=?PDTk^!xL0Md< zoGWNSR&2rVwXWE%_4EzW+0J{q>m0DX>kxl2PH9=XgNQqpd5JIL#Ft!0yzHjL%YH|^ ztSfQl4&~QnWkmeh`@F;@PJH=w#2ao(yy17m8@dv=->&qKa=3|=!aFC$)Gm|a!JCpj z_&c%(yOKQ?tGpvc_WQ@0n{>^ICl&qusr?pGULOpDuHE+Flgd5!j}?=Xl&$yA6UQc1 zUAq4i6Bi{aZ$EHYT%M>DFHaW>606={{)lM1A3xd{7xohf3PqxR6=02wZ>)XPs0wOQUTMrxk zwkN>`$NzX>Q;PEO!v&(bP{~{IitUwxMBy!@kCDDX`Uy#2m?#7x4MB=U^7`g<1?9pP zECsHMwB}_=8L0>(r*3y_JrDOXKiVAQR)fKl{a8T0nCA}CiOE73OjV9P za?2fE5O)#cs~nL~%(6jF3UHsg3CV_3C3NLb|1M?KRAt7>Nj}@fWM%WpF+RI+J+iXY zrv}%oN7wo^;QGO%v0|@B6@z8_#8E4>UUY5^gnrMI8o{|)X6{pRt6Urb5U<;Sy4x(l zxz{&m)D-0l%dGEoOt=9!kAP8KfOs}b;|SWP z3zUF?0IDitt!NtsPO)&Kz-eC(zaD)wYx=01Tose>+de`z#?+d2Hu~26%h#NpD+Q** ztu8(WU2r^CgI`tR6a$>aq#rz{kH%y`+7liN5m!B^%zkWm_Y@RTyA4xH9=qMA6j^nT zjT{3-k>Ry*x#vkagy9^@>vQir4N~rXCy8JwWmtwPA*+XU-%I!DLzT4EF*X#}HV}Bd zX7|1ZDif3gI1PPb@bD(+tv4eQ8M)GBqR==5J(Sr_VmKc2E)Dr^%e6j}&QX31@?jF} zYXbzU;doJOGic4z+Gmzpfq{yXiE=G6)S`z8J0PYl+Z|*^CCwYvx1q}3fzAhcE&9DP z_TNt1DT$E6osSO~Sc;lam!sGW?h$hd#LASPP4? z)TqJWLkTbiND?v&AbSWHlC`_t)(DSyHB7Uln}*hvMJhi&KD;lNlVz&?P!0$SmL!-F zaIf6 zcCfPRiE)AN=6hrgOUq5M`o;Z9>k|Xu`5K>$3$6J(r{yeO4GOtZG)j6JJM2Ma(USv` zIlILX(X~B~NbD z>dQ9gN=1b9z%9z)H6thOr2Fw8zTvrtK^JXoj?`|8&RRq4SI4dkk{Spn2sl*?-B-d9 z^Ov}T;vhrkngM}atu^vyDHJ`ZemF=uxF&QgZfnNj$COfM_U5Nk{*FOh1OXVJzSnI(N`)Ql7POGzR#C5WiJIp_T7Gri(wmvc9vkNSJ16Czbsn z;=0ay-|dyoG0Odb=NiZ)c=lY}%RD2Zg!2E+^L1UU#+S%fF0Kt3RNz@4#7TT(J%1w-1CXgA3+`Q%CK6ZZ+^c!s(*m-`%G?R}eOsOQ_ND+-x9S&wRGjN>u+I zrhHy7T9b*@8}^U_Gm!OAm=aMK-i>ajhAAn93Ads`7?XkSeZ-rGoV0=vE{1X;T-XLX z@7|X}tj8=-_7n#CYct?>LOK+xd{8)ch(;yqdMXDA;bDzRwrXFjL_IbAjxX-zR1qL- z!E_++%K=?^asb?faG#^vJZk0|k*ij9qSg&l{`S;BV@W4q+c2f^sfau0bprA`iMfmC zfn?$FL=l^&4o+Wna6FxRpC&U>jj{G=0dp5HVVNlkvE?640s2k%Do%U67ITPF8WR&Kr+ZSod<8jXHE!a{+?43{WZ$@UKuh+I8h{9F< z-l@e;O-0=x$7^Bep@1Xmsytd0neGY98W5P}L0WIH-XAW_HGsU%;8@#%b$5672OPso z%uju@R3r9fQKaqKK9zF{GplbCr!V zCB&nfZc8L&Eya;+Hw7!-7e}#Alz!`n+5oVhayt^J3e)a7-#XRT;ZKZI5*uoSwhgUD z$uI)io+mZ~Lh!_c*Y*0qSCfTPTN8zPJ>PGKSXATVG}Bsw%#ww|g`f8$Sr}+}D>Mhf zFR0hkCMi9tkJw0$Tdz^B+kodFzAyP9Lhc`GA@cY#bkwyT^2~?}WtcPCk%l0%<@o`{ zXDzd^pCQjO<|1^J*KE+XT7*sZgdDU*kbklI$+2eK`m}15_|Mm>2`W5F^|&(wF1=(ujM;%#rTh>+z@}C>-0tyQ<`DT7JaiHH zB9~X>r*NmPe~gPf*dy}1zFg#dTwQn!lIDZ!n%oc6k{(U=O~VnNE>Ik0Oa!piCU#jtRV8(#=sdkwXeox zCFRfwic7>t9FhDB9Z0e6b*An?xSq1*PY|V+Gk2-K%_0JU@zy=2;@yP5obVqb{Md1r zeZV_BP|}~py|MMG^`%KFC&)}-A-`F#?!p#oed->R$NHAS(!1+ZiJD-ppxVG*fZ$V) z4HpDVc`UrOQt-uOH& z8T;CD!Ezgym<%CVe9h`WPfn+#zU9*~_lJk(qQRI-xWqK{R)C-vnoCYzteC5;k;B9| zv$8`THvWAo(Fg?0I=4Af+hab&nCLh#8?ra6zXecPoPM(ml9p3%WYAfYW4dg0QLgf< z9AVx(lb&%h4;@4HA1-qg1}Q0BE5_|r6ZUq0r(`hIB}D9ePq=96ubR%oHBnnoc4(CRjeh=7X{ZxgIUUh8-o{J zL1$3sX93%}bq^ML>bQUNmKGeMC&4;dI!6>Yf+7S~mEsN>hu*4FeReU6;RE&R(Ot~i zZaRDv>oee$JXeM))J0T3HB9+t4Ubhy?mrOZ?wer7mdn(m{fXh9JOPW+wV(*Hnk_h_oqW%!&y(_=nV zfB0OBk$4w067hE@_=6CoP4qCDKj`xBrFh7V9cBK5`hL`GP1pLQ2BOyF$GZsq!_*Xr zoOUD(w1^FrI%X=5Z;BDIe>)YxwUvy5J9347mx5LJlf0@CtO23M0T{I08;W z7SrJ3L8V-?gX^+t-Ufv@R5}QpX(JK(AkWaLbH3)|Q7eM*YmQQ+3?I`z2dYrK3seH` zrn}v^i^iSlaC>t%=MJtPd-v@GG*3#oTRE$Qk6c3BOzh4z+A|8>L8EAJat4|QdWU9d zjuN?Ll(;8HnYkrWZ2Ll4y=5qgrRyLj{t;u+#_}nmycW|R#m4+4VHO@A;*UBhf*$U{ z11u$3T;3O2WK_-olom1CACG1(*LR6#;&6DLgp()eQzdL`ta$epC1>k+F>;pj%+??q z*SR3Fp8w5KJ}`r`)kSq^z7(V!;%gRalc(vpkvxEP3PkQG-a?1CJVp{Yw*d!?d%QVM z2y5OnVG`#Z)0T5L3S{xQ%<0^N?#n`;lnzs5fwae{uKn^lqiTXtRqowp9$i9Q6vODF zW@qtE5JFkrCtVCC2g6`0UvBG9{Q&=#W>5N03Ke{XJohJ_Wucrv;y}iA2I>sS=Z_53 ze==__pPj_n8R)DgAEw4P!ALdQ$V&Z6Ge`$nv1%avPB>rRrS&WL&~+U@oR2@USIho@ zk4ECdOnhuz51mumTp|7Eoh4}+DHh)hP4^BBW3DoM`;c@V?cy=&$rTiLa-T9w(Yc`V zF{}gF=RN5t-bLN~tJ~u5iLJ{V0xi|HF4S~o+xA;*9s;@2Jfg6QQ!qMFk-=(bx5b)E&b0mI(CwEfF&1ZS)AXrZVhvX^ipBp@;JXyd(rvvgAtPjHT z=eow7{{k+4oST1`9U#1Y#=0z%^EoPQW;px zGpnC@fwLiYFYs*u<=EBGlh)^li^>LNzzez9Gs8T15Jerud+2xTUi{jx`kJ0@11UL7 z0z$K|C#)uGw4B967Ir}W&7u7Lg}X`h{L9CR4?2{j^0l^{{fYD@Lo_aL9R$-CT%eRc z#~q}?NEg?>RSVdGQ}{8Z{M@{*_{3Z1a9?wt1KOJ(1fZ1wmpy=a0O&C7*BJ0)N@;JN z20$PIf<1sc0f-_%903*qWjKYL-ZJB{IlS=DF*IrWor3UI4k0Zfq_p;C{aed%CzYcb zX%Bwti>c{g74C`!t%kNPC+XmLmjxSxlnKxxwDq})n7OM_R?}*U;+kePXEOCeXmi>! z*_i?HECUM>rs_I#p0wpg+$fG4+#Hf8?Y=S3I9VC_;;==vfUDo&1UCA%a|bDC61oKA z&MY-i_Hmv~8_$~UZkwoO%kKO4CJK)tl_EWd^cvDzNT-m#LelS3-gt3YbU|nQr#`in zT&tM2`qazZvr28(+^V1HRIS^xua)~#>6L>6dwFZY60jDpr7ck135u=q_P%*|<4SIq ze{|j@;F#>QGtCH_O}<01-o`k?AJ>#nNxlaSy$GVT#m&EJ-(y@@0Qwf=?vzM@%X2V9SR%ad5CZ zc4s*-1AwW%caa2&DKCIF)E1~$?@$U}88EC{s>bjj`Ydr0P25X+7 z$2;?E66awDRJroX$Z+!5^T>CjdAf6=|9hfz`)l^w~;@^ftvIh_{q6g2IxHJkQB(CO4B9Y@29CSC&=!_kx( zyF&xL{ZcWig5K81lM}G-ZQDI!Fr+ItB664z<8C|3EJNh?9D5J7!{1Ubyo;G7S28S6 zPVTnmj9P#i+PEidyl@zbX-^lF2k?XQ0%zl_G zLw8G{hFGvb+4?t&San+I@!GWTp)nr&dJ=o`#AHlup8PZ4=m-LERN*f=0Ki#y2MFd$+p6@VYJT7tUxsT!Vf5)7NA z0Ls>7k*>9n#_?$V?~7*Mq-ZM$XhoxVS>6HYr6+ImHi@sOIp0R~ExAZ*UhhBoG6QpF zci}H?L;)UK>~wbERh=v>CK2#xMILO)bhyj_Vrkz_7by~4f+@Op2el)h*Z6v9XcUh{ zOHGJOsawZU(?YqLEKuKzRs!|}!x108Cp`DsV&i`k;11>lZwzo#_<*L^q-f>2J^kmT zwGczGqrCBN1VhiE0q|jC8z`)PhVD*#?yxkQf^I@1X?2Xq^{;p%?Rj*Jr{7P|p2bEy zSD;f(e;;hCNER%MoqHnCiTQ%Vqwa|akCNxyLb-#fz4#op%z{T>Gx5K5+kM?l3!fE3O4W4 zF>1N@A%dFVeTeS*z#I2T1+k?ss)W9S4_b2JHG6l^PBesP$*~7b57) zPMIK|!mGUg(G@nlqElD&S1w-3fQB^p_LK(9+qep9SiUe5+rqKO_^r1+qy?HtRLxJog2~=1+Nfl4e^NG>?mHuGq<36DPmG7P9lt^VXCVnjp7hmwfxIMKrET)Fqf3h zN3~f^83R$+!b(sZGGp8^ZF$_50S!bwUVa3SDu@`&nx2fH&v9u92xtaR+JajRAC`ou zo82GTzb}|lc(nj=?=`Q*w8gj``<8>A3dY($bzzY!K#n z%j^@n4>lF8Bc0ciU~{E|KvFkN++b@D`!9*sZuNq{;3wE? zMZg5>=Q3xlD=GAdo_N6iEPg$#^GXVByrWE|v(ODn6t~`xsFOS-`Kipa6^+_$qm{WZd$S{VfS)~LJKd%4c{5*d;XwV4(T#~;1k@L{0DIW36`=_ z+l}2#jJ4*%3nmK<3qz(CE(R{jKi}xDg{`rB4=QVG9F3NvctJNK}7xZCJf*Nq;vIgaA9)hNw{$${|lWpT(wu1xI^%VZ%B6Oe8 zoEv;sA}2BcbI!cTKzeaH81jyB%Wh1K80!;^RJkEcWiLrEUL-%IYL^?zFOVx-#-6D`GiY!GH z9z(Nmq!PC`v^&~H3@UT?4)G;{x<8Tv7b%XtxA1^CBY|ULql+WH`@oHX5Nqq^&|z z(M!aoZ4_8mA4G5*=2Z$9MpJGalv|od@L3uh$7G)5g)G+25dDa*-OoegwCPX%{JY&= z1C5C=+O|M;2DHJe322>-rrrDiXCavpGcI;M!|?$TbP`1_JWc)O-5B^^)T#{s<63#8 ziKuM=P1d+Rc|)!0A#A7MC3fG#S^^Y{`S|4j&EO)7uDpf!K5?yS& z*2lL;{_pzu4pjbs)yFsK;@%Wqp)R)7!ec@oj~#roKF;Dg1M5o+=jD%cmK607;DkN^ z=MIBNbJOhY-Au)=LYX-7HKa#>hg1wCdji)zOE2jlsfF!{b6hXzO9foJX{q6k<#P}> z{j`4Qf>_r66ui>pX&T}mBNHeGn zXLTUkPL@4S`0$n#aq9PMA3d3yCI6_ot;_KC<*hL%#`C$zw53j)ln@j1&&PHUTw3y; z7jXVMA8N>bUKZcF^4}HY~+R!a5XkFSyW*ND*HEYd^HU!sj#KH6-*x z-fJ8w5p5SRCh;XcGv>jUM`p>Za|>JEhBu0AlJ~fHW!cjIQ(5V2Bdp;!>=k zy-|37peg%Pyi@j7TM^mep$18~2h!~IDJW$Is6WH6S98v}ZCH^+FpRATZhR`q;XutM zX&1as^*k&x#LzsDBhi{C`96-PK5+o$hailgHsN#>4l~oD^)y%5hs>4a&$)xPLq;$X zps3aiq+*b##vMMB^p1SQ{uTQ`8FA1dHoc+jJ2(-Ss-F&Ki1ax5tp#+cd}}j7Z?B!l z=y6Nk8+1uOa)O|Jj#e{q+*eg6kHv{YuYQpzM1G0-ks6U&kj6D73X6~|NdHFi|Eg+4 z{RV%r>|)ja)BD9+)bA68w|__!nvi}*3T#Ed9VruO6Vk&Mt2Uk)DjIVjIR0{(`u&?q z?Wc|Ngr5@8d!7%-Nvn~4!56wC?V&q2R7dKdyPxPT6kf>%dQA=687D6%3YU=nbxFH^ zjQcN)K0%)m+3dQm3|Xi@Vl%uC>Th~O8t%e5~gyX{ye`7Y2ugB z=Wr=|MjrqaIaR3C@vE-VfU7grP#H+i#pgP3?pALGD#L#jl$lp)#ACf)z%OxCuh;Qx z@_GV1clo;657Y|v1%Y@LF)+1f8PW%j8TxiS*EL}X={(O;J6<5Y^yO{;zqai>+QwUS ztwE#yhZezhIZCKeoZiECz7sZIBRkwYsGBI(fGC(aw zv~ibeV`WOzh5PWk=|U`ik6##p--{P+^+8-;8T_5ZWTo`G!GP`g&Vk=MoA=`Phvo_5 zqNU2{mY>CfrApL){v(zzRr-DZ7oSmBtkr$rFCZE!#E;rrd+{v+Mg4xbKLKH4wD+Wx z@E?YT2|i@_aCU*`So%r90ASyo@0=?4{4mfb5(Mo(B-s)tLGvvACAz8)U=w~0g06mi zvLMhL^`5)2sE89Gf(ZPm@1l1xNNRBo)3PuLM>*#}4|I{Cgb+*!tAJon*bRFHJj(!y z?$q8M!sKs@#27(iYUdwSCb#zY2?Z|;TSu`kl+xA}V(n7pYHME`Mg%^{cmmYw_38A0 zyA7!UFQ(w$j!*BHifK#T9lIBl<_W%q)yJP-&$J!>x+H>|F zboh<`b!8sak1B=n-7VkYd5ZfEAhvp;j_&SHK(%)lvh=MQ5L8~eIH-RHHFN?s^dB%m zbLQZ~0sxqy&R zqwq5uX^lzw7%J9_bv?X{3`#$B+)1lnpdV0`sCha2S>tRZakdKufI-NcYH)uJN!LqR-!@R( z*-QCLTNGVBXp0^~7@#p5mqkbt(h8*2NCikGNIQBdL$9O2sM#bpc3`dTw>lBbCyn^-9`u$wUb^%UiPxeSGQ9`Q^4inUtyflwgFNH2;_1E zwM;8aMX4SQ_%8qx=h)NQC#;IqARhvPV|=6hF;2e89q2#RrStQ6El=y%TIq` zQEAmz?hQ=5d!_3^#x}F{E;nPdnA0^&WC!qM@?m3fN%mn?xU~7Olwe^Q#Bhi{n!5D7 zpqBd5^e+21l(=Tj~BsiyDUsLbur)N>N?cfma z9c!29iz$X7zg(y7_XmVJZIye~>b{ zn&QXC^-YIJp>IXIz_2q_rI;gxTL>MV>g86g7(TeRT zLkIeLn$@q-Ep~qbxaVBBgq?3NvWFO%(GxE$1)zE3V~y0v5&1^-1?11MFYSO8Aej0! zLR9)Wb1ID`)t{M|m5B?SuB={c7+s&}#a^K6fZi?}lO8X*dNz-dUu z7Ao1MwGLyz;-Blx?8w4LMs4j+SXr8bW5(1Lw=FQeKua*hK5#TVv^QDW0uYsBmqQ)o zb}0@ZoQKvZNh$PHNrLMHWpEHls}nSvgGfT1pd}mxso1W;3OJ0~*on4@gT{3Q?c|`i zuAqY)G@&c#GzTSi1*sgA(iLRrgZlF-)4ReV`cRWHx`N_3$lMi_!9h7)K$WxcAT1(z zC;MwS*1RrQQW*y=>IB(PsD{Iqbix2?SJ{^>$w!9$ zedb80#Z7ZJnP2T|FLz%Po8LX=gwuL{w&_Kzo{v*OOi{CSj&z)!YFjBj)v3_A?ium>fu!5FRr|$@M@y$dZ9my^eMvJbG$zr6O0?pu)-tJ@ak3$OaPiO zgx%uPAtbwQ3t=OA;09><0n({uu4N%C!k-#pa_)yvz@1A8VKKd_ZuhvFJoO5ndkEeb z!iL{TaEGx5;m|v?rE<(|ygjn6#$Jp4l+SP?2Yy{w7!C-4D=Hs9fZff?tGD4xeoX8L zboC2k(V`IKx+{!@iH0DTMAyI|*VADv8#6ZoGD8P$ic1ofKq&Z=Qz8Q#%OeAvNF$pN zH-&fXiU?9@dD zI*>Vf*527!0q9i^j$pn_To&&dGl+fb2L+n5pjltDsI)r#7S@k}tJ?>&TcFQ#2D7`x z)@81JgITQDwBOY-nDs|)w@COGWv;A9wvV8OAq=qsSJV*pc3;qPr1X!1*XPLTKZ?GD z9_VZ+bNLK~>rv*49?F9H0cAr<@Q?|9mT7R{@IB0ASw}eYhO*%PTINt>hLU%e@6(y> z9LjDX@@*;obp<#fl-gu=k3$&XB>Ma9p=?kP^4#Nsu@#Gchu@Docr~tHhq57*<;-ls zOWXKj#d(f|z=SJy7#jkn<_=?9qr8Oyr^0@`Fx{=OuWdoVTAp=T)@=os!BH#%g~ms* zdAMwgVrfiveICX7;~(EZzg&>#pEK?6W;$H3NOpA}4tK1~HD)*q<*n|PR+7?x2tJ@~ z|Ha4JQ#KZZ-aW(FojwR^xSk)*1_1fZ;oPCSYXsZV*&+{9J+&6~9LYj}ID8}#ThF1}>Pg_i6@2@B-6aM_Kt6R8Yo3sNak5z?Bw_>!G4Wj9f7 zLTW)0rt&5Gl4+ew_CVbJ!IE8?$~hzCO{;NVhIDKyU$QTm#+U54(2|`nKqDBJ2&5>a zXrwr#M5J`2xzqTPU8~pvz#61dr1ELi$+tn!V!(Z_SH@~XrD-f5D!+{7I)n5EaP!+ZwgLzb#j=0;jDvzqxSfse z#KbDnWx1W@TnG5*c6K%fv`SL^#>u+pNE_-?MA~~0F5p|*nD5BXm)kG+;Xy8rLKI(9 z!msXNbzLb{|1FOBv91u;k@4&TXXCXyS^9N3ES?SF$~8Qm<v@|dSXzCbYs4gW=fo!1NRxdtnbrEbcD*C@y!@s8Ujys@ z)lJr6@FDYXO0dq}#4IcF)H~BXs|5V}Fg)A!;v`lx3{{dHFloXwt1tcoi?!yDEx8LVFmB_}17Qi;QeZgl5EKo1Z6)~k!eU1d!%kU(2M^8L7cm-1F!~dCv*atp z%D3Ho#*snkmCRCzIzv^!)9nLnaWcz6htwpq+xsF8fvDD%L6>ean@&BE zGntJMYwmLuO=hvdMB&jV$t`HqpAoH71qy@7_)i?MqzKQ`sO^>ROS?LT#lm+%A@ zZr2d)#|?#7dG^;hLyVKdHJqWhz6 zYp^!u=c>=1!I4$r++~eLR-rYg) zJX}p_Y+3(yR4ehxy#hTbm~r63Govq@!u~Zl6kSod7p_L-9{kY0Vtz1uD*I5r+|4&i z!IEofI-Alf0*E-HN~jdD-Ba&6l+GR+)LEX-{Pg6UrgQjYX(3+_b!FVeQnO!37FLDj zs`+S5;cJE)D$9lTQmqYAVqgH;)`zKCvJv5a? zPkVL=%ry^KSB8SRN3fL{O&!eB1vy&b3;aO0u)b;u_cK6ttAgCk$iIsN8HmTd;QBg)rFH9j z9|9ot)nhW*{Vb*i9ZBCfS_mD4$aw_wt#n>}UUo@XMmaTeFAek9T|jjt#BFoEGo3B& z2HmZU+*Tbk15QFOFO}H6^bd!`=4^9)XlA$j0|%bF+wu+v1!b|xF#zSN%khaT`;Z(` ze+(h~yA=9^piPs*99T|BHyT-L8pn#>=9058gtxg~$zlU~f}iFdvcDPEN^`mE!z_ld zv+HUW3yCQ})-q@6Wr%DSF^n&gq+Z6ZjTXkajc#@WjvMVwt34PS(`K^K15ohF2M)eV zrrB)_qAVP=-3bI`CcBMKHuW>v;HjAW$O8Ljs~_X@NONM&0;`1*SW_I3(uvGm zsTQ5;4yvJ=_?D$Jb^27P>GgD zu*)1aTZ7SIIszK{65_nBh?Pt51Y;d2MN(!bfyzaI%WG8}H0LtHccN0y1Ft)JqYUK6 zTU#t)*pIw`#VdaZaK~yKkVVP&L0FPg2&2b7@%5G&;}fVV%M>u;j$Kmj`YD$s_Xh-d zk${1A7=5@GzIjl^ymFU0j|H=G*Zp}cwJ)D6LghO9SA1Ul$}=w>%i~UPa~{?V1=Y9D z#*?^fqHDn%)>mwp=vp-g^UbPt)i2Lsh;f%xUzmruFs`E(uqT*-+YB0tuPtPe*PcFG z$RawQs>Ma@B`UJ(9`?K#-g{M&(D-PQV6-F&_aME2^cIrQnk3w@s(Q&1=q@Q=Os)L{ z8}Bcnai%S`WN8rerp4B)OR=0Ob-lBcMPmy4bty~7C1n{cd8(gT1`nFM>xb`SG5qH8 zeXPy4k>Y}8wQ(i%Q%(zr*Bd;L;~FF|UT^e3_G*yeczu8e@}dR_jn@ZyAe%HuM7%!O z16ij*BIEU;9>{VH5*M$J-e}XRzgq)Mh}VzvAf;=N#CUz22XeaxNr~4_@IWFpNP4_J z(F5tNK{Dd?DISPG5N(Q})j7IRcaq(i@9KjKE&4Yo0lJAE!-MxeHa@g1+HN$SUk^I zx`M3>(l&%G2zUnLyCaBt25pB0X*CjjO+f zJruHQBBrw@Q!`>U@}UNt7kZ%9*R=m&9MrqQ0`>lEd-VqvmI?KC4P4DypsL2lu?FbW zVAs=6u*lI~UB@>Q=FBNLME`)*eb!K%#Rzs5(|425y4WT!Qg!1K>{(L!m1|g>82;;~ zB*EtyC^*svq(-D~kZuM1k)3I|MYy?u_2-wN0?akb?7rGO3erO3$IY>Hmo zQpkqfLeURdw})aKnm@%O9rWI#bT|5$@a`{Uqr~l!%TYWt3+c$7dO=dVc!%Xm-{=7C{@Dd+;0Ack7uN-Xvij8Ujy` z{$V8Y+pl+UTc2ik4M%s_YmGR$uX&D$YpXwPb-RzE2!eHw9tN97^Mj=t$#riDOYQ@7 z`j@ciO*ZV1Yd&ms37gl4qBd<);A0MQPBDTQxo$%pJXn$KU}H^GkDe@BgjQ&agN=td zc+bJoMskBU8!sET*17eX3oaWEk(=L^(i0>T>=SyrEqB-xq;0NA8(4&|Dv(@(;gUA6 zshYtI|DC~X*ucg|a@slar}EG6y}NkcU}pk0AnxQuhsbQOhbTGaSu&dtiQ0YYw1z;p zX-=&ufPiV|&QCq*F9>*a{at2ZL68g0DPQB?!!*#;nI9+#_q+ZjvoQmyc9UI!v^?vk zrt8*CuIN%0Hi);=2knf?Q*Wj48EQ3fniPkkXv0IL%x2g|6P^wx{HIcuKwHvyqZe58 z8lrUp9WipHI$7)hTA7;F+J`^~|IFvtY9;PGroouRBGJr}p6rZq;uqUA8k4_lp zjn(lR+16|OsjkLn*v_EHNpQWd?NNX?OvtXyo7h~Rb|Ja?hfQn;W813bKVbs%M^g%x z7<5-Pw)ZHkUmPv6;B+L*Cb6^z=mKA5F2C)3ofW;EmQ&T!w_~Al z8}CiG#fUED6Fn*wV8qPkd>{NTq0RXECGsO@Qnm28hu0)}Pr6 z-e(*Xb4fcenO#Qx&+lNPdHwJ0VA;2n!}Vky^Qaxbr3Q-5(z(fHEE9ZgF5|(g zzm-vNtopq&c8;Qme|;XinFX#-pJ$c0tbKv~U@Lt$31?i6!Hli`BuS{Gg+RT&0l&Uy zDB~pV7W2DPxKnXgd77g%;`eX7>^a;G;wWSc9iURLKaV>LVAtLsXi33T4tq}j$}LVZ zz{xgMC;7#==D*Aqi+eU!n=7#X^o1zpBO~>AZutv)nTdNhy0*N+Huc3{<{XnIn-ew0! zWI%75r!2FtEf6fd6CmVTYY&X}Xeoy>{Ns;Uhv0FLG;flt=W#YrTr$aZ>v47mT72Je z1Y|c=A3M(C{aD%l4-iKRi?|;;bYv>6`f1yQt(gl`w<{4J$4{u)?3(!zyNzvj6@A23 z48fbFXXhJswAC3b0Xx2IIy<@?kk9A0@4!P_U4X^!?C9N_UHwn9Sl?g_BlnO~7%X|G z*^3c|#b7M-fCygkL4(l&^yq(pHe~40u-MiAV>VcfTI`zmF@?MqyB5)N#9~+R$1JUP z)4luyT0>M^@t*GJ#Ko@9KW0b#ZUq_Z&`(F37rS2hgx%_`g?7Tb)I$3^o?6;JVRwqb zi(TW+uy~^W$QcCGQ2Xm=07tFOXV{>Dr+96%>yDzTA?c`ss?5-?u_=pPBOBQovGrcp zD~&inQsC0S?P^>R_zfK-OGAE^Q99MXBD4y3*hio#H&IHU}uyOEY7twY*^v~p-4ugwntGp(n+MlNUtG1 zk5r0OfOI$LOh-ya8iVu(${ax|0^KoIQ3yv0K$0G{iGqlmHe`N{6#0lKL?cZ=G9%&N z$Pv~cl_LEaX%Es7q(-Fgk%X0^&>QI%q&TFhNI6K0kd`Aoh4ehqL8S9Y?MON>*c&MV zX@m_w6OhbE_y{)df>4OPCsN15qR@)eg!Ca&1JXgHSCO7a+Jy8J(kdhgX#tWMX(G}X zq;RC3NF8W(3sNHz{TU&VA0Gf+Bz(?75d6@Rc2sx@=^&DdbmQOHfl0!{(MiI97%cJb zg~_@vsT1Yn;Yos0l_YG8N!mQ9|Ja{y-Lru5h{${-X$knt(MWppjDQCsH6X7c$F=M{ zTdY@-1+(IM?>rl0Yw}5^cz}?o!z_jCc3k~%ZN)VJ*EoH$fMayRCR}?H9M?Vs@0Kk5 zpZ3l^&Z=pD{QI0HO&K-S(CBg0An9R0pZ&b2N0UlJLn9+I)zqXhO_?6W8A*jOC?|wL z(j^SVgd{0<_WF4~UlmT^9zK^_`9$((O z@gw9KC=AtVC@f1Y6eeX8JPFoA)}f`HP;@{86dkY^iVoNh`QDp!2#P*D3JEYJei%{W zDI6&k^3kc34n;?0LOLogWw9Z8ir;Tc_LL084Y1&;FbAFnbD`+LJScjw0E!+gf}#gY zq3FR1*agmpq9?1M=*h(}3sysVQd$nXbABn8#IFYhH56pS)$mMM3;C{`v>x(|yR-?O z1M6WgxD%cW8(?p^7xsbsVLx~Xn(!#(S$9e5J3!)pzDTLihUqZi{8Ai0bZEi0Pz=>}Pz=@fa1iAgFc0!yexyQp8Z3pGuo9jQt6)dC z1a^YUVQ07!c7e69E8GCP!TNr21_c|tC^!S|h27x+*aIGg*)T4m=kQhrM9|>;o%cKR6Gna4{4=g}pS+hQUS+G~pT;gX^LA>GCbmhC87HcS9HM zhXFhcLntYX9he6D!%R33X2U_ygM(o%90K#>)=Ij6TAfOfTLjp90T{m5_l9&fvM^MsSIYq>tQyGq%z!OHpI8og=uO5J@l3^ z7q)`=Q2gtZBA5=#V0$;1-w$cfyWw zHg>b&!u>FU={pKjV2aKGU^;9GJHuA6CrpDn>3s51a^eW zp$ltaJc7;K#70ZF1Ga(r7Ko4iAWOcvO^I^q7eb z(_zG;$Ak`h3O$D&6FSTh97ID+=6|bPS}F>L(^A1a<||B@$9#ny;SwmU;sA-0^=Y*C zODUU%ETBI}^PJzO)36EEeK3?cFI09Fo$LR%WH5=E$ zb+At8REWYI=!2n%0a9QCx^O)E;36nug68lLI-Qt|4MePP4El&+41NMr?E%sUFavIbS@1d78@>uH zxC;(~D`6gd5*ETwVJQ?VXq9j;tb#AWC2=<1Vq-b{46cM9!&!YSb)A5ieN-UITO&upq6Mz8mK@Q!ALs$MN~8oy%H9&9~%^x z7E|yv1xuj_MpD^v3amjN2}O9-6RttO5-vyY2G^q(!*ul4a0@y!HyK#AfjiN~%FJ$f zAw=uF7VU&ZKhCUzm8p9F7vC zT!lLN9Jq=4XTluxNpL-SHXM#V5f;GPL|2JG@mx58f~#N!ya85mKp)OSUnt7aUAP#1 z0n9{~;ZpSbVGW!G*T5NYJ-iso9KRjhf_^vL3G?A@7*DWaQK3EDPr)6hr5Ot>6o!zECM55hrkHO!;_X)qtX02ZKkfJGkj|57$YgzCXE zD%>b^_!wLOXToZ@0+#Z|)8PvA%iwDC?tvtm{s8O^uYnisq~h6Z45DB%%!5;5A#4WA;OB52tcHu>LvSg4 z7S_PW;Tkvut`F+QwT?d3F1p~wM7uMh6C=|TGtP)6>e9PM)0)@i_KD6*sjF9_8=A#0 zDJidq;VJLkfeTt zhYamEVC2aBev_up7&qJ0ub5s^T-LW_B9}0-qNF@)X7b=!6l6`DTvn2GW<{2G-ye$O z$?~fw&t+%hkuR7!D{DeYSxIF{R&iO`zutRwvPI(Ee|Y`70iqQJrrwtp{g3;b8rayj zf7R$W*gkOuBc@InQCwa;sbup}2`tlZIBp2#L9Y;lW;(V~S?LNz_SH503VXkD}Ie-Y@nHqI6<% zTlf}CB$Hw$W#!bFicu@X$Nc9puBOh3^Giw3^yjmjID0woyozIq*O1BO6S9UEmrt5e ztV}9t>i!{|LY!zwvf^Y;HK(z1Q~4-PG*>ix-Qei4RMD+scioyH(c)%a6@GO>dDnS zAGyhiNLe*JTzzVy=KN@8vvYpWN!)jSv`e#3rT&c@FGia-oMlKtX*fyLa)sF5j4w8J$9o;|iDMuPm zRnS;?;%N0vr#hi`9rK_2=lyB_s>>TsQaCo*+~|fP!Hz9{E#^szaZT5>eO$8etQUA{ z>t#f|PMl!FpANWWV&egyzc1P9ewVKJ&-#CEV6T;p`^7N}A8G1}>mN?OIl6OI^2G5w z{@!1D5?Rmc;fYuGGFB=htTImiciFb`D1JC975t%IuL@Qzsn_s_debROr(XRZ%ATT3 ztRL3@;k_NFQ5KCdUjF}@_5a&z)*{CFAJ(kvhFln}h{m@^&nu}MHRtNelB))lOe~&J zR(bKzMjJQ@t9Y;2n>T&(%;L%te4=npqbjFQE}ukz^=0$X(ih^Z4MPn;u^L{)xN?zB=Gl=QR7-O?&ibJUD+Nv-bb{OEn4AuDRVP~3g;p#az-KbT#in!}bUHd`uSIYb$=_Fz>YCnHSNH9>==&-0 z5v%)4|0i;y$wxVHUzEeJtmc0&@upYqZFCp)|0M1IRUi&3u4KUJbr+RJ=QoQV9p4z7 zAA=&BkcdP?c8~(Q!89oHs|39mk*u678>t;&gi<_`~a@@8yqxly#I5Dg4w3bVmj!kvk+Pr4 zi9_Yl3_ej!94wEX7ENzrRuknW<}@*{iA7DUXkt|(Bh`r~r$#%(Yq*Bmzwr^GXmism zvmq+=Og%CExum_#c=+eUUb===|DH_)Ta+G}nIf$gUETCrz5-qJVbjZ6o080oPv}Q$ z(M8`$$t43$@MKDI+2llp8uS9usZFoh9KcRlG_fLDH?gAGm3tyLCEmFpWoTqlqSMHf zb0Zmv^G2q0i?mEk5?ZgsT_aOM_PskYrC-EMG|NlrLE+hX6q<=idDI-1Sd^FIM)DJ{ z<)s)Rb7jPixT8GYvU-jf22$>d*?cZJoAT=aN;t&+!7B<_11PBbAupvmMXY}3QFXoi zikzu+*0Qu0_4)R4`w9Cw`xW~Q`#t-ho#_m9QoIh{8Q!^`;kjPEH{HA0OL*t{>46el z92^Ov;jD0Z_+rR`vPeWhYq_61Pd+4HqFk%otSnVlDs{>xy0;zZ;cMI z9x*Ex#PVXrv8vb=R!^t5BRjfN=s)f6@xS%szxyqM%;4-`d@wb*K3Ehi4;~9RGWR4K z^iXfozcYKqE{@g3)>=cIE5pk0@$lL3o$$L*w17XBJbKAKU42C9q%PO)*AD6zo0Vpj zd8fJDeB6A={KWjljK(rz9b@OloLE`x3+opv)oyKfv-{e4ai`3g?cD5CI}bUv&Rfnf z?@Dj3cdxh6+u=zSB4gzza zZVk5bt*5QGt&gq0TR&MTc6<8^yT8-kd)MpY3p0|sQ0UT7$Xm8UFqm7<1C}M zak(+axX-9Jel?C8XPAyT&MY;{&AD9vLi2WWnR%bNl3u7aUoc-Wx0-L6yUdTwFU)Vu z@6C>}@v)oYv3FvvE!P@ooo|h|Znx^Kz1FYRajTo%-@e?QYcH~Yu+MP%I<9l2bDgu= z+30L{K5~9=#<-8T+uU95M+~Wxyiwj|UYYlRx7qv1JL)y}&-Q!!oaLDdD~0W8s%#`c&ha=%zHeotz_=$#2Pf zZdCwM;!vpQ}Hl|3%-ZZ`Xg&|EWif z)<%0H+vsJ)=%M?JFO37n??#&0!#sz%a-O-ueAIl_tTVU8xtpJupP65CPunq8m6#VB z5*rnpAGndxSRb?ft`>j>hTI&t#J?n_o%ucm4?9=VD?LM|+ z7ujX@J@zWQ)_&36V!vg-Ywxw&IGvrd9o4zq8Rsl?ZgZA94bE@Q$?mD{Xt&Ib-|ud8 z|LL~$dU&!oz$@~mc$G}Rr@c*Hz4tdS&F@J^7W(7;tLV)6ezpIg|G2-_-{Lp;ErYf} zr{KI`1aoIfFeA7*s1Du=z6y>9b~q=zC44LVEc_W3Tp-uaXzZ56dse@5tZF z9hJGtjd3NRJfu9MyrS$-_9-W;L)A;wY3h9SHFdlCp?W|)s-B|7w1L`1TA@~^U9TmW zV2^9BYTN1dL)sCogFZ~3sF&%}^jZ3i`ZE1-{Tcmx{a3xE(bYK9C^n`T*BI4Cf&uzB z<8$K(H=(`R&m3ruG{<7FZZ_lhn2(ri&3f}~^K-L%Y(#7{hGI_ap4d~d&9Or6NzPQ~S|{N=)$f_dfJ~^p1F*KfpiVAA_x%;m>8v z*83m$yZr&dMZu)t?%;voiQv`X+n_}_D4ZKE3SS7n72R4(;KX3B>fvZ6tm^AgujxGmr5rX7qdJS7r;Vht-?O z`=<4-^`Z5t^`-Tl^#jB6pA68Jb{qRtyOVuJa*%4aWqWoGeVJpaO^bXt*YPH z)l!G47pon$Gc{Qos*Tk0wJ}S{So~M z{W*P`zB7)oXlArD+8UjVJ~-GB#x$eKSZFN4hdo8dZ!xwRJB{~^Z;ZpnZ${KiHv_u= zLPqZtbGCUSPUb;#mAS!u)%>g3VD2^do4=aPa5i0Iy|5)d{vj`R8AG}(c75!w*aNXu zvD(=B*rwR~*p*DHs}=8KnV8-}YnFARb*Hu3sAv9cU|p~^csKYg_y&X1JWLO}h3AA$m>XUaj>SpO4Qs;Z z!yVkdJs6?y!=FR(vF8pZO)vR;`Eq%je2sjwyi|@qDzBAamEVv*mA}M?AD3Gy9hIJn zsRX#lF-nzkx3WfAt8BzGzKw5;sx8%SYCm-lcl>g7wtAhqSba==T75y?s=lr6Qa@9V zsQ*;c2uS*9n&xA)#%Wh-71~@z!%f=V+9TQ;?Io>V`%rWBLHZcID30UEFhT;WQN|== zuCd5iX*_4VN@(@1@sn{Dlg?zyePQ;9O|##zCpeqknO=YYw?JeTSzL{-Sc<3QD1($- zWw_Gl*Y}A4<`B6KSfSJq`>p08YL#`$dS!#MPy0rz*WcIo>fh>z^*GPo7^y}Y^F71J zG&&pIjZ@6_=9vt#@p$o@2sGNq&WUNUir8;f1XnX03s_)}Wx8I;n3!$H85OtMOYQsY zM+jQi613LaZ{m19vA?#D*e#g6SEg~LK$OU6YPfO>LuDnLeg$H+86abda2RHyv)2LHrP5y zD0M2a!Z7T{Jo`rbHhkY<`xsuYqtnglN8FI(40A5#)JvS+?m#!sEyU|hcW+==u6H-P z@p|`N_ZRmcZVNAs@cJjOlYfr?Uhq?p7Pb#Ng;`;C*fYG4@OoLef+4jsT#Zer4cCS1 zLy^2OrlhExDyPZmSckdtjdG3rn7l@=mDkDdF`AVBx;+p4>vo)>4bVo!iCjyxsoHF9 zleSfRTWhCZtv{$=&j{Fo$BHq_dGG2i$LX6k)z%ndZ}wOF>*%Nk{sTMMx)4_U8st1h+2bCYW97wm0z zgZ;U^KhC{Mb>i-7cc{0}tHvp=@}Bb6d9QhI61RTt9l$%L_^0`bAM-Er$N5wItNmO2 z8h@3)hA?D9GP--)-{pVgf9`+n|K0!D|IOzir{I*JJ;6y95ntax!@&0sh6KYg@|Olz z;8Dwh>A~C}9^4qjZw>Aw=C27J#l^10@^1`Y54Hz8gAao}!M@-?@B``9@gOB^6}AgI zgk8cj!(O2rTA?2f42OkzNpmwkoE%Q0L+8<dcV$cIuMEYn z&re25FD5CICb7S7re$ujaMR)YE`Ym|*=k-_hUvTP* zG0+%oOfV+nRR+gq#qN$h7mK&F6zc+pi)#E>^8n~>}S9752cOzj{1@MmG-^%v3{n}*SN%}HNH0X zm?^O~xYY&3hQG$zTQ;#yiah{(xYT}zM%|26d)oQkQQRT!aCd=Q?d~K%$@W5A+s)n` z-dA2%2J(FWS^pdVxPNBwV6Zz*z}!3>O%gJT;qyTFQuu1Poxu69i0_Ib$)}!L$?fHC zB$*d7ChnE%R;-A*MHLE$MqD#kJd&9<4R*HA;(%{1IA~Y@wTzsunCmM zlFxl$rpF3mf3ku+Ee;E{UcoOalN@wV}4}qiCdr3so&zqeq>o-BR;UFI}|T9 zi{Wz=m7PFaf8;q^QlAn?TwKe;5W9ON7nDP6}&av(Uh?8Ph#~x=~x3)5@ zEHa+s_DRl~WKOfu>FmDX{muV`K&%bd)|(E!GmvT{$;U2cC=Zgl{it*$4j#)8T&g{) zy`a6KZPC8e59qfU%Z%;DKa4zc8u|an<}vd_V#_D&75M&D&J)fvapyVbCFbr{=M7dr zc9EOzaXxqUI|rN}onM?5?saYr9h=A6&%r>L*Xr;=F*7zrl8@V+D-V$85Vo}=9p9|w z>qYuOt~g3GeZR5JIB3i?-?#VMg?XG7JNRs=3YLg#KJy*Y(EbMvQ=b_k_ zi~#Y`s#q+|#)$S-Wfov^2sU%cgO90+!=)+RyROqV(78Jp>$|ljB;-r|<>E@xqseC- z68hwnt5UL}l3e%bU7UOPtqa01Hq~|0J zPBgiqRY*r>8kSMOuvtzL(tuY#YGjiA6_9i+V4ZIb8S{QKHP$nhOE^*yt0t}3NxqzB trCYK!+{&{mtZJ*)+KJ6LYGv9wSs&-Bib|Pv#aE?dL|8$dS)Ow5{{j(NI6VLW delta 42576 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�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 YjGUU=b+Q+K1unxsc#3y9-vTW9FG>c8#Q*>R diff --git a/INSTALL/Ventoy2Disk.sh b/INSTALL/Ventoy2Disk.sh index 8e05b586..29e30710 100644 --- a/INSTALL/Ventoy2Disk.sh +++ b/INSTALL/Ventoy2Disk.sh @@ -26,20 +26,29 @@ echo '' vtdebug "############# Ventoy2Disk $0 ################" -if [ "$1" = "-i" ]; then - MODE="install" -elif [ "$1" = "-I" ]; then - MODE="install" - FORCE="Y" -elif [ "$1" = "-u" ]; then - MODE="update" -else - print_usage - cd $OLDDIR - exit 1 -fi +while [ -n "$1" ]; do + if [ "$1" = "-i" ]; then + MODE="install" + elif [ "$1" = "-I" ]; then + MODE="install" + FORCE="Y" + elif [ "$1" = "-u" ]; then + MODE="update" + elif [ "$1" = "-s" ]; then + SECUREBOOT="YES" + else + if ! [ -b "$1" ]; then + print_usage + cd $OLDDIR + exit 1 + fi + DISK=$1 + fi + + shift +done -if ! [ -b "$2" ]; then +if [ -z "$MODE" ]; then print_usage cd $OLDDIR exit 1 @@ -85,8 +94,6 @@ if ! check_tool_work_ok; then fi -DISK=$2 - if ! [ -b "$DISK" ]; then vterr "Disk $DISK does not exist" cd $OLDDIR @@ -101,7 +108,7 @@ if [ -e /sys/class/block/${DISK#/dev/}/start ]; then fi grep "^$DISK" /proc/mounts | while read mtline; do - mtpnt=$(echo $mtline | awk '{print $2}') + mtpnt=$(echo $mtline | awk '{print $DISK}') vtdebug "Trying to umount $mtpnt ..." umount $mtpnt >/dev/null 2>&1 done @@ -204,6 +211,7 @@ if [ "$MODE" = "install" ]; then chmod +x ./tool/vtoy_gen_uuid + vtinfo "writing data to disk ..." dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446 ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1 ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector @@ -214,7 +222,31 @@ if [ "$MODE" = "install" ]; then #disk signature ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} skip=12 seek=440 bs=1 count=4 + vtinfo "sync data ..." sync + + vtinfo "esp partition processing ..." + + if [ "$SECUREBOOT" != "YES" ]; then + mkdir ./tmp_mnt + + vtdebug "mounting part2 ...." + for tt in 1 2 3; do + if mount ${DISK}2 ./tmp_mnt; then + vtdebug "mounting part2 success" + break + fi + sleep 2 + done + + rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI + rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi + rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi + mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI + + umount ./tmp_mnt + rm -rf ./tmp_mnt + fi echo "" vtinfo "Install Ventoy to $DISK successfully finished." @@ -257,6 +289,27 @@ else ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start sync + + if [ "$SECUREBOOT" != "YES" ]; then + mkdir ./tmp_mnt + + vtdebug "mounting part2 ...." + for tt in 1 2 3; do + if mount ${DISK}2 ./tmp_mnt; then + vtdebug "mounting part2 success" + break + fi + sleep 2 + done + + rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI + rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi + rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi + mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI + + umount ./tmp_mnt + rm -rf ./tmp_mnt + fi echo "" vtinfo "Update Ventoy to $DISK successfully finished." diff --git a/Ventoy2Disk/Ventoy2Disk/Language.c b/Ventoy2Disk/Ventoy2Disk/Language.c index 023158d5..6f95c224 100644 --- a/Ventoy2Disk/Ventoy2Disk/Language.c +++ b/Ventoy2Disk/Ventoy2Disk/Language.c @@ -52,8 +52,8 @@ const TCHAR * g_Str_ChineseSimple[STR_ID_MAX] = TEXT("提醒"), TEXT("请在正确的目录下运行!"), TEXT("设备"), - TEXT("本地 Ventoy"), - TEXT("设备上 Ventoy"), + TEXT("安装包内 Ventoy 版本"), + TEXT("设备内部 Ventoy 版本"), TEXT("状态 - 准备就绪"), TEXT("安装"), TEXT("升级"), @@ -70,5 +70,5 @@ const TCHAR * g_Str_ChineseSimple[STR_ID_MAX] = const TCHAR * GetString(enum STR_ID ID) { - return g_Str_English[ID]; + return g_cur_lang_data->MsgString[ID]; }; diff --git a/Ventoy2Disk/Ventoy2Disk/Language.h b/Ventoy2Disk/Ventoy2Disk/Language.h index 478188fd..01eddd66 100644 --- a/Ventoy2Disk/Ventoy2Disk/Language.h +++ b/Ventoy2Disk/Ventoy2Disk/Language.h @@ -21,35 +21,64 @@ #ifndef __LANGUAGE_H__ #define __LANGUAGE_H__ + typedef enum STR_ID { - STR_ERROR = 0, - STR_WARNING, - STR_INFO, - STR_INCORRECT_DIR, + STR_ERROR = 0, + STR_WARNING, // 1 + STR_INFO, // 2 + STR_INCORRECT_DIR, //3 + STR_INCORRECT_TREE_DIR, //4 - STR_DEVICE, - STR_LOCAL_VER, - STR_DISK_VER, - STR_STATUS, - STR_INSTALL, - STR_UPDATE, + STR_DEVICE, //5 + STR_LOCAL_VER, //6 + STR_DISK_VER, //7 + STR_STATUS, //8 + STR_INSTALL, //9 + STR_UPDATE, //10 - STR_UPDATE_TIP, - STR_INSTALL_TIP, - STR_INSTALL_TIP2, + STR_UPDATE_TIP, //11 + STR_INSTALL_TIP, //12 + STR_INSTALL_TIP2,//13 - STR_INSTALL_SUCCESS, - STR_INSTALL_FAILED, - STR_UPDATE_SUCCESS, - STR_UPDATE_FAILED, + STR_INSTALL_SUCCESS,//14 + STR_INSTALL_FAILED,//15 + STR_UPDATE_SUCCESS,//16 + STR_UPDATE_FAILED,//17 - STR_WAIT_PROCESS, + STR_WAIT_PROCESS,//18 + STR_MENU_OPTION,//19 + STR_MENU_SECURE_BOOT,//20 - STR_ID_MAX + STR_ID_MAX }STR_ID; +extern BOOL g_SecureBoot; + +#define VTOY_MENU_SECURE_BOOT 0xA000 +#define VTOY_MENU_LANGUAGE_BEGIN 0xB000 + + +#define VENTOY_LANGUAGE_INI TEXT(".\\ventoy\\languages.ini") +#define VENTOY_CFG_INI TEXT(".\\Ventoy2Disk.ini") +#define VENTOY_MAX_LANGUAGE 200 + +#define GET_INI_STRING(Key, Buf) GetPrivateProfileString(Language, Key, TEXT("#"), Buf, sizeof(Buf), VENTOY_LANGUAGE_INI) + +typedef struct VENTOY_LANGUAGE +{ + WCHAR Name[64]; + WCHAR FontFamily[64]; + int FontSize; + + WCHAR StrId[STR_ID_MAX][64]; + WCHAR MsgString[STR_ID_MAX][1024]; + +}VENTOY_LANGUAGE; + +extern VENTOY_LANGUAGE *g_cur_lang_data; + const TCHAR * GetString(enum STR_ID ID); #define _G(a) GetString(a) diff --git a/Ventoy2Disk/Ventoy2Disk/PhyDrive.c b/Ventoy2Disk/Ventoy2Disk/PhyDrive.c index 6b579ed3..b35a2d50 100644 --- a/Ventoy2Disk/Ventoy2Disk/PhyDrive.c +++ b/Ventoy2Disk/Ventoy2Disk/PhyDrive.c @@ -824,10 +824,128 @@ int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, CHAR *VerBuf, size_ + static unsigned int g_disk_unxz_len = 0; static BYTE *g_part_img_pos = NULL; static BYTE *g_part_img_buf[VENTOY_EFI_PART_SIZE / SIZE_1MB]; + +static int VentoyFatMemRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount) +{ + uint32 i; + uint32 offset; + BYTE *MbBuf = NULL; + + for (i = 0; i < SectorCount; i++) + { + offset = (Sector + i) * 512; + + if (g_part_img_buf[1] == NULL) + { + MbBuf = g_part_img_buf[0] + offset; + memcpy(Buffer + i * 512, MbBuf, 512); + } + else + { + MbBuf = g_part_img_buf[offset / SIZE_1MB]; + memcpy(Buffer + i * 512, MbBuf + (offset % SIZE_1MB), 512); + } + } + + return 1; +} + + +static int VentoyFatMemWrite(uint32 Sector, uint8 *Buffer, uint32 SectorCount) +{ + uint32 i; + uint32 offset; + BYTE *MbBuf = NULL; + + for (i = 0; i < SectorCount; i++) + { + offset = (Sector + i) * 512; + + if (g_part_img_buf[1] == NULL) + { + MbBuf = g_part_img_buf[0] + offset; + memcpy(MbBuf, Buffer + i * 512, 512); + } + else + { + MbBuf = g_part_img_buf[offset / SIZE_1MB]; + memcpy(MbBuf + (offset % SIZE_1MB), Buffer + i * 512, 512); + } + } + + return 1; +} + +int VentoyProcSecureBoot(BOOL SecureBoot) +{ + int rc = 0; + int size; + char *filebuf = NULL; + void *file = NULL; + + Log("VentoyProcSecureBoot %d ...", SecureBoot); + + if (SecureBoot) + { + Log("Secure boot is enabled ..."); + return 0; + } + + fl_init(); + + if (0 == fl_attach_media(VentoyFatMemRead, VentoyFatMemWrite)) + { + file = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + Log("Open ventoy efi file %p ", file); + if (file) + { + fl_fseek(file, 0, SEEK_END); + size = (int)fl_ftell(file); + fl_fseek(file, 0, SEEK_SET); + + Log("ventoy efi file size %d ...", size); + + filebuf = (char *)malloc(size); + if (filebuf) + { + fl_fread(filebuf, 1, size, file); + } + + fl_fclose(file); + + Log("Now delete all efi files ..."); + fl_remove("/EFI/BOOT/BOOTX64.EFI"); + fl_remove("/EFI/BOOT/grubx64.efi"); + fl_remove("/EFI/BOOT/grubx64_real.efi"); + fl_remove("/EFI/BOOT/MokManager.efi"); + + file = fl_fopen("/EFI/BOOT/BOOTX64.EFI", "wb"); + Log("Open bootx64 efi file %p ", file); + if (file) + { + fl_fwrite(filebuf, 1, size, file); + fl_fflush(file); + fl_fclose(file); + } + } + } + else + { + rc = 1; + } + + fl_shutdown(); + + return rc; +} + + + static int disk_xz_flush(void *src, unsigned int size) { unsigned int i; @@ -919,6 +1037,9 @@ static int FormatPart2Fat(HANDLE hDrive, UINT64 StartSectorId) if (len == writelen) { Log("decompress finished success"); + + VentoyProcSecureBoot(g_SecureBoot); + for (i = 0; i < VENTOY_EFI_PART_SIZE / SIZE_1MB; i++) { dwSize = 0; @@ -965,6 +1086,9 @@ static int FormatPart2Fat(HANDLE hDrive, UINT64 StartSectorId) if (g_disk_unxz_len == VENTOY_EFI_PART_SIZE) { Log("decompress finished success"); + + VentoyProcSecureBoot(g_SecureBoot); + for (int i = 0; i < VENTOY_EFI_PART_SIZE / SIZE_1MB; i++) { dwSize = 0; diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.rc b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.rc index 990dcfe3b10675c2af95777c4cd6f5e6e376f49e..698098564dedd7a575c099c874b2185cde52263c 100644 GIT binary patch delta 383 zcmdmHcg1-_hY+(dgZbueq1%kih71Oi`^BUuH;Gs=8v)t-MUFCBPHq)#Wj0|jn%pn0 zKiNhs2&$@>*_6R#vbcoxWCw8{sC+9_teM%I!F2LmiM7lY3?`d>B~zJzb{I_FDxEwz zhJAyvFGDIr9z!VuF9R2YJ`jRv5cXtnVF+S~XYgfkW$QVDM)M z0E!0y#g!O*C+5|2PNc z3?>W)U}!OUwSc@Vs=+=Ci9qM2109$MBvU8b^XOtVKY{@S(ae{HnD4{j2=szG(6Np{ X(iLbUSoP#kLDk7p>{6SJWLTI1==x3h delta 132 zcmccOyv=SyhY+(NgW2Y8q1%j%mXk9@LV;Y9$p=M_G8#{A7j0!WW-y)1FV+Z_lb*az zEP~mD!F;l`g!N<>aUZCxK2Tg~@;eEh$sfcupz_VkW(;PN7fP&UHfJ#194MK}#B9J| XIeDU-;^bS>PLrkBr8ZxXV_^mW9QGx= diff --git a/Ventoy2Disk/Ventoy2Disk/WinDialog.c b/Ventoy2Disk/Ventoy2Disk/WinDialog.c index d531b456..c2535603 100644 --- a/Ventoy2Disk/Ventoy2Disk/WinDialog.c +++ b/Ventoy2Disk/Ventoy2Disk/WinDialog.c @@ -26,17 +26,55 @@ HINSTANCE g_hInst; + +BOOL g_SecureBoot = FALSE; HWND g_DialogHwnd; HWND g_ComboxHwnd; HWND g_StaticLocalVerHwnd; HWND g_StaticDiskVerHwnd; HWND g_BtnInstallHwnd; +HWND g_StaticDevHwnd; +HWND g_StaticLocalHwnd; +HWND g_StaticDiskHwnd; HWND g_BtnUpdateHwnd; HWND g_ProgressBarHwnd; HWND g_StaticStatusHwnd; CHAR g_CurVersion[64]; HANDLE g_ThreadHandle = NULL; +int g_language_count = 0; +int g_cur_lang_id = 0; +VENTOY_LANGUAGE *g_language_data = NULL; +VENTOY_LANGUAGE *g_cur_lang_data = NULL; + +static int LoadCfgIni(void) +{ + int value; + + value = GetPrivateProfileInt(TEXT("Ventoy"), TEXT("SecureBoot"), 0, VENTOY_CFG_INI); + + if (value == 1) + { + g_SecureBoot = TRUE; + } + + return 0; +} + +static int WriteCfgIni(void) +{ + WCHAR TmpBuf[128]; + + swprintf_s(TmpBuf, 128, TEXT("%d"), g_cur_lang_id); + WritePrivateProfileString(TEXT("Ventoy"), TEXT("Language"), TmpBuf, VENTOY_CFG_INI); + + swprintf_s(TmpBuf, 128, TEXT("%d"), g_SecureBoot); + WritePrivateProfileString(TEXT("Ventoy"), TEXT("SecureBoot"), TmpBuf, VENTOY_CFG_INI); + + return 0; +} + + void GetExeVersionInfo(const char *FilePath) { UINT length; @@ -124,15 +162,126 @@ static void OnComboxSelChange(HWND hCombox) UpdateWindow(g_DialogHwnd); } +static void UpdateItemString(int defaultLangId) +{ + int i; + HMENU SubMenu; + HFONT hLangFont; + HMENU hMenu = GetMenu(g_DialogHwnd); + + g_cur_lang_id = defaultLangId; + g_cur_lang_data = g_language_data + defaultLangId; + + + + hLangFont = CreateFont(g_language_data[defaultLangId].FontSize, 0, 0, 0, 400, FALSE, FALSE, 0, + DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH, g_language_data[defaultLangId].FontFamily); + + SendMessage(g_BtnInstallHwnd, WM_SETFONT, (WPARAM)hLangFont, TRUE); + SendMessage(g_BtnUpdateHwnd, WM_SETFONT, (WPARAM)hLangFont, TRUE); + SendMessage(g_StaticStatusHwnd, WM_SETFONT, (WPARAM)hLangFont, TRUE); + SendMessage(g_StaticLocalHwnd, WM_SETFONT, (WPARAM)hLangFont, TRUE); + SendMessage(g_StaticDiskHwnd, WM_SETFONT, (WPARAM)hLangFont, TRUE); + SendMessage(g_StaticDevHwnd, WM_SETFONT, (WPARAM)hLangFont, TRUE); + SendMessage(g_DialogHwnd, WM_SETFONT, (WPARAM)hLangFont, TRUE); + + ModifyMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, 0, _G(STR_MENU_OPTION)); + + SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_DEV), _G(STR_DEVICE)); + SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_LOCAL), _G(STR_LOCAL_VER)); + SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_DISK), _G(STR_DISK_VER)); + SetWindowText(g_StaticStatusHwnd, _G(STR_STATUS)); + + SetWindowText(g_BtnInstallHwnd, _G(STR_INSTALL)); + SetWindowText(g_BtnUpdateHwnd, _G(STR_UPDATE)); + + SubMenu = GetSubMenu(hMenu, 0); + if (g_SecureBoot) + { + ModifyMenu(SubMenu, 0, MF_BYPOSITION | MF_STRING | MF_CHECKED, 0, _G(STR_MENU_SECURE_BOOT)); + } + else + { + ModifyMenu(SubMenu, 0, MF_BYPOSITION | MF_STRING | MF_UNCHECKED, 0, _G(STR_MENU_SECURE_BOOT)); + } + + ShowWindow(g_DialogHwnd, SW_HIDE); + ShowWindow(g_DialogHwnd, SW_NORMAL); + + //Update check + for (i = 0; i < g_language_count; i++) + { + CheckMenuItem(hMenu, VTOY_MENU_LANGUAGE_BEGIN | i, MF_BYCOMMAND | MF_STRING | MF_UNCHECKED); + } + CheckMenuItem(hMenu, VTOY_MENU_LANGUAGE_BEGIN | defaultLangId, MF_BYCOMMAND | MF_STRING | MF_CHECKED); +} + static void LanguageInit(void) { - SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_DEV), _G(STR_DEVICE)); - SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_LOCAL), _G(STR_LOCAL_VER)); - SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_DISK), _G(STR_DISK_VER)); - SetWindowText(g_StaticStatusHwnd, _G(STR_STATUS)); + int i, j, k; + int id, DefaultId; + WCHAR Language[64]; + WCHAR TmpBuf[256]; + LANGID LangId = GetSystemDefaultUILanguage(); + HMENU SubMenu; + HMENU hMenu = GetMenu(g_DialogHwnd); - SetWindowText(g_BtnInstallHwnd, _G(STR_INSTALL)); - SetWindowText(g_BtnUpdateHwnd, _G(STR_UPDATE)); + SubMenu = GetSubMenu(hMenu, 1); + DeleteMenu(SubMenu, 0, MF_BYPOSITION); + + g_language_data = (VENTOY_LANGUAGE *)malloc(sizeof(VENTOY_LANGUAGE)* VENTOY_MAX_LANGUAGE); + memset(g_language_data, 0, sizeof(VENTOY_LANGUAGE)* VENTOY_MAX_LANGUAGE); + + swprintf_s(Language, 64, L"StringDefine"); + for (i = 0; i < STR_ID_MAX; i++) + { + swprintf_s(TmpBuf, 256, L"%d", i); + GET_INI_STRING(TmpBuf, g_language_data[0].StrId[i]); + } + + for (i = 0; i < VENTOY_MAX_LANGUAGE; i++) + { + swprintf_s(Language, 64, L"Language%d", i); + GET_INI_STRING(TEXT("name"), g_language_data[i].Name); + + if (g_language_data[i].Name[0] == '#') + { + break; + } + + g_language_count++; + Log("Find Language%d ...", i); + + AppendMenu(SubMenu, MF_STRING | MF_BYCOMMAND, VTOY_MENU_LANGUAGE_BEGIN | i, g_language_data[i].Name); + + GET_INI_STRING(TEXT("FontFamily"), g_language_data[i].FontFamily); + g_language_data[i].FontSize = GetPrivateProfileInt(Language, TEXT("FontSize"), 10, VENTOY_LANGUAGE_INI); + + for (j = 0; j < STR_ID_MAX; j++) + { + GET_INI_STRING(g_language_data[0].StrId[j], g_language_data[i].MsgString[j]); + + for (k = 0; g_language_data[i].MsgString[j][k] && g_language_data[i].MsgString[j][k + 1]; k++) + { + if (g_language_data[i].MsgString[j][k] == '#' && g_language_data[i].MsgString[j][k + 1] == '@') + { + g_language_data[i].MsgString[j][k] = '\r'; + g_language_data[i].MsgString[j][k + 1] = '\n'; + } + } + } + } + + DefaultId = (MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED) == LangId) ? 0 : 1; + id = GetPrivateProfileInt(TEXT("Ventoy"), TEXT("Language"), DefaultId, VENTOY_CFG_INI); + if (id >= i) + { + id = DefaultId; + } + + UpdateItemString(id); } static BOOL InitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) @@ -149,6 +298,13 @@ static BOOL InitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) g_StaticLocalVerHwnd = GetDlgItem(hWnd, IDC_STATIC_LOCAL_VER); g_StaticDiskVerHwnd = GetDlgItem(hWnd, IDC_STATIC_DISK_VER); g_BtnInstallHwnd = GetDlgItem(hWnd, IDC_BUTTON4); + + + g_StaticDevHwnd = GetDlgItem(hWnd, IDC_STATIC_DEV); + g_StaticLocalHwnd = GetDlgItem(hWnd, IDC_STATIC_LOCAL); + g_StaticDiskHwnd = GetDlgItem(hWnd, IDC_STATIC_DISK); + + g_BtnUpdateHwnd = GetDlgItem(hWnd, IDC_BUTTON3); g_ProgressBarHwnd = GetDlgItem(hWnd, IDC_PROGRESS1); g_StaticStatusHwnd = GetDlgItem(hWnd, IDC_STATIC_STATUS); @@ -160,8 +316,12 @@ static BOOL InitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) SendMessage(g_ProgressBarHwnd, PBM_SETRANGE, (WPARAM)0, (LPARAM)(MAKELPARAM(0, PT_FINISH))); PROGRESS_BAR_SET_POS(PT_START); + SetMenu(hWnd, LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_MENU1))); + + LoadCfgIni(); LanguageInit(); + // Fill device combox hCombox = GetDlgItem(hWnd, IDC_COMBO1); for (i = 0; i < g_PhyDriveCount; i++) @@ -358,6 +518,31 @@ static void OnUpdateBtnClick(void) g_ThreadHandle = CreateThread(NULL, 0, UpdateVentoyThread, (LPVOID)pPhyDrive, 0, NULL); } +static void MenuProc(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + WORD CtrlID; + HMENU hMenu = GetMenu(hWnd); + + CtrlID = LOWORD(wParam); + + if (CtrlID == 0) + { + g_SecureBoot = !g_SecureBoot; + + if (g_SecureBoot) + { + CheckMenuItem(hMenu, 0, MF_BYCOMMAND | MF_STRING | MF_CHECKED); + } + else + { + CheckMenuItem(hMenu, 0, MF_BYCOMMAND | MF_STRING | MF_UNCHECKED); + } + } + else if (CtrlID >= VTOY_MENU_LANGUAGE_BEGIN && CtrlID < VTOY_MENU_LANGUAGE_BEGIN + g_language_count) + { + UpdateItemString(CtrlID - VTOY_MENU_LANGUAGE_BEGIN); + } +} INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { @@ -385,6 +570,10 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lPara OnUpdateBtnClick(); } + if (lParam == 0 && NotifyCode == 0) + { + MenuProc(hWnd, wParam, lParam); + } break; } @@ -417,6 +606,7 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lPara { EndDialog(hWnd, 0); } + WriteCfgIni(); break; } } @@ -430,7 +620,14 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi if (!IsFileExist(VENTOY_FILE_VERSION)) { - MessageBox(NULL, _G(STR_INCORRECT_DIR), _G(STR_ERROR), MB_OK | MB_ICONERROR); + if (IsDirExist("grub")) + { + MessageBox(NULL, _G(STR_INCORRECT_DIR), _G(STR_ERROR), MB_OK | MB_ICONERROR); + } + else + { + MessageBox(NULL, _G(STR_INCORRECT_DIR), _G(STR_ERROR), MB_OK | MB_ICONERROR); + } return ERROR_NOT_FOUND; } @@ -444,6 +641,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi Ventoy2DiskInit(); + + g_hInst = hInstance; DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); diff --git a/Ventoy2Disk/Ventoy2Disk/resource.h b/Ventoy2Disk/Ventoy2Disk/resource.h index 4e81d7f9c1c9e57d4772f1169af999fd988177ba..706d3c74139ec1c42e09552078eaf9917766c6ed 100644 GIT binary patch delta 386 zcmdnN|3GX*2_tt9Lp*~ogDZm{L+Ip2M*YbK>@1UO*d#U=Fg{_P%*H5U7|-C(5Wo<^ z;0dJtfQo~Gik%rk8G?Yc6Hv?_C>IRm2LPczP&8!nNjA;N1&l0$@eDo;jzB%`Kv_p1 z={oVEHm3=L0T>!hW@MD)j%R@Jje(LAAFwe4`IC8>8nu3&yqq;dB=IV(TRl&9?G9%k&j^vJ76d4ONcUYkLz!FW~a