From 9ecbff9ce6736a73cb020fe4860bd2d47f3ec968 Mon Sep 17 00:00:00 2001 From: longpanda Date: Sat, 4 Jul 2020 22:29:54 +0800 Subject: [PATCH] add GPT support --- INSTALL/Ventoy2Disk.exe | Bin 298496 -> 318976 bytes INSTALL/tool/VentoyWorker.sh | 58 +++- INSTALL/tool/ventoy_lib.sh | 108 ++++++- INSTALL/ventoy_pack.sh | 2 +- LANGUAGES/languages.ini | Bin 96532 -> 102112 bytes Ventoy2Disk/Ventoy2Disk/Language.h | 19 ++ Ventoy2Disk/Ventoy2Disk/PhyDrive.c | 184 +++++++++--- Ventoy2Disk/Ventoy2Disk/Utility.c | 139 ++++++++- Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c | 127 +++++--- Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h | 47 ++- Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.rc | Bin 10832 -> 11510 bytes Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj | 1 + .../Ventoy2Disk/Ventoy2Disk.vcxproj.filters | 3 + Ventoy2Disk/Ventoy2Disk/WinDialog.c | Bin 50772 -> 57956 bytes Ventoy2Disk/Ventoy2Disk/crc32.c | 275 ++++++++++++++++++ Ventoy2Disk/Ventoy2Disk/resource.h | Bin 3830 -> 4204 bytes 16 files changed, 853 insertions(+), 110 deletions(-) create mode 100644 Ventoy2Disk/Ventoy2Disk/crc32.c diff --git a/INSTALL/Ventoy2Disk.exe b/INSTALL/Ventoy2Disk.exe index 1539d7b0524af02374eaeb7b62135857f9e17278..f8b662d89efb00dab1e9de432e914b6240adb2a7 100644 GIT binary patch delta 79770 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 delta 60315 zcmZqJBit}YXo3yX4~B_$PW5d@fy#%1?F(Qy=JSt&!@>3iEll?co`LBH1y{iI{Q}ou z`vUnjAHnkSYrYhm2kWyd2n@C_IL~;y;3AlQ0+v4%yaG(0XM6~zgEEsdKz1-dL4Yd* zgAXIC4+D$empG^x!vh8;Ms7wP28M5p3=F53z``zaj0_9{3=9kcAie{H&BVaK29`z8 z3?En~2Q%vG?x|s7=mE(+U}9MCk`cs0#TQr@QluCd3WS&#EG8;Si)|=pVsJoKBEZC; z!!%J*N?5NXwW5T9fnnuWs1v?1PUdEkHIu4@I;V<(f#Dab6%Gsx4tgnxC5a3S3@#oF z3=9*P7#Ktt7#K<>$1zEnfnD@~iGkr2BLhPR$VUj9!CH$_bMliJz%FFCz{0>F!@$5$ zw0Rv<5aUDxj!7&&Ob;wJ`?0t)GleT`p3bhq$T(s09u8Y3W0T3hIpUZui%yQ_jAb&B zp1h0GfLZ7T!{oP|B~0B?lasmJnS-7)OkT@n$Sn7qVe&(+a^@}17$!$^A7uXUlwqmCEN{_Ofe;3Dcwym%?Fw5yBJ#zlt}h2 zQ2|A_qt&4jHjqf^*Dgl)mII~ly1~Zvy8rKuU^M>Udb_S9u($QYzyJTcuLr#NE6Bjm ze1xO<$Nv(q-qsT!(Q5$^>75^TIxz&isQ&){fAbNJ)&nJ)-&!yK`~P2{M1g<%);s_H z|99u#-umdD{r~?5p9wI3u>M^u4YBL>eB%T0anaqre~iz*=y|}v(ET*_aCa-nZ{5Cs z;*HOC8tee2?6~L`c@IG8MTAQwI4r!=_s@&-zbD5FN-(8rPre`|66LSW2y$Kb_29s6 z-#;%7fE~-zeXjY(fBu%s3=9k}Z2$cK-+F+*^#}t4g9Upj=R#0OcCx(|?7r50{zW_} z91rlfECZ!Bv0m3Z0l{Ejy(pXfTu_eb!_LXL&lkAWNva^|@gQh)#dkB>7x z5DjwnnKP3EwM48<5b@P)tFg<8fdTB`H~cN;j0_AfGJgI4-~FNW8-I%iBLhPQ3nK$V zZ=FaML->n-nqZ&2&_wddn-`G+pkRmjq@c28PD}{OSx0HH*NZ1L2e^b%(LMs1;*i=sx#i+3)}Vk>YguU53d&gk`ug zBthN~+4*7TWH}KRgIz)l4BfteKw)WoHu{D3T}aHIfq>BNH_dN&!os_Mb^89`-^Tl4 z=j2HuDG;Ym6q@{3L?J=}6tJbby&nJgx3PlU%D?^u|8`c1T}})KAF$4BeDt4@fq|L# z%T6Z-<_iaZaWY?gE!-P`P<(+|6eQPO%G2%oC+vSI2lJtT|Dr0pCYOrJ%gov8#9(}> z(-f4SJHdIm6I`}*ibialyg^iq1DuadLpDx6Co0JluyOKBQCW46;@6;J#f=4$|GUBZ zSzTBd7;IJcIWg399%r4fVY056n&gBHP7Dkkq5n&{U+De+|Gz8rf4A$8X4@$nCg+Gb zbMUA*F#K0({W5vGSfDm21(mWjJi6Ht`hTI$E+>Z810_uVFLb&7@2>sPb)w-RV~6j* z5`pgXFSsTfiyMmF_z6j0C7fNZ|2x_&SQr=<8tj@}B`zhVsqDa@qU^xnuI#`drR=~U zuk66!r963+cp4~u3rUoif&%gdBR>NJD3^1&S${8j-u&Z#sXqTUu$1woZr3;9i1%PV z_WfIL=%0WW!9tUFODNY&437 z|3LvhIYUy}>iu6(HUO1uT*uo?SU{yGI9Oq^(Of6MP@?d^jHg?yw+)n^0>Gj4;`@im zUnT9O*}ne&4-x3$LFi+S`~M(rvfu>K$zf7_oFLDXvcEX^YjUpCL`J#E|E07=4*mWA zzqieRiGiW}au#Di_qi7jeoVHLc3{%en%p4mTF(P@ZKv;-r<`e(Hfx3dFgst0+r_+t2+l{09M0j^Chbkxo9el~z z>C4mU`lIzff6Ht}1_t9x(8{CrKxvhR_OHhO3``6RMFq|K3|JT#{+DQ4f`g}oxBJ|S zu0Q|(cZdGz_T`zpu}h@B+x5%A_ngd!!n-eap9^@w`x_#Ag3*_!`3T3s2b_#<9LyJt z4|In90a=yv7MK4kra-~ESWAIL`jmNg6v49)w%aZ(Zv z4UbaR7j{3uu?LT!eUpnMCF@&$;g82|Uml2$O7x)Nei0Jxr@`eQN9%!7(F~AF0wB@> zFPP*(r8Q5tD^GXmpUyUrn-D3a+w}|cq40oi*B`8)NMx=*7VttygOQ;-^iT5U85d?j`_I+RY1& z$de^Z|1WkQN6j69;Fu2!Z$AIO`y(U)?Aqb)<^(FC4}OQ15GLJWERbY*j++5gt|+4= z-}bkl-~yHYoZaVM{QUL*zwv)iVe&_Ij{&SrlE$CUYEb6H5FGZIzuxsk_s34(BOoz{ zGA9O*$c=CiFQ9Dl3%N~9P8T=Nk=J1qhH3uHpU=9---%(t8UM+*6(Yn|o=2(&z_ozD zLWT*GJr$Lh3eQi@Rg92oS7roN9L+~~jL(8w2Jvw(n8CUx_xDOq_EMS?-+i+)^pEkk z*4z9odl(oP8m#q8**EF;Iy1f&ZK!6nD&cCVW{Tl&UBJM=uqme3nYoLjmsEy#*Yb2<3k>f*{o?1p$vn#DN+8u;?4U-|Pwk&O zKnYa)dw1<0>ks_?AHsseUoa?5PE;1=jB7seAKW(BT%~Np!PIbT@;dEirr$Rw8|(N= z&EW@m<%iMj<|8~7l4S~k{M!z9UkiAVa%=J|9XrMelW*#*V_JG+a;I)03b$w;N zTnEJm2dEVj`5#`*{xClKV%DL_A$q+`+=nJV)-z6YxZ%Xm>HDVB^}~PBF9J>sSq#0d zJOSW@8~ooCB>P|Vg@6-7V=WITF?YKDD3Sj!`b5BqA>e;04_Mv*(jOTY{GAwHaFv5A zZsP;o-%I&+HZU+S?2Fhpxm@3ZDPrH`jrtl+AmciHzjW6AK(g%MGtPi8xLt1qoEW-) zSeEjXNFuBW3(w#QaAJ57TsB$Sz=g{Klfa+J z>x@mAcD77@YV5$o;k;ShM39lOWU{4cC{y0{$rDUV8JACHGgIQ@baY^t@94nr)X{-K z*J-kunJwd&%_U}jjEt`)A2tuH4|jH8ka2Nf$b@2OEd{2)DcPXgQKtD7Q}YX^PTwEa z7lNe^C?5(l{?_SwC%pScr|XN((l6b=jSn1r&%<2l(OLUI*wLrc^^J99Kq;rSV+eoC z3Q*I}=qIG>fRP?&YPK0!(XAHYigmp*|cfpxjyB+woDru#Vep;C$N+8^MA(0n{%U&KBq zhR;j8OY6UM*FNZW{n1$w&>0Z&nz`HcNB8OO-^~x%558yK#Mt;8RGnOU)a@bDeDGiQ z|8CbG&Rs4R5lV-cE?M6!;xxVuF5rzWwHzoFbL%Yq()^FHRJ7amMe_kBXmi{6TW2gN zkgQ|xl!&)nD&6D0i4js*7j5kJt^e`z;6GTFcp7^+9-j5UF>nSP1t!7Gub4J7hJ|^^kx1&{H`eV~H0v-Uw}=?7+ak51Pg-G_wzeVQM!AAG^w>H7y<33i{l^te0pN2lu> z;{(>=0i`_MzJIL!L-<=ZfLhq+Un~Tbr}ZEOcR)FFHb~U>Pp^AK7DK1&lU~;g{7Wu! z1{{3E85jf!`OeS_oxWEPvGWCzmV4dNqvi`FYF;2k%@=6YynsZFSPnF5>VI?};&%O0 zD%xH91ROc=nE3#Xm_MEFA>FQbI>Q5+4>5Lz{%8*U!_a!5)T=x6O|Mr3^ZD-oU5qV< zOZAKn`*koLb7yAkEd5X-&UCxQVDmlWMGKJfAjawzWr4IO~vXR@`G(BuHC zcqR?6$s4U?ncjVye8DP=Y1+5R8rD%vR^KMKSX(mv|2lcU^-jKI4+jPXPX~r*FrM6I zW6l)+ZSsB_KPLZQllg5GnAZNDY-qcI$@=T$$F?3!AHPi2wNsIn1_kql<|CkS0NZZY zAFT&UgoC>;bf0^{I622Im63b$B|B@T{S}k>?Sq;AZ=9TB?*S@6*4YPwC`Jd}07yA< zqcijlB<#CgfAspk$YKaQ_<%DY92z&SKmLn?3X^W%ADym$EPY=f6(%qKm;U%)`Ug^O z1*A@{bC6D*umKbUEU!zl82Fc*;_P+35peJ!XAnFiBCG?I!cQPkjZ!i;);2p6;l^WcYFNUdO*oNgpQfamr&l^nS9AbAoulTS%Q=Y8?2# z^hfJ#qdZ(>oU|`tK3aT_}{GAxIKfPw| z^%aC1{}K(5Qdmlgj6K|XvUFmvBV&AAG=#Gg+?@ooOTNU%fmMQ} zAQ}728A#sNL3F!=!@@bT7_u0;f4*p%{M%ERsqXn?1ut=xuS+4Vi(dbT7nz{`!huq; z9n1_244@PY9)Y;LbaJ$pHIv)Z$uqpPly5zQSGN)W|Nn1%3@XEV!y`Iluk;oOFkjwX z5IFg%mmb&2C;$Hk1$3W(k+50Tn~{+*ZnC_OqRpGd5ZhqR1eZVp!JuC4aduE!{lzPA zVP46zgB$7w(4c}zYs3Mk$u&OfB{x3$|DXAA_o+_TFT&?LeSh@!f!ew+svb>t@wH%b zcr>}rS6M>((f|L(Cz%g-x;Y4+@APx&?E}{nER%QoS}~n`IQgru8vn*8V1v#HUk?g+ zQSx}QmY*6^&cn$;ehxBRkKtZq2aV_)Z+=kUd_b(1r|kv*#Vru@OP{iK+!>aVdYgP~?X?&pZS3;r_1Ha3M)^E@d1ovc& zzjd>0jW_^q_cI@3U}!yA!hDR8p_2zJ*c`5+?c{?Y$vPQ#{{IJ!am9fKK&oe< zBo=U5$?4{`x#7gH(Bg*E3RaGemMdzc>b53fE03j zd_bj}i1A70(kI==gnjRDA1oE<{tm8T_DAfS+#ewhX`YqN==7a~u;8aL zq8!u4(;ND$?sF2sb%l0>tEA*9QLZ0|A>D)A)s58`AiN zTfr&2@jR#)0d*AR!(IqZWMBYy&6@#$R z9%#Ps|Fvj$Yt4U9owH;zV}htym>>f~<1bKWgTKj3kb&XbK^Fd&Lz8t9)Me&!F)+Ml z?)E*?dZ1j0zljU15;QZz-}G;Ceu5MKg6`TS0nOJLf;wyOyx7t;`9Oj+| zNc%3~Uvr4@;tT5&MST425dsVh*1!0h118HR%E%ZCFfiEu{r|t7zg+_~=6Zm=`}DyV z%*K~GU1v-VO_WcZV|=pH^@j0n;{%<(dyM~gx?TXuo#^#r>h&#ls#x*I&@C=c~AoF_MNdG6#UGmJAG#eU+8vypnbSAbWW%1gVOEYu1mUo zH+09I(ez!Q>AR)V^~R2bfXRWW$+Am&{T%+6Zg|0P>i_@$r7L>-_9^cSW%e?vmyg*MGlG;C$L&^ z0>g?E$W|y@Pkx;l0&>4&mK>y5_5IN4iqz}fgVoqQ7{=~FHa5j-@~SKq@!73dvgOK_ z$xpLf#qB|I!l02fq%7;(GTAZPh$$#=a%px9lT+a2%h|E@OZeBj9_jR5&{?~K`A~D{ z0|w@Uovu>^YajSAAL}k%)9HGl+x3LU_X~<3#szKHDGjyHnLAxClnOJtZec#r>ARrY z_fGS5hR)g@uXT(seJ?%I?Rug0Qi;HS*DW5+2N^qk7eHiy?Db^qaQyF8`sKCWaW{1a21UPK zKkW`TvHcSQCa=#^w_K8TyzL(&14HPl@E2bD;R!$W184;PdBZPe{?^5yrm^di=HqNx zjLjDqx~~Ox4mQLRtouN}E`xUtJOy3LFwrTRhf`WSPC!pp$Xu9oxiA>lF&w2)i?&HWM zZd4tl$j)Lgy7ZzKteqtcRIG5k`~UxiWId>6VgWa;A+v8>( zJ*et|xHl9ulZw%>>$Y71vgu~VFJ=aY;Lf?AitPXOjQW2dZuf`(*E4=IGcf$$3KH+W z@&9@^uf;|uhQ@;}=NK3|!G%^}*niPAATz)+-C&iC2V3?rFa&1&VP;?m`+q$EqGBOP zD{IR!28Mu)zYv*jTaea(|JS=sK|ao6$l}a6%D})-|9>mEK)jX_6AJQdhBG7BqZuhE z+=W*bg4(zh(ldhsGIBzl7<$1KXqH33i)}Tas1udlPZmSKix&+H4BfnE7EX37 z6;lBPN|r!xV+$VxLqKn1%QXgufUy6f3k01Q;vi{KxoUECsig8kCx(R}hlVW%xxAAX z0B)|~Z?aT4v+aFLiV}XcdG5jy(_%FIdaPpoqdE_QqU`7Qf#9e1}PJQz4 z|Nkt50OS8JJgPupAdtlr{$Er^$cZ65JUojzizz%j>woxvQ4t|f6oKZ_12TRHIWc63 zgl7a~Ix+kgRS^P3WQjz;e^D0!kN|ibHe*Ss6T{07EDQ|Y;2HQ{&Z(fO{-BHtp_7x# zmCTV;UID3G1y%`C641@j?I`g7LhAtxGrxpR-czo|i=em1ay!YbLL#oM9JJ$^f36@0}|0|NsA>j2A*q3<2GY|1WfZ z=x$Z`|NlSOUXK44TECS@grWK+B7AaPmA+h0xD&®-5GW6&}I%e^fB|NrOj+XgCf zWnBa&pRQ71-vLshqc!XGoa*0g0T@1cft)d*iVQ3=9m`5L0@R z{{R2~nm0ox!inLmW2Q?f?neq6v0@1T~NZ-JBQ#G7>{iJ`Oi2xu`#>yCf_|Gx+Y8zR!% z3Q7zaps9&~|Drwulke3?Gc7Kf{JTbty#W+T-_$2-)S5BP5SW}$tD^@Vp@)u|hi6Ox zDX3KkxrXQe)+_)1|Np=B%)kHtGfsdcQq(8!s#RtG0AgFHPkvTwTrc1RUCIEqHQ@hN z(E5=7q9FpHw9Vgo^xyyg`zC;92%!=x0!|EJ83vI~3@=WofoA!BG#}yUK4yG2J}&x& zSs^5nG9*CqE7U;FU}>%uU?}A{)?)hl-~azH5Z?u4=tP1ob_5mF2SC1;s067NF#Z<& zUo=3#iQ#qMi^s(b@cIT^6&wJ~`@$C0`~X!w4g!;J*2&24DFkU|>1+-759+*^iu5{z zhM~HBK~pSU1(QYUbpvgpK^YlTL}!2+$N?|XD?pkAdcjo!XxJ%>Ig25SIRiBH6!2ek z1~_D!|Nk#lfCeu_Wk7~Yv=hUN9@WW{>NQ2d;Z)+)yf@_k|Njgnj^QBJPrgvE5wHiO zN?sLI4#fNi6;3j*RnZJ804e#S0&)fqSfdj|^NIi6y&nJn|F=F-D#yQ%EifP>02G+l zR3>{gn27w%hlV+e@mX*a;00g)XmrZJv zb^^P$R0ryej0TX&ZP zfCLT1l<@8w5bJ^i!ZHqk6h$jfKHR8n_W;D!RAyl4nw$R*04vN&`7dfAFj=QbMg&}VKuizFhykfRq%=9EN!q9;%86k| zNfc-p>0kg%K?g`dw-U(RJPmvE{{8>Yz~6EgTu6BcOkUZfAg}_Y!Vj#1<-cfzz~q}v zmY^H}VmmQdPtExE|9{chau(}jMaLn&gB$(?r1icc*l<`>o&OID92QVS9t6vBfM#@| z>!S2?p!wkhNcTdpJPT4G!JosxFnMCLlp<^tA&h_D!GH`%N(D7vpeglz@#HhjvWDPb z|IqyJKRgCuUI(X05wQ6@+{d7Ga7*@NsTNge3Jq`G3mOV#DDever_hiV4S#S7ovi>$ zp`hMY^AQ=SPWEhwyV1e`oLsXNz+nJ3#R)v4d*Z+G*|-;%vnHQzQQ(I8WTC;v$=_Nu z#OicF6V&`JdsF`Y{~w<5CdY~4#Vh&ACap?Bpjpd|AJI+>ovj&v|NnonO@4Alt310v zj1$9)3G$QsS~b{ZK{k6Aj!M3lO5Z|&2NC%`(+szy1~{oAK`e}1zIrXn90D< zeFHS_al2HhTNdR0Fp%CKAocySll$9^?H~qgKn)fJsR_uCiFIOl;UEhR=inDpGC&NL zmrS6U!`_6y|NnQlg1p}8_-9gwHP6d*kTg&CxfjnhCcAgYo9}}Q?9pIg=yn!qJy4?3 zy%nU9`EWqvF#*u(HBg}t_F^(z=|qjmb2}8Q(%}NB8Vn4LtsqSfObiVFTSNZ-{~!Ef z4p^S$KiH$7bOavn1^I3A_YPf6j?UJYzo2Cgy`Bu+@hqT`Glp*d?#nNBr!q36@oQW# zKJbZOfK{PvvTvs~(}~i_U7flTrK+IXyZldv3&`8y(jf1sG#+=De7;jU*kq#<1E{2n zez77Ik|set5AZ0f0BAMg7jP?KS4*rDLuc)eogE+}Mj0_Bjl_g=F;FTql zZM#%FpbIcK{$GSF#sIInXgyHE`~L!xKzAKSXYHTXlO^o`FM?IT4C8w7ssm!!{63W^ zuwmfEUA^v%0WYqCT>1kP@Bd3I!~U24=|2BrPw)T#-L8MS&mVUMP2w;dW3ga(!7dBx zR)A{4EQSB2UtTQ9VPFV<5tj-I0h#V|FWP%1t9R?wzc}E;5H8I6<^ZTy!N24Le8Tv_ z0Vjq|9~G5O7ZnZ2I81k`K(C7mPZmSK!DpOd|4VuPn}QTUW{g2|NF{8RB`Q26QqY|J zzeGhKEIeZdDA*Dp3;p83JqYLkduaEYu=?=8Zcmo(U*PWOo-d%V1+6Ci_rH`AtTa9@ z_HcLmHBhR$0*VH(jf+8!J`Q#>Xz2F^3)pa$7dh?!|HA^2^+jAeba~ZrR+U{&3=3vD zFdSzEEgb{v2`B~ChS*L7pVgL=ty=VnxiysJ+ zS=;~r?-m8Gy1P`u^#2lMwM_kt|Da_spr#FIDITm0I}Y-~eFd|Ig3RZ8H_5G`H8j zzV-iqOYj=EQq~t&T2Z{HFdOE@39}s-UK}e1dr<=FLvwM24`22&GBAJ>Ho}`b72=#2 zUKqB4;vg);2E<{3XaTK?i(zD70NKmq#8ArmBBm9RK+XFUC{OKQS|Ena?^CHqr1tQP z2#^yz#6ZdRdLjcu_mAcyJgxsr_@JqNUni*E=jcB7VoS&W{~0A9)ly<0KeFsx0OI)e z{{O%80Ep!bVu8J931U3}iRt(L|G(=`oD%~?F+(fJ-x*;U4Dn73FD{FM%;5knmP4{} zZx_tQ$DkB&?uAXq|NpK3OE|+{{7(RBU@=BYfB&1o-h!nENFu44`u{(u44AyCUzvTu z1}BDvOEyft(yt@}iuTux4vUv;aANQ)y&cynx?sa(t_gN7pp`lqpy8qy@en(@KlHkS zG9g$nEF3ax6W0CX1v^9@mitP1!ZTz*o|z;vxo3inD6I1AcI64{F69Uh2+Qz@pL}2ckop;5^&;RVMixT`$agPHR)Wm{HG!F4@Wg{SEQ>)htq1s9 zKm}LE36R!UVFrfo(ha??TLS)rG73ZYwJcCKe8r2;Q6N1c)}>qcTQ@Q=Fl79RcVf_Z zp$pPrYO~Raq4@|)SjH1jc_Rt79~6Q784RH4<`AANHc7()WL*Ymn+Egofd8dSAc5EY z0Ul;+!ZIWhoETng69QQ!08061K~-bvmR>)$7X=!V>n6$8yCgUoM$kGX5TVLFc1)0mz$p-RsG^hqS#?tr?RE*Z#%a{Vv zt0Kg}un?r9J9Go6-;kj&&jIXxaMF0OHIgBaq4|hNqb(@)fUM+i1r0KT!{WsYK?a6y zw4k^GUi6L>6oNK z4UiFU1Scy^(TmZH0m-m5*DhcvF$9NDH(Tq063&1Z{7@Nqz&ryrdLcAV|X()K>fyHF=J_Ont_Q1Sf{>kI*Xdxa${Cu@7Aj`@$SFm2-pz5-0mXhC-TB zC5FAOKa4L0^t%4p`62Z9i@{kU4!oSNJM>4d z>zBZQ;4Fr~deDA@#&D3^M8MGq8jTP8FRCE`s%U#%KLlhj{NrZ`4#P--AHp&u5}g=c zOyOr>2!8PzlIH)H{(12L%w#b>0I?0!Rsmsf=e2~1fng!6^ZKXTm18p7H1m1~kU3KP z3=Dz2p>JM%JPt0tS`UbBfQ%&|;d5YN7UPpIp6mi^2*}t165j?E=P*71ZR4v&g5s$@_Hf1#kn{{bP{$HF zbPUQ8aW7cGDq;_x0Xx5j8QJ;4Vc{9fpdApc8~^?Pf4p_dpa1_svDf|acjqF~?8TGCAQ$ueFXQ=N#_?jCBm+Z0eQ(GM0=d zAh+;>+#(A~$jwJ&vKX=$Gnhal5T@V+ei_t)yin@I(CfMboVbw_b3p-Gjc$>?RY`{ zX4&lWU(`gviQ(W2<`s-392Z~wJG`QvvGfQ3zQX|-JxNXs9dkiJ_d)>VCaCv0UKjR) z4eRx1gfCld{a+W_I~QcdYj(&4Btw^r_5TiV$oGQDfd8U8pz#Y>VG#xu&e#BQ&^jIl z2LI+G0yLGVt?CBH6eR4rz(#bm&i?cNKmWc10U1|7nyPp}zToI>?fCQme-=Xk zD9eCwh71EI!~dXeE&G1LUAr+#uB)84Afx3@`42IV|7-9Q4%k0AU}Bb#8GC^`L?psqDL+ z5dku70yj8WY+}q}e8KV@)a-yZd1W$sK=K6;+aT#4lv`fLFfo8u>w*IZ5i|~r>`}hApb88l8+?gSZ1rjRt;6&XCUfR1Dw37BXD`@EmC@cL3r}P&%+};DOrBH$@ zV++V>*SJ9ac~G`%KEm?9faiY!$BUrfpkxUuA^DMTnzDofsfiGL%8`EU3CdP7=$& zRSl{?-+-+AzzMbTMH_fERtd7#PBDP((SX|nvxWoBntE6@XphAng%l@-7o8A$Kq);7 z6qnH20TR*R+1lP#P{9J400Gs{tp`fg5P=L$u>ZG$GEGJZ$UqCQfjqCZGHOzs>KR^W zg83|%`3foVKzk}#3|X2OUJ^j_63j<=;K~m*hU2X({{8>&0A{WESO5QiLbekF|Gpou*?MP# zll_*hAf@3MCE1{A_yrF*cm!Gxl<2!P|6?w?4=c&Ofb4z84)O~JR18|^fnEPv9x9k2 zlj_9q;wU=<19&{5`3MKZd(Mr&Ss3dX82FpKK*O{D82MY;KrL1Wkn-v53=G{}TcHjpxmY8X6;hrKGUhcqm2M1V9Rr$13p#hmd3WU3q+14Fkr3%Jsq^bk5B z-nn-MXnEg%c(wb36=Vbpxcvs26$UT$Ob&qf9+D%&;qA57HNQZOAO@z%zN|NmdiXJugM4(8}>V_;xp==SE}UvrA{;7d;J3(Yqf_}84` zKKPP5Fet+$&57Yf2}r3ov~q7gBJhIwJ}B1V^}7(He)okq^JNQY#o$&@6!+HqF?O-J zwHzq@sr|9_TU{Qc5=T_mKIZ>BdO`1iuoa6_OPiUnG zsfoZY!BzcLg@Hl_IdNUjSO9Xv5oXXh>=f%?|NlesV)s-~3TQsU(tQ4Z79*&w7VzT1 zEl@OqmukHM#TmHl3&^+vGN6Tda_t(0dho#U576w76SNG^_yLmkVg^~v0Zx*gtt&w3 z_4of0Ug)G%H&_I|ICQQr%xmb;A;G}O0F4fK*ETFeCEbbP#S10|hUWSsJP<9&4J`$% znmj<7wt%)8ZUtrZ<|90>C2T=ccKog3|NsBbC;-V%0T~J^!~TOaLHFqwP2eqJpp9|C z88gyBWH>RrXaV)?kHDtgGAux11z<6j?$a*}**=0=ocyig|Nj5) z?cD$>IFxx97(Vmow;F)fTki#h)@T0uRs+y_^#7&ilP|6lvr=e2$kKd>rTHC8@%xM% zkdeHgp$S{ixPJ2yme-l#8FN6Q-@z-kI3T$*7*vE!R#>ka4QfAhgB638u>}0z3M$gV zGWLM9fR@lU9}$2~Y?Y=p?5+Fv|9?YiY{mCKmSe4;d9Q|JtsqIzqGN_E28j9g ztHh;);XT>waKkk+ofux|GE9E4US0;&5;*Yk)Sv(VAyrE#X#I@>3#4YLIU>zeATW96 z5o_UuOwerMm*4;YXE3lZFa*3%37Y);h@8}-HU@@_j!Y*8<`2EC4?xmAnV=rJS?FZ> zqcV<>pvhj4a28`0W5yJa#UgOA7p&mnCKd3UZQP4iPe|5*bUrzt)8{ou6_~i&CeJ%6 zpBgx-&vHc7oyKHm*q=F>{kV|XM0NQAOVV48L{x_LU3@@jH z8vK#}MSlo_26Oj+$aG@Z$&dw_AO88euJz=8o-8MZ9U@?XAFp#;PwrO$38+8?Vp>n` zHvtJ)Kn1*8PwsaC33xyStXfa*j{pf|fCS=Qe!SKMO$+UB$Z}$ME!VjB$lw3}XIL>X z>~8@nngCMd_Tx3{{yAAr3>g|DV=+5_C+*!GQ3LBj{?+ zfYnO8mI}|fgD$thdvf$?^@I;uP7E)e{s7m6@WxfBGbGyuWC&zCF}yeimgaz0Xl799 z?*E)S9TA>K((}5v=rvpR5P6vj@oem63cTRqEIt{+rI4u0Q>jzNt z-}u{c*Dv7Kzv~Z3%l{{6OYZ-Ytsg*5{>c?*ltltTlQ5tyHNJn055yavjeBA5GTDS446~_lPf^7O#2)d=InJ~ShUxHVZ~ktXNGlq9T>Lkbzs=F*MZ@{UI&I_dmR|g z>~&zcwAX>*#$E@8dwU%ip6qpCc(vDo;lo}BhHrZv82;>aU;xj~@-*A7*f81avRwU# z15ON}{jr~yf>PPj*u#kNTb&$G?a&P0q92rD16m(&2{g$FDuP+MKS0*l{{Fl);Dv+( zDE+haHa9SWW{kn{3YI?3x&k^6*!_7w$hyxV`TWm zFTkr%<^-OP{=^@55j-a?d!lr*&Xp_j2XdSkGME?`8vctifOBS823RNuWQhOg$?{j_ zOn2lsG5jz6@?Vq%G}r~+SQwB263plTsS@}MT8PQhd_<(%^~e9xFP)74ML7f}7hTna zuS5)MJy{~$V98Lz7ns43>%{P4$0txa;xPVZX{xf!iJ`9gHKIIRsIklmG>RsX>%{Qi zWWx&?TTn3Yv>qsNf=S6hr5NE->M$tUIQKdp$Ik{YF-wDdxk@<6GMgvSiYMV-jk%b*pye?k4s9FU8Td;l8)nwbI}MAo<$WCBP(f9o^Qh(lLz8R+bo*7E=V z|2O;$DWK*k*q7qsr3 ze;Zps#upGT`~zrIno|CkHB- zz|QHlgg7SyWKUo~P{w-(1_u6ZhXXRcfIRT-9mtSBq;eF zZ_D@(0ms`w-6s&cNU5B&c^_y$5JQ=GSg%_{K*khM=pF-i&v;%Q0`*I5LAjZsM4@?K z&HwuU{~1c5Di45E&V{O+304Uz0~ktVoA-eVdG-Pqx4Wek6fB)!H+R=VR8D>I^Z)j6xl<@q3U zI(`2Hcgun#L1*xR+U4Lfw)#6-xrK*h`(8cmMediV~~l3K7Oq zlbxWo*}a=zfC|sOpyvALr4XUrAffILFz!~6T=$R9OS^qPu!7v@+3EYCbV+yU7m!C? ze>gQBc9?8^PqiN08sNw%C;*M`|2gjZQ2nefE}GX{oCUWbiN3@!ISOHBTQC(oIAeKtBV1ZH#;I5A`}G=Ns1c$$N|RG`Hd zKeCvz7z19gxiZ*-_Mr5#m<513UEf{6Dqg(y0;vx$16k_;%Ap|pKyd-W;7%_O2RMUH z?zu1N!~xm?5b(e8*MD{fhVtaz-ap^}{|^kv0?h`nK=uIm^|pTb{{MeKZ|e^bm2m^) z+g6aefd8UALX)50mzB8#o^a22aNUXF#Y-EI)iU6&Y21r_CX*E&NH9*AZ23U09z4kj z9xWkd7C#4UAZ+vmK6nDPz|aJd+(2FgV^D$f@x`~-piZ-?4opiuL$@txOHLNUf7277 z1qIhZtSeAf7DI+RBWQmN*n!q`NTQ&`ocSA+ zz?rXin~DfHF?72A>68Vf`c6@cjg!5f=rQ?hoLv3H7{1LaILiPUMc1+z!5nZnT+3n% z2g!h!a=1qt$N@GVkcWvnf3AO)Y16a@Ug4wdo)HRU1ePGCY|U?E6k zLsi9rg~0x+zYccF7C|S5W?RsTB2bUe6y&lJG5AiebqoxFSqvE*EDQ{7?^(Je}HjvvG7cfA*$r%3sTDR#F(AFnd3c3bLZIGbpw*68s2%0XlGop^}p|r(pBBQA3){0>l??$<1M217#KV{eLr-%zA0_!cKs6<9q{6> z{^Y*rvheOra9H?paPu3~K=?1(0qQ1!QwIO`1D)Wt%g|(R3W~+dKcY9T^LS{~>#Ff0Ta+k8ZT z71YvUK9(^B=_(qeZ}pA+6btq5IxKpN*3hUyA92_R@8N8>`*m)YJIy1gPoRThGV<8o`|ca{3QW z{vIDj28Nv{3MZ$%G_Rin>YKqG*4tk53Do@oIWOZ*p%X|O$j4xdv$!(8K!g}T1cg_VZlYh+v4H{~yxq{?7_Z;Ek=I{tqZMH690%-E%>!=plX${x1shS+9(9^I@h= zutZw3H3NTZDX4`74v7EY(0lPg2OQgB85~7U3@=(A{{R0%;1B2sl^rY`3=C=3tr34G z|9K@>&jdO44ANE0Fab9YK#e-En==%OoES1dM}qtp1qBVL!wqsGB$Gk%nDPH!Pe|-D z9}j@#YS6R;XleU@QBcBc-V5qlFw`nRYzY7d5@@;Ng)TJTyK)JS@Apz%!!WSrZH!T3mLiwbBu0#r-G_Pf3WZE)?B z1s6rvGv0%Ei&a47_w|eqU=Fwzzn<|H%mG)Y*E2qXIgrw{J_A%r2QLN}`qwi+C35g$ zaNTe{;|*9HxNf+f@ea%Zm$%n5zJNL4cFFau-2bK*t~)U-23IelS3qg$Ls%9gcok_d zWS?djY-SNEcrAm0L5m@aA%n3Vv5e~)Xj~j+;<5P+N3V;D1Aq8|PbjN&?i+$4UZmGW z#R9gR3*1J?%7-}Rzvvx7Cs4U7`T|rmfMPt0AtM45@sNlHCwN{^RZ$Oa3WJ9mI>7=j z!hZe#p8*b6&^}>s8|G4Hh>Ae>jm{Vq5l{{=X2^qG`5aXW;Mo1ZwcKu!D{Z zZ9PyS9*_}H|BA@tjAnbBp4tqanQgaLwAV0Hcz*YJjV+^4b}H0@^MOEykKbg3-WPyh>Cy{ zq@M!vy7fi=CeRMVEQTy0$S&?+$P%&tmoo~ACRe{#tOvDEvKYHRgn=3w;6!&hixJEL zC%Vhsyr5+HV)f_$|NlcKb43q;tm{#!VT3NEi;s&oKJ#LwIy?)2n`g~W4m7_hfeh;$ z>2y&k2nMZ#?mid(qW&CsKCWdcXs2~X2dE5qdk54rW62OuXJ7zr8FOOD*Z~s13K8!< z_re>jsid^q7POc!iy=!3ImKNEO?877#)6VoGy1|K9eoCdZduTZgdtW=y%h1M?9|Oa2R*#KNpiu}0HF!P*H*6u1eF!v6=c7^s z>P~^8_LA!44WC6OZ}`euk1I~~uOQ+y;{qt^cyD7wDMPUn!;7!r3450Ab1!~h2I(Ow zO6%ckoqco(gf7ya_GxH=OLmlAuh$`9D=1E(QQC)Q>x)(VDM@_ zf>L^7jZzz`S!?RZ^o z{=vrIstl^pK&lan$}klD1C>s;;N(>zk|6<#@y|EFDFNDM2KyJ(^ZaiLDp~&5gZrPL z6Rt%vOhC$yqA2e^@j~PcXhj0(DA`3|!@-k0kVzl#R8My`N4GN%|C-|>;b8|~h-3tS zOsNN(!ejlf&Qbec^M8dpt8P=2&hRx*7xT(>r+S9};0i1_BjK6@c$)pc=mG&JhQ%O1 zK-~=Kj3Ad1pkorCfdeijGBQAxa)T`eAGieS9e^`jc$P|UM~fUNNYju)3#04KG0>m^(l{tTgKnMfLl@T_^tS z=U72P)+cJ$#y1{h2>Aa$?j>l97CgWKCqUigQMle_E*qTOu<^=M^HF1 zyqNoHvf*#}`cnQh(BY`Y-KSq9zWM+Ewbl+$LoLnvM=1{|)TCc@|M~y_wa5-oOAI8+ z1rlX_arN*2|E;(ATYdh6rhLEgw>tj^t-SH&=)V3U^B*{ufXiI4wYC-@4}y<%=q}~x z2Dco+Eyb|^_1C*&MXV2(2!I=lVgIjNALa+IndmMR$YKopFDd})O@LPMhy51?Ed|M9 z{VxjI`3gSI@sI!mxYPRNM+Rs?LKeddyK5l3K?{gHGa8CP6L~rikt~6X3B{mk_!5bX z1;wC6oZzED>KS%`RwZ>m1%+&eLkV00S-hJUG~3n9`GWD)|Nr2zvWy8OP7E(DT>&+m z1zx-YwfjYHfEJ!8FfzOdfNVxy3~HN!E(FOCC~#tUvGfYaWh}4dGZ+*=C+`KkaL!_2 zaB4on^TK<}|Nk%4Ui|<6;^I@#j!cd$hKvh$z{xrdr~Lm5lAD^s7z?J4 zFirr`+rt?dqZvW0>06l?H-Z_N%#0^MjO`{Yj1G*97Sl^v8DnF*Z*_kR?{;SCbQ1vW zqh)LU!CC(Eze=mfD+h+|%iZT*X#V*BAGE+$4m9X{?l@?dE5nNv&^n|8{H>q_(Cy7) z?ajg8@)xxDh`Eb}vE@K1U#FkIf9L6XY>c|R`#>kSbvtutJF{r-n{4?{p6P4mGY`rU30 z%@3HHPcW32!xuSr2eViQbMUt)LR`Va)a%69={$WK8>3o1$cQ_j#dAkkntw2s3P3#Z za^}DP|961S*aQs|g8kYK8m9ljSo-cb8%Vs{nMK=8fZ44AYMWtqFbA~33|dcWeTu)O z6XZmYryV=JSy~R1uGjVxVD_tMe#qQ>lA-h#*i_?(KmPykoz?+5

zdPOo1CD5x2& znMxa>OSs;%6u&>t#=*eA5D3-k7{Za;W9zIC8_y_b( zk;4=2J$GPWdEvm|^}>N+#|sCBGcOz%L|!^DIJ|UV2zlwiaQvkM!`qh*(|@xwn)C09 zV_?WK=yfXqEq7TPH{FqgQJqm_dL{>B)%3%hjOUrE(xy-0Vl-iLN!xyki&2(~QFZzY z5k@VhT|v`DL>X%txu;JOW$b5q9W`B9jM0&~=9k0vbTLLACZ?GY(@P~7mn)z6?!d70 zhXccb9}WyRe>gCF`QgC8^V5Mr_oo9x!A}PU|6dN%?IjugctJ%EXxl)U!3#;2>9Zsm zy)s`s2IUjbCUUmppaj9t9m|ukfrWwL#b)qQNS5vot+z{cTEFqP1c0{KY2-67bjB&X zmZ5T=fy4@upTi0|Ta^WwOL1WY} zWWijHj3*^d4B#V7UaZ?TJw%#OQ(mk$^hWo&7dD{de1E)7fTc-@sM_1CWE8YiQy$DXo;o+i1i<|j;aU5`U+yL0kJ?wru2F;toiG}aQUwT!{I*=dh1^Y zhW&pX7*0a5H7~=2=`Avh3%Fk@F)(C_#dR9ID44D<%cx|t2PB~M`l9iH*VjR#44{Q^ zy8lZ#K(&3sGSF^61@MxoQi-q^6O=$J+n~!`Urbe+-Yd%}UJp{$dZ1MH#UGGSaxa2F z=Y@c(i5I=13=9iF(vgv^-%41z&%I_gKIs?;uI5!h{kkkrQh>R@d$YOjUrp~|+nZe1z zaNxyBEe3{2u;#`$D$EQFS>i9|`~=zJe z`T<1RzNugA#E{k_DzOAa@$!Hv*%x3z)+b;}^#PdDy|dVfVNO4*z!E2hZdZoIEMS^t zF~<_n^cTls5fH!i&Y%DPkFy3W1}(y1WLOB2T+FlBiQzaa!(t}}kc*GAvVdhl-7bN} zP8OgQU<_F-5!nYAjyH%bb^=YuLiydipiPCHKCC~oSRxKSVCd#$nE*N$fb~ZPhw$_Q zc}C^>sXrio?e^s$>{qZqsOHrtfByfsBEpAA9_;qz=xShs&hryq;8sK^W_h7!SrH)c37w7M6RvcJgIW?<-K>vm&_w`N^4)rp}*wA+sZ zBJWsG%JJf?-t^51jHx_dh_QMm5IV?cR!vNsNpM)7L36#)$4%xDMu-L#)TQv<&_ylrNL6ArQM+%t(Qv0U!0PG8x=6!Uzu?#uO>odz4Y{t z%8V%@>BbBUy}lp#xBuYZ&ej{v6d3R#WO}9wqr3c4Q&5>D0zaIu+ed|?+eL*XJUFb` zcF&sa_Nt7|Oj0XM85nxq|HnngAMQR5BC~ih8Y-L^UL;PRqt58eSU3HFI-@CQ_xOv) z;CVov*Ym^vmkI=jzX+bLrNJo0|JRCv;V`H{SoEEk+Bb_r}vXwHaqK?QosGOq)@Tv26NLZANX*dTX$;E4`=x)MhMT zKL9eP&un^u4x=&WJTtHfcMYen(P1ijQZ)cC*k#ryyNU;GMXVCe3B z0P4Yh=x+T0Uh5&y&C+^e&2&dSMtvF3EgGOj51^A;x_iI8|NlQY5UQ17dXFBXKjZA_ zck~#Qm`<#jrq9?R1F|Cen+qdL13&1TK!z-)V5st!LDQG$Glnxw2%7#^pV0y2D0>4& zL%|wQ5AOG7+y3QPOmj&v|&1@Gkv!qqXu7`A(C#k=^qUl4fG{JYk<3dyf_{X zS_|x83R;-$2Hqzj(0ZVfwfX%2*TT(pG7KfW|I1`vR80>sViaXp0GU3?V0w-bqo(K@ z0|th}-`sc{O4ypyco<&4343v0d-^IPMomWL=~s*xt(Y7HrwbS}N(8wGf@dgO50nbR z>I+3)28KxE1Fs#K4+Ol(jRs}K$kqcTZ~vG63CQ{nu5yC^i-I(Q7FNS_z2;$H_;2W?;zh5prV4FcETMcyX42fguu9^*CpQWIHmvV2NU2IL@MC z08*d>Qcwo&QLnk~1X5QbodIIKI1~;s7&M5+l*RC06eMbVAolR|$tH}F>IR@%?nBs% z2p&+7%W#9pS5YAHADBD~CYh&SHepP!R|^HD?<|fN?O|YsOojs}@K@_HFl2GO-~h=s zr~YARwpCc>#K6ekauU>rVf6rU7#JA3Tm=@nECVfV=V9P)1+DA&Z@T5W6GOMD323tW zTKA34*ek8KOG^HmZUE2rcK_&%eFC~6qxMeodzQ{x+dJ03i^4&E0J++dz2uek?;`jA z=KrsCe}IX0vj4w^YAonB5|Dw@znL;BNF;zlD*zN)yZ`lml@uCFe8_>E}(4-0I1h^88ERGj(Ako7w&go1qHDjE|bYRVNQFBIh{uv<;bu`YPy#tqdJp? z^z>p&Mime}(~?m}6=YbiCxgDUBZG{zBZG*vBLk1LBLj=HBf}plM}{v_jtp<4rr)w; z^bi3l?fwrkJwV!#Ax7Gfp+I`NnH6J-%@r9(hVK90Z~j;5ZIN+g0QD!J&ie^*o;JvN zH$c8p=>;jC@B(Cyj3a}I%=BwkjPguZWTt<&V$=Z9iq?z0Pp4bhF{&|L4xXN1$EeA(Lxq6>ROC0?25gu< z)s9h{al-V2c8pq#hST5JF>Ynj5S+f)o>5;(3beuKDYymK?aHw@W|^=xm{NFSM+*~#hoc`T`Q9&8Ri#?ph z{Gv0Ifg!T_2V;q77W0c55U2G(seH3-#2ChP$lt;b+9=KZ;$sN7_$lQD83)QGEubwEjsHMb z#__i}g8EQ5WSkf>M3@;EG73P^&>0SDQScbw1|1j-+HMVAu$!@HnG-{B+Tv9!KrQ|V zK_`ZNzd@Hr9w?R0;E@HL=m=7f@xlk98>AOx5m?)c$>9tP4w212Y|2a_0!`rzpmP#! zWStm#d0cgtIWcq})CC!E@rU+@u)r79U{gdurfdN1sCAKrI&mM!iD56QruR89im4@o z>n6|^+S&{O1xAL90FX;wyawy$c^#hh<-cf%;Pg{YjJDRLppXgZZRG$hvVk7R0Xk$4 zygT5;&Hw*FE4YF|;Kduz_9f84Ro$gL;bAZIraL(^W~yG3Vqj=KpkV!>gy+R6Fx$cU zLn(LoixZHlqm(`Dh2ZoH&WzejOO2=hb!OC-1XcO3S$7u9abo!9$f8gplEoAp9RA{w z{d7kcMrB5u?Wrz|VT?>xb<_8{GTPQJ0o5F!l(JCax)XyjE2vdo!VapCF2o*={jZuM z=mc6Czfc7(`@fWoX44w5tvk^v>cFeS}zTzXyi1pF7R z5uD!R#wf{Q0M#;mtsA3ceF`XbA8-KYp1`nf(~5~s46WZPRToYHDfx>FEszCDrI!*1S>Q?(E2Toe?Dk9>~L6k#vEBta%uoof~Me&EI%@K$bye^h8UA^ z1jJhm3XlKSAVT#SXTV~hP=JYL+yD!Kd=3|S0u}=K7B0jf=fn`c7~~tckN{Z71YF-i z%+F8(3t1ow*?@&?z(Vy65$1G3N^uuu!K&=0Us2eJ^40?0=_5TSZ-zQ~XP zi%o!tL4*vzLZDO#3!cR@KtbjJ5{C(8B!GB}=OAf}U%cSD6GI#*=YcYtXaX!FfO(+P z4Zvv~%u5iE1znXVngLS-YWRROfMsI@r{DEtjAEQN-NK78lyTnlJ}*Xjdzs7s|Nq|x z+S~m?G8xo1>~^bZJy0TUDN!mM@Z#Skxa@bZ?EkWg7cUWl_olz`VpOQ#d+GoG?l#aY zJot77?c)J2R)K{;Gx;Fi9IzJ9faHsbmq5eU0^Mz(MxO14X-*6!(v~woB`L_ld&vw8 z|F?mpUSwPXwZXF3B6{b6hHE=rIeP148tZ?o0BMo!W(TbTYqnr0Jx?+J)EE+qi$YsC)}@~M5(zhhoMB~MF~i}AgA?PDMyyV3$5q> z|3`Kodof9jf#Gl#&x@6yz9y)x``=V##`GgTjA~2|?54l*VYJi%_37Eez@yHQ-N)lz zGZ`O4CnC>h&E8prUhO3xsNbP&Hr*G~o3{ zpx5_97Q+jb%m4p3t8M}H>_J}q@vl_qI4g(?+Rgl5v`5g1;k8clkH4tG9Ux)R<{y7b z1-e~7AT)G4ur$>EVJKnmo?fw)k#{vRb}Mn%TS)2;j%4H+j)&+%iFWSSs2 zz1@#7k5PX5H$O%NrbVgKCHxuH7^|k+`!lXqVLA(`y0UmO7JvelNtl7b_*-Y`lNX$z z6B2%aLUuY|0Ha*Js4yt(cwgvPF)&1Smj3B3&*&_DVr>c@=rC#hRwB`S;{ON!gKVYz zjsH3(J28~7hrP%+`~QFBLXeV9_l$0^+RoA^#s?fg3Xi*jmaP7N0lMYu^~CPdCt18N zEI{4$!&w3u2SBcg0UeTd{{M?qR)*=T0~j@#9@==s5jP0HZnw$QG`^7xSlU z2Qn(Uf}8QJk3by&-WTkaP-i-`ES|H*iJ{w>WAOqI-3(ebvv>oDd9KsOWRzr_IDK^>qm=d}CkD6IPr>eQJ_+(1N2xHFXAALQz>7zx|NoEd zlwC7*`iDS9+4{X8TMxfh2JPFIYy1sS75ri;NY#trcmMw%X8;ZRyk;`~-+lZAn;^9D z`9=Y<HEZT z#)hd*4E!xG7#J8Fn-3UF?+;?s&~5?uT_N{A_PV|Z2>vfR0V>o4Y7Q}i_F1?|ga^E^ zoBk+>F@#ZRx_L08vKc5bmT-r?nD^`d|Cj4Qz0ni@UxMyo%RuN@C<1QYWxGBx=yZM1 z+i+m&^a;U?YK&8-Zx3cP3dsk}mKV(WDZbnHPaJ5A%E=RuvFXltI4q&dsiwO{}3z+Njq7lON0CPQF6oI&nb@ed@s!m{`m=_5kp)B4P z?@d7M@YFvH-F_LZCt=xvv6R2@CnOyNzAyzTg(drNP(tN-u>+*-xGSg~&d^<#)B3+e zIs66xxBvemt!=?0j3SNyB|xPTPqRHkDSP;fnP2|@uaAV8BF6yg?cY5P>hbvVGB6xs zVdyU9$l`r*+7#5u2eElx><6>MUI>AvrapiRMS&L^?}7`(xWk|WB0&cP{5M@N4RnLX zi~rzJtH{=GrS2Jfm_Z|vFBB|5J1!%=lY4vp6z1s+<^J#PEPlapXAe7Gt0~eSH|C zO8sOfhUR79i}kX2Uo;!T!qY9I`}_y~gB&nF+c7XOWbwR60x9UM{nPEr)9IGedZ3hJ zAt=B)-E#hy<-9of>HmLtD2al`T7`KS7!Di%cL#+D?~6WAxPvN#Rxsm5_}%|8|6hQn zh(IR2NM>MQFg|cN!9DN536lqYP zeEtXGfdXavx^PB`%xO;G8`Aj#UigA`MDcG~0jii~B`10xvC z7!{{?L@*jKx=r61!RW@*_#9RayWjfswphJhlGVEqLGQ5}%UJoGA{NrD#&kLhx|Nl2z zD3xZv(0KO$f2YLjq;7^_kizNdQH-+Of1X05O<#PP-XFy%E_v%I$TB4c28P$%FV2EF zpu+M+@bvvrjN&}25F!TCA4M^$)Pt=AEl+4ZBGG!FlKB`L1IT8D7l~k{P?JKy9I#2Z zp8Wq0y15+OAZu3L1FDRh-^c_T-*)DdeK7-c-N*}vy`Zi;e+y`xv+>DJS&$;*1N@7^ zx=leU!h36!+WvJP}NYNzRo8Png# zFp67)L_niVAQ2~q6$&N7&F2PCj|L^wXq_yG8TN%*1@@c6w;ETaY^Gs|_S>G^St z;`J=oofxuM0$#)$Ffc4;xb6fQkd(_}3F|Zk$-Qtxkzmb|iikUGd}-&08BPqHJWS08 z6?%hM8h;kdc4DYyUkEbb^$XCJuow2q3=9pnpy5G=64nOiyluej z={@m`N=y=h(>KI3YI93~Rb>fe1XN9b7SE`_2l4`cFX&njklUtW~ z1rnLQCxJ0SyJ7=q2>QosMz;n#g_2)gY&MA{x;8~6N;c&s;xA6$2PI~3stdfo-98c2 zQ|D2gK0S%ifJs1g`pG0lStbe9=`TREit2RsWX2$-BWtEdCo`(a7q~bwr2IDpjhS`3 zs0eiCs0j4ts0e632o4Kh$S`60f@H=>oe541$6ddG8js!V%|HH?@OJyNFrPE#F?bQV z^Z);DcaCm<9thua=XBK+#x$ib$3P?2@);odg$nqx575PXe4vRYj{l-xjyX+Vo5Co= zIAQv!6h=qJ3DbE}8Rab{>K0Rkoo4Y8`G^a7)_=6z#^}CEK7NcgoXUCPn??_a6-i~8%J66?j9 z>mUm`85kH|-ezE6X#K|Du?KW_jOmACPSbNU8O41;ZsgzRV!_hF(K# zs^TC6I$b0+x?MkXhDhpk`+n&b={>P#dUH0THfV-vLpGy`CrDA3i-f8TSBZD)w-Wab zCZ}$eUXZ9?L#;4l7E@>FllWsU5~^IK+E9ru7YQ{Rt`Zqge<6z*reQj74x^$NNaHsb zNtT9^LFUkXM$(BmM=5OMzOmE0xlotgl==FV* z#Sj?wzw`-M=?j7BTXGmxLC(FM!#G6~qy#DfS{+u(1u>)bKxs{L?Hh)YGSDU?mZ>M! zOrMd3~-e`)%J zJVqIi@^yKP(h?xsy4c)0TqISyUB5K{VlL(D<^fIrJxb^x7uK#kCF}t&{!I7FXRHL7bTXfDJ=kl=?&brzdwOpHqZCNV$^u3;1+ZnVKeD(w zTqIe$d8R`6Kf#uRee}M7F$JVLw2)C#64cnsVvVytRx19Y_&g};!HLb}{PgLCjB>&v z=l}ojw0Pl&kU2j6L?NR!DC^*vFIf?aZ@vU1I|18#$(|7Ke94Yb$b5+nh&~hI$nYb? zkwGRDGGDSH6f$43B6K=RMPPijOL-_VXWsIqeRue!aQo!r~|BX>fr0x^oGGNCESbV(%Rdk>d z33T?5HMm4dtY8$^0L4ALMB;kkbmIU2W(9`VSz#}Bf=2UE3maYsxOp!aPfY)v$*4U2 zZ3QE{{?+4P>zEMI9iX$JPyBze`PKjbpgMfV2Pp=I7oaUypn_ewlF?Qq^Z5V&iUu#H z9S6A)RK&fIIX=Cll2H+q^rlxbstEHzR9GWa9GrfxlF?lVfS^yDG-hOdf*McULp&A{4$6nEtt%F$6^*sD|;j z3CM~L7cLWUQR~ET+=U6WR*~VQIOw84QBbDn{_&EF5p;a525506IJYL&G9ExNN~ex7 zjJNs_$cNxuV{>SFe;wm;6g7_ZjITfr(`{h%K#^!@U{qszA~1bL17m~?=(IJ^5&+vj z|NnPyRd@>82=~(c@BjbdFAh$ZX=IeP0=XCzC=Ml@4OUX6EXD_3%e>gQA7r--s7F%- zYF#OS?reI^qW!V^7<@+J&-B7Z#=T4%s-_z>F{&6q8b+YgMM2FMhHjP(tp`eCzd7(U zmxKp|y|{b_)SH0zK|v~}w=^*ZFf&|tntr{B(OUinC`G0|Ku?hi_JWhh+3AMO(7Fd( z`U?kLAPGr-=R9FOI(TKr8@dY&-KNtJz(R-5enu`|J2N=Cj4{{ zObhq%*OkHDvR?$IYqv0JvV)>9;6>B)=oUt)hz_tSP$FzT@&C0{_p#<@@&|vg9(=|I zUWMVr(2!!l^0(XdLp1c9G>MEKAb*|*9jtope`o29&eA*GwH(d=|CLI-VA})EMK6r@ zOh4PgC~o)Rm=gnk^F&a8`uM>gtevh;y6-nXmOuCyW;*{q7YR_Cprj!Dg_Q@)->y%< zmQPn|WmMwbxf|w>7gf8b2evZmi+F<0SXW?pQHqfIJ$*_mqZ*U*?&*748RgVLS1Ev2 z8iVQp(3?+d(#=)7=4)}s;39EF&fEEaAJ7z4dkyQJk2Nmzl>&LU|0-F zTb;I`7Q_5DMpHfz_w}(}*B;2k&7(F(J0*}OYZbB_!e1O_2M;`-==8nQdXm2tG>+WO z3)1V<&S)h20CZAO=!4b+B{tol(CGdS3hQTV%qF1vZely5EK~me=^NS^Rro>HFoJAl z=w{h^V$Jl&?To>otZdQ2XeJs0Uexgf)W`N|Jy7BSx&u;RdUFS(xpXq*^3(rr9IvJL z_qnm~ICQwNbjpDf>(vfMU3rUYCx#cLx6sq*hV9@)ba%R9C!>Tq$V0`|-S-auX6^ph z{9OLvb2eyUfK*^+Z=asf$tVh*e*5NP!NOR=9rhvwG`P|I<2B!l!tK-hIvI6^`5-1+ zZ-+*E7)tn>>sS~|IsThL6gD5@X#5A3eiRQHt*Ot500k}wXrG8J zXjYn`RN{sBw*UXLSUX+5hf!Sf`7Y2*1rNf(H;oU(JAkKRx?MT`n;Zo>7RNTb>-(Shg64wpz8oZOJTwx3s^u4SvFjEnr_#}n5zUg8a&Sf z;`Ms7bTSA27X`6F_Dw(A$7oV7=K@-22s$R~f2pb^tHgRIhBDc(7d*TF|8G17IxjoY z+7v9v+x*$2@Z~sdnP%V4IQi;wF*936XjdP6^>Vi-sb$kyszxNJQPu{F&2+y8B#gaYwKXB&v!e2k^} zpGMI$P|C^J0SdA1%m4qsm_Ge`Kciw`moo#ynT*N;M+S(V#WL%izzZ-yt11-MgJx3x zo9e6wrD;%Dg4!7%8I|=;42v~D1W0bN0a#&{O2&=q>6sH4E#;Yyfp!sf*4}9SUn&MF z;*uB{7>>I>0qI+)vVQu(35=Ri!W%%z4^$((n7RJ{|JPfNyFLLKw-7|UmOAeG1Z2ZP z5b>Jlxa$*;Eek<}@oneM*ardsML|yLbiD&!Ap!0W9w=qcVt#REy30gHSHlykP7K`_ zJ44SbJfrHwznDV}cknC27?4hE;r&@{(M|YUkt4&4%~2VH;xI!a`} z$9g9Q2SFfNsw^0$MTQ z(R`eR`E!FEL+J^Sv=c+v3-Hxis-U$v49)5c#s`kG?zs+HV9dY}866*Y_`fO0#20QL zBUC|5aI@u!@qqvkc+tG_|Nk?g-ETm#odH{2)9uR9dZ0qF`3F-SZ}Sgk`%>|4-hd5G z46nH%^kNXF`(W(h7fV*c<5p`Wc#sdADVpDiG^c)HXiohBy82{#-E>ANqX|w7uhV*6 zzXbdjJpl?U*B{2NUpig?fCg!u7z{y-GXh`+z*fJ+~Q*DqbFt9x7+>i>s}mNW2~XU-SUTqQkE_p-kfg(Q)yh z6(eEc#{VtBbBm>{FGRNf|KAOcIZ)ZNZ-3_WEi)KZn9{AM-nz6H`rAwY|Ibo--3Fdv zQ9;Z(b-Qwa&TJBNVh9WGbbVs{t=p9+tkdb9S9swr?%hER`vRNz*FQ0Dqat@<>a!LbylB?U7qxt8*Qr;I27lRTns15wuqV;5j ziZ!Td#ZWBMeX#iI4cu%5-BaMg!P5M|A@=Z#HE>NYj28d@4_es;+MB?7WX<&K zxr|Kqt+;Z2t29|AbGCjto2M9U0!#J2E&nI5JFXaAcU@;K=Z%!I43{Y5J3u zjIWqV%cfsg#b_@Ly29*0^GQZa-V9J$opJzFgf_ns0QFI|Rx`>o&YAADno%Fr=B!@L z=nkTftY-8C(fn%|{h30iPfu9GXdrkLw0R>Ee(>zsg6Rv_FxoPumP~)JhA|p6eq+0q z(S*wdoTN(mUNldyUd#BtejaGvJK)8Qe9+vQn}9W|1XSc0L`1}zRR$`u1tKD0&8h$u zSp*T0v1V0)icElrC|I*&8Ag3F69VA|uw8!+wj z;z>Q25%A&;m=1Yy1x!c0I0L3*UK|0_2`~15>68~+z;wooHDEgD#S$=G@L~>_E_pEp zOjo?<0n;@vT5=(7*akWX=tUVw6tXfX8_eve2aO6OfZ3oC=og`2Cg@1L7hYf{sOR>= z9?S%-{CQylW`bAqXo8ubg*-3hz)a9Swim)+<_eIx9AM@S5c4nSw8L$nq3{=kAVw6SV#3g(jE@YE`|EgSi=W^7{(`umley1H%heFcY+C`^B$pkZ(mmqVK^> z3DDuHFP?zeG9clbV5S0yc@E43?K*sM7|hfFiS7V1bwJFuV5R|xxd_ZO0Wqh8nV@m1 z7d>F64M?;R%ya-T%fL(*5HmabfBgUEBM$$!d4RaFU>VRf=8GUO6SO_@g*%uT0#aZD zW`a)Ld|?P?f-dlUp$29qfD}k)gCb4_k_`g`K}D#;X2xVt;kR@%qc!85=?^zE3N!U) zP5-u;Q5Phvx`nY*j8Bn)q5Dhgx03YZY-i3eFuWEHc(Ffo`jIV+exOE@$W}%LF^ddH zRRC^@2>dVQ==J^Z;@5Pqt&IMB8#4a?hisMuTe*BIqczCvCtDef#FoiJ%|3%LJ3M2$ z&NfDK7f4xLBJjUdA^?2swdf9TyCm!dBdDL*eY`jI18CX`e9-EhG%OC7movamMuddl}y_ z&e-0wkFgk08M7T=RMmmj%uWpdFGNN*?0x_D|Nrz-nb!ZM61}aUOZ)=D{+oV)D%u`? zfN>V6lKym%aUUbo%&6&`4l~;F@YTZW<|)&EA7)fj_l|@F)r8w~92p+Za%2#n?Z}Wd z+mT_%Y)6KpvmF`u=QuJ1&YkXYgwcS>x_)}q5ymf){nfBWsaW;@|F0uJPVoKkVqf(1 z_M?o3ysp(CTeLtq)T(;=(W8u>prj#ij8O_SJgReyQJQC46{xWan!2;CnjU5*GK)+9%EbL~1l)%0Sb)kns($ z2+KTu?pmJK|D{qdd@Ddf0B(U@p1$V<<3pxp;nU}zWRz!O6`6kEB%>UUd^udj((SKK zG8Qp%{#fnE0P5cFnx1-^QJv{Q;Pk%JjK+KnYfxrc&!1*2Qw52Y3UmkZbO-TR26B|L zg71tu92~g2U>>Lo1!hdoI>Y!vE}_PW;f3n7|NpydIk1f26`W;MVeFhf^(>>Z7AO%n zAK+m=9srpSH$LF-;_KA^{||T9a%6G6DBkz~f8^mTi42RH>5tAbI*NeQgIfLjK!*y~ zJ^&B5O*cQsXk)ah0vtI1-8n#05-;>YA>?|e^+2gquR9Oa^l$Dgj3tT?zJ%cPrRNxR zK#_6z9HXHC$mC{L(2$-2#8i>diwwKjFR;m z3n1gbcMD)Lubo;?R;WRn>~fe*_HQm6EQ}?r-7FljhhG#ywa$g%~P)6Gb5;8vU+Bf*MLF>0tMz=7K zA@vL}Q$B!_&5hRErE!*!P38_^FJ^-pudN44WSjpzC_5eYq8r42Ap>?0Wb`vSF81&X z?mW=Nju3waybu5>>STNU=*8z;Wbq%lpfOUm?!&K7g?7JzHoB*KM>Fy<9m<^^9nGjH z3-J$l$NP!alcieCwlhF0n@U8&UcAknJ~Nt8DJF~Q#l{3s)_gHx5BLBpjx4bk>-PNr zANh^7VV)BMQ;A}h_=`|i28PxHC9GNOk!Llt7&Al}7#y;gUxb6(0X$jEFSHXOqcqKL z1VG^cs8MCKLUSYIVHSGHTAGZBP z70iZie^CZ4i3Ht07WN`%di51XU8aAFrmwofs12S#$Flv!divWdjCxGni>Aw7Wz-A^ z?DbLM&_2=pke~UW^hxf6kuSYA{QnOZWrvBHZ212l+}MzK5m5*Zf$$6ye_+1D8}RMWnK%2l3DcF=KA$}il(nwt6lzbMQArD4!X5--xGYusS$ zN&#hvh7=B#f3QTcGX4Mm$QMV_|Nrlncv%R#>gc~HXtt&GK&ewVfA_(IKUhIS1n}_z zB+cC)!d_&7w1bvIhz5Xi)wj|uFDj;s-DFf{I`VD0?M+5mDUgjFAsj52hD|TI$!KWX zvHJi2?h~D^SCmh6hQ4V&BGCNvf2rh)xoQ9ZH(E3^Fffz^|2Kazd;S0aFF{Kkvlx3_ z?{voA3HWdR;zR%RM>iR@85O4U-D3PMrm+fC+zW6Y;%|8hI#4zkq)~Xf^le5drrCYd z&2KY0tGrnY@-A;GG$dbcXJlY#{0Ta+yVNT)v710M!EFP`dFBWW~z5JB+G~0@JVDVbrRJOcZ7$|NoEaZ_vab zC(N-KP%zWNm&VfAA4oHxGD;OD79g_u-chfBpXt+VvIu;!YAY zYuJLf=!cbhfXfx}7fQ*XXa*NVE0X^I-|_#y;{W>BcFnas3?+~Efz}9FmI{=Ky!f32 zSJyaw-d#pJ#_!Yb-er{InS_v#n9hEWF)s^TZ2vFe0j>K24P${~_b_NAHH$eQiy3r# zx+`(9`1j~Cg?{{Qbj)#>^|`Cz9n zIEsJ#FNw@z3JVK=;XnQUJw{V`(2m4_|DvE0rqdO4a*5=Nv_z0=L8aM?=;_Ay8EqI1 zrWf32ROCL909w|`TFU+6)ATv_85QlJnnA~WyiRL9P@h-B()z7919U(Y=y-$h7ye8C z|5rW)N?Skv^S3zu|NlSy#WK*+;(-66e*~ugxz8vqT9yE^ju+HkG*5sPkJEJ?FiJ5! zUozd}0i%+*GFS;XoL9z!Qcy(f;e`zwrZ+x-EaqACfYAq(Fg}1ZomexS=OIK~_aWnA zC1(5o|GQ&3_JjI?*7u7Ox_w_XSC%l=iGUW+XE6r9aGU<=A!7#9=i}339x+NYicPP0 z#Aw7QH+}UZ#yF-OYo>EQX4GYzFx~PoqXJWv?eyr!jD>;*mjA)~0>R~u2B`aV_c5b5 z9ow-g7lfkS9 zbDbC@9y>BDelpjI;W+DyxlRms!Fu1!bz%qvD*?6acRmDZ`!d&wVaX#$hQr|HpkVu5 zkcNAGLGxbx+a0-#Z%^O%iZO}lz`X4no-!&ja?W#N=su*)dSKpmpEr!l7@3aDoBri3 z;{?7P^PCv?dq79ob@LvXH(lW+V=rio%J??3DM-rsXp$ai>)kQ~!KNlSt!Y(;7v|n;$cyY;*A^Wl;L(64HhUb?Z8BShyWYE0g z$RKyck>T^@>ASu&p0f1U096not^X^Tx_^V49wqGEz5=Z$OF3V>bqA&7*8;un+#Pb( zC(1=$+y;p##dlh~NZP*l2crNJWBm4WzZm5hg`cZ{({StU5;jobQqK9JfBOI5jI!K? zE})(iNXw7u>VFtZI70lL7y`mxJet1v52L?W3+VEqxDt^DOM_DWEaqNE#(=;VU#D~Y zWmM#2b%vH|Z*)KbWd4`YP*T+y+!9;w^#6bNvDYQtr2?(rO1WO}IZto=%UI0BAwT`w zUq*S^eMmOlKV!0Bv@9f~!HL=cCk0nOt|NrUzj7-u~_cL)Y@hD6^$@G#*QGWUsMy7sV&uRbv zI|THy*o6hWSUWv{iAjfX)Am{>rjLwFsWQ_GSeQf^H%)J2VKU+c7xblq-M$udRp5`=;`(`Rxq=`zlnew>RbhH=4m6>g?`?2NyrGYd0$Fh1Vy zBg`bk1oCHsD3d9Z>;h27pve3Gf6#h!CkDov=x$ez6%Hj{&9)~NPTwTXWT?2%iGiUx zm195ux=`2_j@Mkx5B7Jua)5+h_)TY#U

<`2?_S5eE;a@#m@DfLeJ6LYrPGo8B$MRKwIz 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 E07OTIegFUf diff --git a/INSTALL/tool/VentoyWorker.sh b/INSTALL/tool/VentoyWorker.sh index 9c6967b9..099b2d55 100644 --- a/INSTALL/tool/VentoyWorker.sh +++ b/INSTALL/tool/VentoyWorker.sh @@ -12,6 +12,7 @@ print_usage() { echo ' OPTION: (optional)' echo ' -r SIZE_MB preserve some space at the bottom of the disk (only for install)' echo ' -s enable secure boot support (default is disabled)' + echo ' -g use GPT partition style, default is MBR (only for install)' echo '' } @@ -27,6 +28,8 @@ while [ -n "$1" ]; do MODE="update" elif [ "$1" = "-s" ]; then SECUREBOOT="YES" + elif [ "$1" = "-g" ]; then + VTGPT="YES" elif [ "$1" = "-r" ]; then RESERVE_SPACE="YES" shift @@ -110,13 +113,22 @@ fi if [ "$MODE" = "install" ]; then vtdebug "install ventoy ..." - if parted -v > /dev/null 2>&1; then - PARTTOOL='parted' - elif fdisk -v >/dev/null 2>&1; then - PARTTOOL='fdisk' + if [ -n "$VTGPT" ]; then + if parted -v > /dev/null 2>&1; then + PARTTOOL='parted' + else + vterr "parted is not found in the sysstem, Ventoy can't create new partition." + exit 1 + fi else - vterr "Both parted and fdisk are not found in the sysstem, Ventoy can't create new partition." - exit 1 + if parted -v > /dev/null 2>&1; then + PARTTOOL='parted' + elif fdisk -v >/dev/null 2>&1; then + PARTTOOL='fdisk' + else + vterr "Both parted and fdisk are not found in the sysstem, Ventoy can't create new partition." + exit 1 + fi fi version=$(get_disk_ventoy_version $DISK) @@ -148,11 +160,15 @@ if [ "$MODE" = "install" ]; then fi fi - #Print disk info echo "Disk : $DISK" parted -s $DISK p 2>&1 | grep Model - echo "Size : $disk_size_gb GB" + echo "Size : $disk_size_gb GB" + if [ -n "$VTGPT" ]; then + echo "Style: GPT" + else + echo "Style: MBR" + fi echo '' if [ -n "$RESERVE_SPACE" ]; then @@ -192,7 +208,13 @@ if [ "$MODE" = "install" ]; then exit 1 fi - format_ventoy_disk $RESERVE_SIZE_MB $DISK $PARTTOOL + if [ -n "$VTGPT" ]; then + vtdebug "format_ventoy_disk_gpt $RESERVE_SIZE_MB $DISK $PARTTOOL ..." + format_ventoy_disk_gpt $RESERVE_SIZE_MB $DISK $PARTTOOL + else + vtdebug "format_ventoy_disk_mbr $RESERVE_SIZE_MB $DISK $PARTTOOL ..." + format_ventoy_disk_mbr $RESERVE_SIZE_MB $DISK $PARTTOOL + fi # format part1 if ventoy_is_linux64; then @@ -216,8 +238,17 @@ 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 + + if [ -n "$VTGPT" ]; then + echo -en '\x22' | dd status=none of=$DISK conv=fsync bs=1 count=1 seek=92 + ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2014 seek=34 + echo -en '\x23' | dd of=$DISK conv=fsync bs=1 count=1 seek=17908 status=none + else + ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1 + fi + ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector #disk uuid @@ -307,8 +338,11 @@ else echo -en '\x80' | dd of=$DISK conv=fsync bs=1 count=1 seek=446 status=none echo -en '\x00' | dd of=$DISK conv=fsync bs=1 count=1 seek=462 status=none fi - - ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1 + + + ./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 sync diff --git a/INSTALL/tool/ventoy_lib.sh b/INSTALL/tool/ventoy_lib.sh index 6fa869ae..9e4d45d8 100644 --- a/INSTALL/tool/ventoy_lib.sh +++ b/INSTALL/tool/ventoy_lib.sh @@ -103,7 +103,7 @@ get_ventoy_version_from_cfg() { } is_disk_contains_ventoy() { - DISK=$1 + DISK=$1 PART1=$(get_disk_part_name $1 1) PART2=$(get_disk_part_name $1 2) @@ -126,11 +126,15 @@ is_disk_contains_ventoy() { return fi + PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"') PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"') - if [ "$PART2_TYPE" != "EF" ]; then - vtdebug "part2 type is $PART2_TYPE not EF" - ventoy_false - return + + if [ "$PART1_TYPE" != "EE" ]; then + if [ "$PART2_TYPE" != "EF" ]; then + vtdebug "part2 type is $PART2_TYPE not EF" + ventoy_false + return + fi fi # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"') @@ -185,7 +189,7 @@ get_disk_ventoy_version() { ventoy_false } -format_ventoy_disk() { +format_ventoy_disk_mbr() { reserve_mb=$1 DISK=$2 PARTTOOL=$3 @@ -218,7 +222,7 @@ format_ventoy_disk() { fi echo "" - echo "Create partitions on $DISK by $PARTTOOL ..." + echo "Create partitions on $DISK by $PARTTOOL in MBR style ..." if [ "$PARTTOOL" = "parted" ]; then vtdebug "format disk by parted ..." @@ -300,5 +304,95 @@ EOF } +format_ventoy_disk_gpt() { + reserve_mb=$1 + DISK=$2 + PARTTOOL=$3 + + PART1=$(get_disk_part_name $DISK 1) + PART2=$(get_disk_part_name $DISK 2) + + sector_num=$(cat /sys/block/${DISK#/dev/}/size) + + part1_start_sector=2048 + + if [ $reserve_mb -gt 0 ]; then + reserve_sector_num=$(expr $reserve_mb \* 2048 + 33) + part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1) + else + part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34) + fi + + part2_start_sector=$(expr $part1_end_sector + 1) + part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1) + + export part2_start_sector + + vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector" + vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector" + + if [ -e $PART2 ]; then + echo "delete $PART2" + rm -f $PART2 + fi + + echo "" + echo "Create partitions on $DISK by $PARTTOOL in GPT style ..." + + vtdebug "format disk by parted ..." + parted -a none --script $DISK \ + mklabel gpt \ + unit s \ + mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \ + mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \ + set 2 boot on \ + set 2 esp on \ + set 2 hidden on \ + quit + + sync + + udevadm trigger >/dev/null 2>&1 + partprobe >/dev/null 2>&1 + sleep 3 + echo "Done" + + echo 'mkfs on disk partitions ...' + for i in 1 2 3 4 5 6 7; do + if [ -b $PART2 ]; then + break + else + echo "wait $PART2 ..." + sleep 1 + fi + done + + + if ! [ -b $PART2 ]; then + MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev) + echo "mknod -m 0660 $PART2 b $MajorMinor ..." + mknod -m 0660 $PART2 b $MajorMinor + + if ! [ -b $PART1 ]; then + MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev) + echo "mknod -m 0660 $PART1 b $MajorMinor ..." + mknod -m 0660 $PART1 b $MajorMinor + fi + fi + + echo "create efi fat fs $PART2 ..." + for i in 0 1 2 3 4 5 6 7 8 9; do + if mkfs.vfat -F 16 -n VTOYEFI $PART2; then + echo 'success' + break + else + echo "$? retry ..." + sleep 2 + fi + done +} + + + diff --git a/INSTALL/ventoy_pack.sh b/INSTALL/ventoy_pack.sh index 1660a50b..9f21bbfa 100644 --- a/INSTALL/ventoy_pack.sh +++ b/INSTALL/ventoy_pack.sh @@ -31,7 +31,7 @@ while ! grep -q 524288 /sys/block/${LOOP#/dev/}/size 2>/dev/null; do sleep 1 done -format_ventoy_disk 0 $LOOP fdisk +format_ventoy_disk_mbr 0 $LOOP fdisk $GRUB_DIR/sbin/grub-bios-setup --skip-fs-probe --directory="./grub/i386-pc" $LOOP diff --git a/LANGUAGES/languages.ini b/LANGUAGES/languages.ini index 926f47653e731905b45af22fec35469fed195d83..c85501afb5561cb5f95563cd29ec716820a87a0d 100644 GIT binary patch delta 3362 zcmbR8iS@x;whbLDj7F0mGKo*#Ajl;c%n-s5$>77_%D~IO#bC@}FqxlGRMLncgu#g+ zp23&Fi6Mv~p23wNh#`o-Gs}E|$uR~T(-qViML6NQCpX4QvIjGiFjO++OwMJ5aoo4xYY_~{?a%A0%Yo(zb8 zdwSgl#J}(6#0`jlGghA&5PJi5-JrL;wu$Mkb{ zj2zSDBp5|7+GP&GxSCcPyfJ%HTYLQ`K-y$2Wd|$Vi%xe{OgNqbYnMSZPro3|sI>i* tBjcBW$g$gR`7=Hm5Q}fbGP(?i#TMC&SID*4jm*9UgF3k11M2&LFaUp-#}fbm delta 269 zcmaDbmu<=?)(ssjo8Pg_64)Fj*2gtj1$1U7DZUI?SW_K0N0OJMGHfg(m12+OL0@d_^oF9R0?2m=5uf@zKb diff --git a/Ventoy2Disk/Ventoy2Disk/Language.h b/Ventoy2Disk/Ventoy2Disk/Language.h index 6705b86f..b365481f 100644 --- a/Ventoy2Disk/Ventoy2Disk/Language.h +++ b/Ventoy2Disk/Ventoy2Disk/Language.h @@ -60,6 +60,9 @@ typedef enum STR_ID STR_MENU_CLEAR, //26 STR_CLEAR_SUCCESS, //27 STR_CLEAR_FAILED, //28 + STR_MENU_PART_STYLE, //29 + STR_DISK_2TB_MBR_ERROR,//30 + STR_ID_MAX }STR_ID; @@ -69,6 +72,22 @@ extern BOOL g_SecureBoot; #define VTOY_MENU_SECURE_BOOT 0xA000 #define VTOY_MENU_PART_CFG 0xA001 #define VTOY_MENU_CLEAN 0xA002 +#define VTOY_MENU_PART_STYLE 0xA003 +#define VTOY_MENU_PART_MBR 0xA004 +#define VTOY_MENU_PART_GPT 0xA005 + + +typedef enum OPT_SUBMENU +{ + OPT_SUBMENU_SECURE_BOOT = 0, + OPT_SUBMENU_PART_STYLE, + OPT_SUBMENU_PART_CFG, + OPT_SUBMENU_CLEAR, + + OPT_SUBMENU_MAX +}OPT_SUBMENU; + + #define VTOY_MENU_LANGUAGE_BEGIN 0xB000 diff --git a/Ventoy2Disk/Ventoy2Disk/PhyDrive.c b/Ventoy2Disk/Ventoy2Disk/PhyDrive.c index 7dde3154..572aeb87 100644 --- a/Ventoy2Disk/Ventoy2Disk/PhyDrive.c +++ b/Ventoy2Disk/Ventoy2Disk/PhyDrive.c @@ -798,7 +798,7 @@ static int VentoyFatDiskRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount) } -int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, MBR_HEAD *pMBR, CHAR *VerBuf, size_t BufLen) +int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, UINT64 Part2StartSector, CHAR *VerBuf, size_t BufLen) { int rc = 0; HANDLE hDrive; @@ -810,7 +810,7 @@ int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, MBR_HEAD *pMBR, CHA } g_FatPhyDrive = hDrive; - g_Part2StartSec = pMBR->PartTbl[1].StartSectorId; + g_Part2StartSec = Part2StartSector; Log("Parse FAT fs..."); @@ -1154,7 +1154,7 @@ End: return rc; } -static int WriteGrubStage1ToPhyDrive(HANDLE hDrive) +static int WriteGrubStage1ToPhyDrive(HANDLE hDrive, int PartStyle) { int Len = 0; int readLen = 0; @@ -1180,9 +1180,20 @@ static int WriteGrubStage1ToPhyDrive(HANDLE hDrive) unxz(ImgBuf, Len, NULL, NULL, RawBuf, &readLen, unxz_error); - SetFilePointer(hDrive, 512, NULL, FILE_BEGIN); + if (PartStyle) + { + Log("Write GPT stage1 ..."); + RawBuf[500] = 35;//update blocklist + SetFilePointer(hDrive, 512 * 34, NULL, FILE_BEGIN); + bRet = WriteFile(hDrive, RawBuf, SIZE_1MB - 512 * 34, &dwSize, NULL); + } + else + { + Log("Write MBR stage1 ..."); + SetFilePointer(hDrive, 512, NULL, FILE_BEGIN); + bRet = WriteFile(hDrive, RawBuf, SIZE_1MB - 512, &dwSize, NULL); + } - bRet = WriteFile(hDrive, RawBuf, SIZE_1MB - 512, &dwSize, NULL); Log("WriteFile Ret:%u dwSize:%u ErrCode:%u", bRet, dwSize, GetLastError()); free(RawBuf); @@ -1372,7 +1383,7 @@ int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLett VentoyFillLocation(pPhyDrive->SizeInBytes, 2048, (UINT32)(pPhyDrive->SizeInBytes / 512 - 2048), MBR.PartTbl); - MBR.PartTbl[0].Active = 0x80; // bootable + MBR.PartTbl[0].Active = 0x00; // bootable MBR.PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS SET_FILE_POS(0); @@ -1386,6 +1397,9 @@ int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLett Log("Clear Ventoy successfully finished"); + //Refresh Drive Layout + DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL); + End: PROGRESS_BAR_SET_POS(PT_MOUNT_VOLUME); @@ -1436,14 +1450,11 @@ End: FindProcessOccupyDisk(hDrive, pPhyDrive); } - //Refresh Drive Layout - DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL); - CHECK_CLOSE_HANDLE(hDrive); return rc; } -int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) +int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) { int i; int rc = 0; @@ -1455,14 +1466,25 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) CHAR DriveName[] = "?:\\"; CHAR DriveLetters[MAX_PATH] = { 0 }; MBR_HEAD MBR; + VTOY_GPT_INFO *pGptInfo = NULL; - Log("InstallVentoy2PhyDrive PhyDrive%d <<%s %s %dGB>>", - pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId, + Log("InstallVentoy2PhyDrive %s PhyDrive%d <<%s %s %dGB>>", + PartStyle ? "GPT" : "MBR", pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId, GetHumanReadableGBSize(pPhyDrive->SizeInBytes)); + if (PartStyle) + { + pGptInfo = malloc(sizeof(VTOY_GPT_INFO)); + memset(pGptInfo, 0, sizeof(VTOY_GPT_INFO)); + } + PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN); - VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR); + VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR, PartStyle);//also used to format 1st partition in GPT mode + if (PartStyle) + { + VentoyFillGpt(pPhyDrive->SizeInBytes, pGptInfo); + } Log("Lock disk for clean ............................. "); @@ -1470,6 +1492,7 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) if (hDrive == INVALID_HANDLE_VALUE) { Log("Failed to open physical disk"); + free(pGptInfo); return 1; } @@ -1531,7 +1554,7 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) Log("Formatting part1 exFAT ..."); if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes)) { - log("FormatPart1exFAT failed."); + Log("FormatPart1exFAT failed."); rc = 1; goto End; } @@ -1540,16 +1563,16 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) Log("Writing part2 FAT img ..."); if (0 != FormatPart2Fat(hDrive, MBR.PartTbl[1].StartSectorId)) { - log("FormatPart2Fat failed."); + Log("FormatPart2Fat failed."); rc = 1; goto End; } PROGRESS_BAR_SET_POS(PT_WRITE_STG1_IMG); Log("Writting Boot Image ............................. "); - if (WriteGrubStage1ToPhyDrive(hDrive) != 0) + if (WriteGrubStage1ToPhyDrive(hDrive, PartStyle) != 0) { - log("WriteGrubStage1ToPhyDrive failed."); + Log("WriteGrubStage1ToPhyDrive failed."); rc = 1; goto End; } @@ -1557,14 +1580,50 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) PROGRESS_BAR_SET_POS(PT_WRITE_PART_TABLE); Log("Writting Partition Table ........................ "); SetFilePointer(hDrive, 0, NULL, FILE_BEGIN); - if (!WriteFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL)) - { - rc = 1; - Log("Write MBR Failed, dwSize:%u ErrCode:%u", dwSize, GetLastError()); - goto End; - } - Log("Write MBR OK ..."); + if (PartStyle) + { + VTOY_GPT_HDR BackupHead; + LARGE_INTEGER liCurrentPosition; + + SET_FILE_POS(pPhyDrive->SizeInBytes - 512); + VentoyFillBackupGptHead(pGptInfo, &BackupHead); + if (!WriteFile(hDrive, &BackupHead, sizeof(VTOY_GPT_HDR), &dwSize, NULL)) + { + rc = 1; + Log("Write GPT Backup Head Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError()); + goto End; + } + + SET_FILE_POS(pPhyDrive->SizeInBytes - 512 * 33); + if (!WriteFile(hDrive, pGptInfo->PartTbl, sizeof(pGptInfo->PartTbl), &dwSize, NULL)) + { + rc = 1; + Log("Write GPT Backup Part Table Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError()); + goto End; + } + + SET_FILE_POS(0); + if (!WriteFile(hDrive, pGptInfo, sizeof(VTOY_GPT_INFO), &dwSize, NULL)) + { + rc = 1; + Log("Write GPT Info Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError()); + goto End; + } + + Log("Write GPT Info OK ..."); + } + else + { + if (!WriteFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL)) + { + rc = 1; + Log("Write MBR Failed, dwSize:%u ErrCode:%u", dwSize, GetLastError()); + goto End; + } + Log("Write MBR OK ..."); + } + //Refresh Drive Layout DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL); @@ -1619,6 +1678,11 @@ End: FindProcessOccupyDisk(hDrive, pPhyDrive); } + if (pGptInfo) + { + free(pGptInfo); + } + CHECK_CLOSE_HANDLE(hDrive); return rc; } @@ -1635,13 +1699,14 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) BOOL bRet; CHAR DriveName[] = "?:\\"; CHAR DriveLetters[MAX_PATH] = { 0 }; - UINT32 StartSector; + UINT64 StartSector; UINT64 ReservedMB = 0; MBR_HEAD BootImg; MBR_HEAD MBR; + VTOY_GPT_INFO *pGptInfo = NULL; - Log("UpdateVentoy2PhyDrive PhyDrive%d <<%s %s %dGB>>", - pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId, + Log("UpdateVentoy2PhyDrive %s PhyDrive%d <<%s %s %dGB>>", + pPhyDrive->PartStyle ? "GPT" : "MBR", pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId, GetHumanReadableGBSize(pPhyDrive->SizeInBytes)); PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN); @@ -1655,15 +1720,38 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) return 1; } - // Read MBR - SetFilePointer(hDrive, 0, NULL, FILE_BEGIN); - ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL); + if (pPhyDrive->PartStyle) + { + pGptInfo = malloc(sizeof(VTOY_GPT_INFO)); + if (!pGptInfo) + { + return 1; + } - StartSector = MBR.PartTbl[1].StartSectorId; - Log("StartSector in PartTbl:%u", StartSector); + memset(pGptInfo, 0, sizeof(VTOY_GPT_INFO)); - ReservedMB = (pPhyDrive->SizeInBytes / 512 - (StartSector + VENTOY_EFI_PART_SIZE / 512)) / 2048; - Log("Reserved Disk Space:%u MB", ReservedMB); + // Read GPT Info + SetFilePointer(hDrive, 0, NULL, FILE_BEGIN); + ReadFile(hDrive, pGptInfo, sizeof(VTOY_GPT_INFO), &dwSize, NULL); + + StartSector = pGptInfo->PartTbl[1].StartLBA; + Log("GPT StartSector in PartTbl:%llu", (ULONGLONG)StartSector); + + ReservedMB = (pPhyDrive->SizeInBytes / 512 - (StartSector + VENTOY_EFI_PART_SIZE / 512) - 33) / 2048; + Log("GPT Reserved Disk Space:%llu MB", (ULONGLONG)ReservedMB); + } + else + { + // Read MBR + SetFilePointer(hDrive, 0, NULL, FILE_BEGIN); + ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL); + + StartSector = MBR.PartTbl[1].StartSectorId; + Log("MBR StartSector in PartTbl:%llu", (ULONGLONG)StartSector); + + ReservedMB = (pPhyDrive->SizeInBytes / 512 - (StartSector + VENTOY_EFI_PART_SIZE / 512)) / 2048; + Log("MBR Reserved Disk Space:%llu MB", (ULONGLONG)ReservedMB); + } GetLettersBelongPhyDrive(pPhyDrive->PhyDrive, DriveLetters, sizeof(DriveLetters)); @@ -1781,7 +1869,7 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) } Log("Updating Boot Image ............................. "); - if (WriteGrubStage1ToPhyDrive(hDrive) != 0) + if (WriteGrubStage1ToPhyDrive(hDrive, pPhyDrive->PartStyle) != 0) { rc = 1; goto End; @@ -1792,6 +1880,10 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) // Use Old UUID memcpy(BootImg.BootCode + 0x180, MBR.BootCode + 0x180, 16); + if (pPhyDrive->PartStyle) + { + BootImg.BootCode[92] = 0x22; + } if (ForceMBR == FALSE && memcmp(BootImg.BootCode, MBR.BootCode, 440) == 0) { @@ -1808,16 +1900,19 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) Log("Write Boot Image ret:%u dwSize:%u Error:%u", bRet, dwSize, LASTERR); } - if (0x00 == MBR.PartTbl[0].Active && 0x80 == MBR.PartTbl[1].Active) + if (pPhyDrive->PartStyle == 0) { - Log("Need to chage 1st partition active and 2nd partition inactive."); + if (0x00 == MBR.PartTbl[0].Active && 0x80 == MBR.PartTbl[1].Active) + { + Log("Need to chage 1st partition active and 2nd partition inactive."); - MBR.PartTbl[0].Active = 0x80; - MBR.PartTbl[1].Active = 0x00; + MBR.PartTbl[0].Active = 0x80; + MBR.PartTbl[1].Active = 0x00; - SetFilePointer(hDrive, 0, NULL, FILE_BEGIN); - bRet = WriteFile(hDrive, &MBR, 512, &dwSize, NULL); - Log("Write NEW MBR ret:%u dwSize:%u Error:%u", bRet, dwSize, LASTERR); + SetFilePointer(hDrive, 0, NULL, FILE_BEGIN); + bRet = WriteFile(hDrive, &MBR, 512, &dwSize, NULL); + Log("Write NEW MBR ret:%u dwSize:%u Error:%u", bRet, dwSize, LASTERR); + } } //Refresh Drive Layout @@ -1836,6 +1931,11 @@ End: CHECK_CLOSE_HANDLE(hDrive); + if (pGptInfo) + { + free(pGptInfo); + } + return rc; } diff --git a/Ventoy2Disk/Ventoy2Disk/Utility.c b/Ventoy2Disk/Ventoy2Disk/Utility.c index e7df557b..dc8491db 100644 --- a/Ventoy2Disk/Ventoy2Disk/Utility.c +++ b/Ventoy2Disk/Ventoy2Disk/Utility.c @@ -424,7 +424,7 @@ int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 Sect return 0; } -int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR) +int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle) { GUID Guid; int ReservedValue; @@ -444,7 +444,14 @@ int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR) *((UINT32 *)(pMBR->BootCode + 0x1B8)) = DiskSignature; - DiskSectorCount = (UINT32)(DiskSizeBytes / 512); + if (DiskSizeBytes / 512 > 0xFFFFFFFF) + { + DiskSectorCount = 0xFFFFFFFF; + } + else + { + DiskSectorCount = (UINT32)(DiskSizeBytes / 512); + } ReservedValue = GetReservedSpaceInMB(); if (ReservedValue <= 0) @@ -456,6 +463,11 @@ int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR) ReservedSector = (UINT32)(ReservedValue * 2048); } + if (PartStyle) + { + ReservedSector += 33; // backup GPT part table + } + Log("ReservedSector: %u", ReservedSector); //Part1 @@ -480,6 +492,129 @@ int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR) return 0; } + +static int VentoyFillProtectMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR) +{ + GUID Guid; + UINT32 DiskSignature; + UINT64 DiskSectorCount; + + VentoyGetLocalBootImg(pMBR); + + CoCreateGuid(&Guid); + + memcpy(&DiskSignature, &Guid, sizeof(UINT32)); + + Log("Disk signature: 0x%08x", DiskSignature); + + *((UINT32 *)(pMBR->BootCode + 0x1B8)) = DiskSignature; + + DiskSectorCount = DiskSizeBytes / 512 - 1; + if (DiskSectorCount > 0xFFFFFFFF) + { + DiskSectorCount = 0xFFFFFFFF; + } + + memset(pMBR->PartTbl, 0, sizeof(pMBR->PartTbl)); + + pMBR->PartTbl[0].Active = 0x00; + pMBR->PartTbl[0].FsFlag = 0xee; // EE + + pMBR->PartTbl[0].StartHead = 0; + pMBR->PartTbl[0].StartSector = 1; + pMBR->PartTbl[0].StartCylinder = 0; + pMBR->PartTbl[0].EndHead = 254; + pMBR->PartTbl[0].EndSector = 63; + pMBR->PartTbl[0].EndCylinder = 1023; + + pMBR->PartTbl[0].StartSectorId = 1; + pMBR->PartTbl[0].SectorCount = (UINT32)DiskSectorCount; + + pMBR->Byte55 = 0x55; + pMBR->ByteAA = 0xAA; + + pMBR->BootCode[92] = 0x22; + + return 0; +} + + +int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) +{ + INT64 ReservedValue = 0; + UINT64 ReservedSector = 33; + UINT64 Part1SectorCount = 0; + UINT64 DiskSectorCount = DiskSizeBytes / 512; + VTOY_GPT_HDR *Head = &pInfo->Head; + VTOY_GPT_PART_TBL *Table = pInfo->PartTbl; + static GUID WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } }; + static GUID EspPartType = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } }; + + VentoyFillProtectMBR(DiskSizeBytes, &pInfo->MBR); + + ReservedValue = GetReservedSpaceInMB(); + if (ReservedValue > 0) + { + ReservedSector += ReservedValue * 2048; + } + + Part1SectorCount = DiskSectorCount - ReservedSector - (VENTOY_EFI_PART_SIZE / 512) - 2048; + + memcpy(Head->Signature, "EFI PART", 8); + Head->Version[2] = 0x01; + Head->Length = 92; + Head->Crc = 0; + Head->EfiStartLBA = 1; + Head->EfiBackupLBA = DiskSectorCount - 1; + Head->PartAreaStartLBA = 34; + Head->PartAreaEndLBA = DiskSectorCount - 34; + CoCreateGuid(&Head->DiskGuid); + Head->PartTblStartLBA = 2; + Head->PartTblTotNum = 128; + Head->PartTblEntryLen = 128; + + + memcpy(&(Table[0].PartType), &WindowsDataPartType, sizeof(GUID)); + CoCreateGuid(&(Table[0].PartGuid)); + Table[0].StartLBA = 2048; + Table[0].LastLBA = 2048 + Part1SectorCount - 1; + Table[0].Attr = 0; + memcpy(Table[0].Name, L"Ventoy", 6 * 2); + + memcpy(&(Table[1].PartType), &EspPartType, sizeof(GUID)); + CoCreateGuid(&(Table[1].PartGuid)); + Table[1].StartLBA = Table[0].LastLBA + 1; + Table[1].LastLBA = Table[1].StartLBA + VENTOY_EFI_PART_SIZE / 512 - 1; + Table[1].Attr = 1; + memcpy(Table[1].Name, L"VTOYEFI", 7 * 2); + + //Update CRC + Head->PartTblCrc = VentoyCrc32(Table, sizeof(pInfo->PartTbl)); + Head->Crc = VentoyCrc32(Head, Head->Length); + + return 0; +} + +int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead) +{ + UINT64 LBA; + UINT64 BackupLBA; + + memcpy(pHead, &pInfo->Head, sizeof(VTOY_GPT_HDR)); + + LBA = pHead->EfiStartLBA; + BackupLBA = pHead->EfiBackupLBA; + + pHead->EfiStartLBA = BackupLBA; + pHead->EfiBackupLBA = LBA; + pHead->PartTblStartLBA = BackupLBA + 1 - 33; + + pHead->Crc = 0; + pHead->Crc = VentoyCrc32(pHead, pHead->Length); + + return 0; +} + CHAR GetFirstUnusedDriveLetter(void) { CHAR Letter = 'D'; diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c index 59ca86c0..f8d709f5 100644 --- a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c +++ b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c @@ -70,7 +70,7 @@ int ParseCmdLineOption(LPSTR lpCmdLine) return 0; } -static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR) +static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR, UINT64 *Part2StartSector) { int i; BOOL bRet; @@ -80,6 +80,7 @@ static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR) UINT32 PartStartSector; UINT32 PartSectorCount; CHAR PhyDrivePath[128]; + VTOY_GPT_INFO *pGpt = NULL; safe_sprintf(PhyDrivePath, "\\\\.\\PhysicalDrive%d", PhyDrive); hDrive = CreateFileA(PhyDrivePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); @@ -90,63 +91,101 @@ static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR) return FALSE; } - bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL); - CHECK_CLOSE_HANDLE(hDrive); - - Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR); + bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL); + Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR); if ((!bRet) || (dwSize != sizeof(MBR))) { + CHECK_CLOSE_HANDLE(hDrive); return FALSE; } if (MBR.Byte55 != 0x55 || MBR.ByteAA != 0xAA) { Log("Byte55 ByteAA not match 0x%x 0x%x", MBR.Byte55, MBR.ByteAA); + CHECK_CLOSE_HANDLE(hDrive); return FALSE; } - for (i = 0; i < 4; i++) - { - Log("=========== Partition Table %d ============", i + 1); - Log("PartTbl.Active = 0x%x", MBR.PartTbl[i].Active); - Log("PartTbl.FsFlag = 0x%x", MBR.PartTbl[i].FsFlag); - Log("PartTbl.StartSectorId = %u", MBR.PartTbl[i].StartSectorId); - Log("PartTbl.SectorCount = %u", MBR.PartTbl[i].SectorCount); - Log("PartTbl.StartHead = %u", MBR.PartTbl[i].StartHead); - Log("PartTbl.StartSector = %u", MBR.PartTbl[i].StartSector); - Log("PartTbl.StartCylinder = %u", MBR.PartTbl[i].StartCylinder); - Log("PartTbl.EndHead = %u", MBR.PartTbl[i].EndHead); - Log("PartTbl.EndSector = %u", MBR.PartTbl[i].EndSector); - Log("PartTbl.EndCylinder = %u", MBR.PartTbl[i].EndCylinder); - } + if (MBR.PartTbl[1].FsFlag == 0xEE) + { + pGpt = malloc(sizeof(VTOY_GPT_INFO)); + if (!pGpt) + { + CHECK_CLOSE_HANDLE(hDrive); + return FALSE; + } + SetFilePointer(hDrive, 0, NULL, FILE_BEGIN); + bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL); + CHECK_CLOSE_HANDLE(hDrive); + if ((!bRet) || (dwSize != sizeof(VTOY_GPT_INFO))) + { + Log("Failed to read gpt info %d %u %d", bRet, dwSize, LASTERR); + return FALSE; + } - if (MBR.PartTbl[0].StartSectorId != 2048) - { - Log("Part1 not match %u", MBR.PartTbl[0].StartSectorId); - return FALSE; - } + if (memcmp(pGpt->Head.Signature, "EFI PART", 8)) + { + Log("Invalid GPT signature"); + return FALSE; + } - PartStartSector = MBR.PartTbl[0].StartSectorId + MBR.PartTbl[0].SectorCount; - PartSectorCount = VENTOY_EFI_PART_SIZE / 512; + if (memcmp(pGpt->PartTbl[1].Name, L"VTOYEFI", 7 * 2)) + { + Log("Invalid ventoy efi part name"); + return FALSE; + } - if (MBR.PartTbl[1].FsFlag != 0xEF || - MBR.PartTbl[1].StartSectorId != PartStartSector || - MBR.PartTbl[1].SectorCount != PartSectorCount) - { - Log("Part2 not match [0x%x 0x%x] [%u %u] [%u %u]", - MBR.PartTbl[1].FsFlag, 0xEF, - MBR.PartTbl[1].StartSectorId, PartStartSector, - MBR.PartTbl[1].SectorCount, PartSectorCount); - return FALSE; - } + *Part2StartSector = pGpt->PartTbl[1].StartLBA; + } + else + { + CHECK_CLOSE_HANDLE(hDrive); - if (MBR.PartTbl[0].Active != 0x80 && MBR.PartTbl[1].Active != 0x80) - { - Log("Part1 and Part2 are both NOT active 0x%x 0x%x", MBR.PartTbl[0].Active, MBR.PartTbl[1].Active); - return FALSE; - } + for (i = 0; i < 4; i++) + { + Log("=========== Partition Table %d ============", i + 1); + Log("PartTbl.Active = 0x%x", MBR.PartTbl[i].Active); + Log("PartTbl.FsFlag = 0x%x", MBR.PartTbl[i].FsFlag); + Log("PartTbl.StartSectorId = %u", MBR.PartTbl[i].StartSectorId); + Log("PartTbl.SectorCount = %u", MBR.PartTbl[i].SectorCount); + Log("PartTbl.StartHead = %u", MBR.PartTbl[i].StartHead); + Log("PartTbl.StartSector = %u", MBR.PartTbl[i].StartSector); + Log("PartTbl.StartCylinder = %u", MBR.PartTbl[i].StartCylinder); + Log("PartTbl.EndHead = %u", MBR.PartTbl[i].EndHead); + Log("PartTbl.EndSector = %u", MBR.PartTbl[i].EndSector); + Log("PartTbl.EndCylinder = %u", MBR.PartTbl[i].EndCylinder); + } + + if (MBR.PartTbl[0].StartSectorId != 2048) + { + Log("Part1 not match %u", MBR.PartTbl[0].StartSectorId); + return FALSE; + } + + PartStartSector = MBR.PartTbl[0].StartSectorId + MBR.PartTbl[0].SectorCount; + PartSectorCount = VENTOY_EFI_PART_SIZE / 512; + + if (MBR.PartTbl[1].FsFlag != 0xEF || + MBR.PartTbl[1].StartSectorId != PartStartSector || + MBR.PartTbl[1].SectorCount != PartSectorCount) + { + Log("Part2 not match [0x%x 0x%x] [%u %u] [%u %u]", + MBR.PartTbl[1].FsFlag, 0xEF, + MBR.PartTbl[1].StartSectorId, PartStartSector, + MBR.PartTbl[1].SectorCount, PartSectorCount); + return FALSE; + } + + if (MBR.PartTbl[0].Active != 0x80 && MBR.PartTbl[1].Active != 0x80) + { + Log("Part1 and Part2 are both NOT active 0x%x 0x%x", MBR.PartTbl[0].Active, MBR.PartTbl[1].Active); + return FALSE; + } + + *Part2StartSector = MBR.PartTbl[1].StartSectorId; + } memcpy(pMBR, &MBR, sizeof(MBR_HEAD)); Log("PhysicalDrive%d is ventoy disk", PhyDrive); @@ -161,6 +200,7 @@ static int FilterPhysicalDrive(PHY_DRIVE_INFO *pDriveList, DWORD DriveCount) int Letter = 'A'; int Id = 0; int LetterCount = 0; + UINT64 Part2StartSector = 0; PHY_DRIVE_INFO *CurDrive; MBR_HEAD MBR; int LogLetter[VENTOY_MAX_PHY_DRIVE]; @@ -217,9 +257,10 @@ static int FilterPhysicalDrive(PHY_DRIVE_INFO *pDriveList, DWORD DriveCount) } } - if (IsVentoyPhyDrive(CurDrive->PhyDrive, CurDrive->SizeInBytes, &MBR)) + if (IsVentoyPhyDrive(CurDrive->PhyDrive, CurDrive->SizeInBytes, &MBR, &Part2StartSector)) { - GetVentoyVerInPhyDrive(CurDrive, &MBR, CurDrive->VentoyVersion, sizeof(CurDrive->VentoyVersion)); + CurDrive->PartStyle = (MBR.PartTbl[0].FsFlag == 0xEE) ? 1 : 0; + GetVentoyVerInPhyDrive(CurDrive, Part2StartSector, CurDrive->VentoyVersion, sizeof(CurDrive->VentoyVersion)); } } diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h index 13b71f76..dd426179 100644 --- a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h +++ b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h @@ -79,6 +79,43 @@ typedef struct MBR_HEAD UINT8 Byte55; UINT8 ByteAA; }MBR_HEAD; + +typedef struct VTOY_GPT_HDR +{ + CHAR Signature[8]; /* EFI PART */ + UINT8 Version[4]; + UINT32 Length; + UINT32 Crc; + UINT8 Reserved1[4]; + UINT64 EfiStartLBA; + UINT64 EfiBackupLBA; + UINT64 PartAreaStartLBA; + UINT64 PartAreaEndLBA; + GUID DiskGuid; + UINT64 PartTblStartLBA; + UINT32 PartTblTotNum; + UINT32 PartTblEntryLen; + UINT32 PartTblCrc; + UINT8 Reserved2[420]; +}VTOY_GPT_HDR; + +typedef struct VTOY_GPT_PART_TBL +{ + GUID PartType; + GUID PartGuid; + UINT64 StartLBA; + UINT64 LastLBA; + UINT64 Attr; + UINT16 Name[36]; +}VTOY_GPT_PART_TBL; + +typedef struct VTOY_GPT_INFO +{ + MBR_HEAD MBR; + VTOY_GPT_HDR Head; + VTOY_GPT_PART_TBL PartTbl[128]; +}VTOY_GPT_INFO; + #pragma pack() #define VENTOY_MAX_PHY_DRIVE 128 @@ -87,6 +124,7 @@ typedef struct PHY_DRIVE_INFO { int Id; int PhyDrive; + int PartStyle;//0:MBR 1:GPT UINT64 SizeInBytes; BYTE DeviceType; BOOL RemovableMedia; @@ -138,19 +176,21 @@ const CHAR * GetBusTypeString(STORAGE_BUS_TYPE Type); int VentoyGetLocalBootImg(MBR_HEAD *pMBR); int GetHumanReadableGBSize(UINT64 SizeBytes); void TrimString(CHAR *String); -int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR); +int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle); +int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo); BOOL IsVentoyLogicalDrive(CHAR DriveLetter); int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue); int GetPhysicalDriveCount(void); int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount); int GetPhyDriveByLogicalDrive(int DriveLetter); -int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, MBR_HEAD *pMBR, CHAR *VerBuf, size_t BufLen); +int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, UINT64 Part2StartSector, CHAR *VerBuf, size_t BufLen); int Ventoy2DiskInit(void); int Ventoy2DiskDestroy(void); PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id); int ParseCmdLineOption(LPSTR lpCmdLine); -int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive); +int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle); int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive); +int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead); void SetProgressBarPos(int Pos); int ReadWholeFileToBuf(const CHAR *FileName, int ExtLen, void **Bufer, int *BufLen); int INIT unxz(unsigned char *in, int in_size, @@ -164,6 +204,7 @@ int GetReservedSpaceInMB(void); int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive); int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table); int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter); +UINT32 VentoyCrc32(void *Buffer, UINT32 Length); #define SET_FILE_POS(pos) \ liCurrentPosition.QuadPart = pos; \ diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.rc b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.rc index 43075fb6642c13a25e7891e363f7af9d5a73fea9..03a4a003ff6786f74be1fe58bfdbfdc5ff5ef70b 100644 GIT binary patch delta 349 zcmcZ*@-1>hjj*UMgC~O@gC_%sj$&|SaANRhh}fJjyq}rTd9uEEAip7lDT5A!DVQ{8 zFrBlERFO+!CI9W|xi`AVWfFWdZpt!nhFhdAK zB!drwD}xS$C4&Kj4uct(1Y0m!Ufht?m%)i4XmX;Mw5AJ#D?=DVJOi>GLk3F*b0l46 z3_1)Jo4ciUa!Gr cV*JJoCTQ}en}0~`V%)q$dJFgFR~kGl0GhxV<^TWy diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj index f82d5fcf..821d13e5 100644 --- a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj +++ b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj @@ -91,6 +91,7 @@ + diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj.filters b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj.filters index 9c74bea8..1eac7fbb 100644 --- a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj.filters +++ b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.vcxproj.filters @@ -75,6 +75,9 @@ 源文件 + + 源文件 + diff --git a/Ventoy2Disk/Ventoy2Disk/WinDialog.c b/Ventoy2Disk/Ventoy2Disk/WinDialog.c index 42bda379646ec0cd006264f62b34c1e71f5fa502..814ba2777615c631feaaf281d273399fbc8f896e 100644 GIT binary patch delta 2747 zcmcc8!~En3^M+#_lP7TSOg7-;;tXaeVW?!tVMv{9&7nD2K!pQEM0WErjw6hd4{&kV z7BD0-6fu-A#4{Abv@j?z*fJfoE$h&abt{7_n2 z5F)R`punKSpvq9ppftHr&U&(qmCWROaw4G6p4?C@#0pk5S=K@mCK?J40|pOl zQgiZyBW#m1WXvWDs7Oubk>{Cw$^zs#8APOS{x9ds$m5ao$#YimOunaLHTj3Oz~o2DW(b2P%c>|EVnhcaUreso zF-9}zzntXc4jn#rP}p-aa8BNssJOXCMTdozlL5rNs^UEPMwrOt0~$V)cWvXDJR@0P za)BD(hbfU`KaGUak7E3)8r28yvce&0+ZR4HE^hS zw_0d&g^kzbZAv1O&)J}>3S1+~8O#vE5Xs=f;5zxBxB6r`TO%Zqh03y%W7dGOAWTi8 ztu>lWfor5EAM#e4EN7cHc~=P^dkHiyH|l}RhVdTSh)$kkFEV+90^j6q4ib|;O_AUQ zB`UBN859`QCf6%SPIlYOH~E8-9hwc0$OXC1PFZGhheFciJ#rkA6DG1v7SQ0BEYPHd z#s3IBa<&?iHz-&^^>A$tvwOlj`IUl%IF6J%IdG5glZ))Nv^5w)89W*M7(y5{ z89W(W7~&ZM7#tab7(y7}!Nw2|DNZJDbkLmqZnf0pU#S8l=mqBuu-*=9zDbT8lYccj zkf0r$l~A;kX*v};If#(jUk^Q zkD-LYdh*$HLq^Wcf735APIk!>0u>_Q#0yq7d0~$GWP?l|q%D*3}D6?}}$pkn0WRB>}`r4^{c!|MQs)X9MpMWLBTYV*HJ zF9En)esu(Gp4WAXOC1uf8VrO?TG%2ydC3%^$xo)rDBCe8Fc>iyGFUQLG8ixzF&Hx# zF_=Q35kn}04};HSMu8!?11I6?Byn7X;Uis5zk0&$MX3K}w#Cv4T*JYn|{ FE&xHd#p3_~ delta 477 zcmaEIg!xJj^M+#_n{7CcFi!SJ7Mg6A&b7ISJC2EwbMk31_00zSY0Q%^2z5>75#yNb zCC4-QpD^F%O~PxqCp&Cq+w7<4!#MeYEX(8vN?MZ>6l5k(m}fWnL9f*0bsBn`>y#}R z8I2}CRCnGirMirX(P;BSbwkFQ0zI?v{7`af7Ee+%Z@{LkbU&*Z%Q0+T+ zO#WjnHaU-jZ?b|i%j7&Ot;syi8k0BZa!h{E%Q9K3L}ao;lfdKzWsb=gnldK)$#HC! zY5T`Gxo)=G + +static UINT32 g_CrcTable[256] = { + 0x00000000, + 0x77073096, + 0xEE0E612C, + 0x990951BA, + 0x076DC419, + 0x706AF48F, + 0xE963A535, + 0x9E6495A3, + 0x0EDB8832, + 0x79DCB8A4, + 0xE0D5E91E, + 0x97D2D988, + 0x09B64C2B, + 0x7EB17CBD, + 0xE7B82D07, + 0x90BF1D91, + 0x1DB71064, + 0x6AB020F2, + 0xF3B97148, + 0x84BE41DE, + 0x1ADAD47D, + 0x6DDDE4EB, + 0xF4D4B551, + 0x83D385C7, + 0x136C9856, + 0x646BA8C0, + 0xFD62F97A, + 0x8A65C9EC, + 0x14015C4F, + 0x63066CD9, + 0xFA0F3D63, + 0x8D080DF5, + 0x3B6E20C8, + 0x4C69105E, + 0xD56041E4, + 0xA2677172, + 0x3C03E4D1, + 0x4B04D447, + 0xD20D85FD, + 0xA50AB56B, + 0x35B5A8FA, + 0x42B2986C, + 0xDBBBC9D6, + 0xACBCF940, + 0x32D86CE3, + 0x45DF5C75, + 0xDCD60DCF, + 0xABD13D59, + 0x26D930AC, + 0x51DE003A, + 0xC8D75180, + 0xBFD06116, + 0x21B4F4B5, + 0x56B3C423, + 0xCFBA9599, + 0xB8BDA50F, + 0x2802B89E, + 0x5F058808, + 0xC60CD9B2, + 0xB10BE924, + 0x2F6F7C87, + 0x58684C11, + 0xC1611DAB, + 0xB6662D3D, + 0x76DC4190, + 0x01DB7106, + 0x98D220BC, + 0xEFD5102A, + 0x71B18589, + 0x06B6B51F, + 0x9FBFE4A5, + 0xE8B8D433, + 0x7807C9A2, + 0x0F00F934, + 0x9609A88E, + 0xE10E9818, + 0x7F6A0DBB, + 0x086D3D2D, + 0x91646C97, + 0xE6635C01, + 0x6B6B51F4, + 0x1C6C6162, + 0x856530D8, + 0xF262004E, + 0x6C0695ED, + 0x1B01A57B, + 0x8208F4C1, + 0xF50FC457, + 0x65B0D9C6, + 0x12B7E950, + 0x8BBEB8EA, + 0xFCB9887C, + 0x62DD1DDF, + 0x15DA2D49, + 0x8CD37CF3, + 0xFBD44C65, + 0x4DB26158, + 0x3AB551CE, + 0xA3BC0074, + 0xD4BB30E2, + 0x4ADFA541, + 0x3DD895D7, + 0xA4D1C46D, + 0xD3D6F4FB, + 0x4369E96A, + 0x346ED9FC, + 0xAD678846, + 0xDA60B8D0, + 0x44042D73, + 0x33031DE5, + 0xAA0A4C5F, + 0xDD0D7CC9, + 0x5005713C, + 0x270241AA, + 0xBE0B1010, + 0xC90C2086, + 0x5768B525, + 0x206F85B3, + 0xB966D409, + 0xCE61E49F, + 0x5EDEF90E, + 0x29D9C998, + 0xB0D09822, + 0xC7D7A8B4, + 0x59B33D17, + 0x2EB40D81, + 0xB7BD5C3B, + 0xC0BA6CAD, + 0xEDB88320, + 0x9ABFB3B6, + 0x03B6E20C, + 0x74B1D29A, + 0xEAD54739, + 0x9DD277AF, + 0x04DB2615, + 0x73DC1683, + 0xE3630B12, + 0x94643B84, + 0x0D6D6A3E, + 0x7A6A5AA8, + 0xE40ECF0B, + 0x9309FF9D, + 0x0A00AE27, + 0x7D079EB1, + 0xF00F9344, + 0x8708A3D2, + 0x1E01F268, + 0x6906C2FE, + 0xF762575D, + 0x806567CB, + 0x196C3671, + 0x6E6B06E7, + 0xFED41B76, + 0x89D32BE0, + 0x10DA7A5A, + 0x67DD4ACC, + 0xF9B9DF6F, + 0x8EBEEFF9, + 0x17B7BE43, + 0x60B08ED5, + 0xD6D6A3E8, + 0xA1D1937E, + 0x38D8C2C4, + 0x4FDFF252, + 0xD1BB67F1, + 0xA6BC5767, + 0x3FB506DD, + 0x48B2364B, + 0xD80D2BDA, + 0xAF0A1B4C, + 0x36034AF6, + 0x41047A60, + 0xDF60EFC3, + 0xA867DF55, + 0x316E8EEF, + 0x4669BE79, + 0xCB61B38C, + 0xBC66831A, + 0x256FD2A0, + 0x5268E236, + 0xCC0C7795, + 0xBB0B4703, + 0x220216B9, + 0x5505262F, + 0xC5BA3BBE, + 0xB2BD0B28, + 0x2BB45A92, + 0x5CB36A04, + 0xC2D7FFA7, + 0xB5D0CF31, + 0x2CD99E8B, + 0x5BDEAE1D, + 0x9B64C2B0, + 0xEC63F226, + 0x756AA39C, + 0x026D930A, + 0x9C0906A9, + 0xEB0E363F, + 0x72076785, + 0x05005713, + 0x95BF4A82, + 0xE2B87A14, + 0x7BB12BAE, + 0x0CB61B38, + 0x92D28E9B, + 0xE5D5BE0D, + 0x7CDCEFB7, + 0x0BDBDF21, + 0x86D3D2D4, + 0xF1D4E242, + 0x68DDB3F8, + 0x1FDA836E, + 0x81BE16CD, + 0xF6B9265B, + 0x6FB077E1, + 0x18B74777, + 0x88085AE6, + 0xFF0F6A70, + 0x66063BCA, + 0x11010B5C, + 0x8F659EFF, + 0xF862AE69, + 0x616BFFD3, + 0x166CCF45, + 0xA00AE278, + 0xD70DD2EE, + 0x4E048354, + 0x3903B3C2, + 0xA7672661, + 0xD06016F7, + 0x4969474D, + 0x3E6E77DB, + 0xAED16A4A, + 0xD9D65ADC, + 0x40DF0B66, + 0x37D83BF0, + 0xA9BCAE53, + 0xDEBB9EC5, + 0x47B2CF7F, + 0x30B5FFE9, + 0xBDBDF21C, + 0xCABAC28A, + 0x53B39330, + 0x24B4A3A6, + 0xBAD03605, + 0xCDD70693, + 0x54DE5729, + 0x23D967BF, + 0xB3667A2E, + 0xC4614AB8, + 0x5D681B02, + 0x2A6F2B94, + 0xB40BBE37, + 0xC30C8EA1, + 0x5A05DF1B, + 0x2D02EF8D +}; + +UINT32 VentoyCrc32(void *Buffer, UINT32 Length) +{ + UINT32 Index; + UINT32 Crc; + UINT8 *Byte = Buffer; + + Crc = 0xffffffff; + for (Index = 0; Index < Length; Index++, Byte++) + { + Crc = (Crc >> 8) ^ g_CrcTable[(UINT8)Crc ^ *Byte]; + } + + return Crc ^ 0xffffffff; +} diff --git a/Ventoy2Disk/Ventoy2Disk/resource.h b/Ventoy2Disk/Ventoy2Disk/resource.h index 9de7e743bd97c2911172148a787431f251ffb9b4..fa0b4ab19f1073da8066d352c4c07ecc4180ea67 100644 GIT binary patch delta 192 zcmew+`$l1d8^`2D91)ZKSmZc^8A2E$8GIOACtqZdoLs^uF}Z+|W%52&5q?*OFot*r zgnS{3EVB`V+2)5F8<{7sVilRJ$IZcLI606*cj5!K$pKt!lO^~hCJS(}O*UZX5QOVv zh-dI+aAF9Wcu^6gh}n?AXmTODGKvCsh5&{TgaYHuy*#~)j3$#A8AT@>@VQMc;uf21 Lz$Y?!0bdvZnr|;g delta 60 zcmaE(@J)7u8^>fjW*$bvi5K-5jV8-8%TIRWh}ay)IfHpK2VV!{WH(;1$?y0?Chy`m Nn*4wR!WI(<0{~Ub6L0_k