From afbeba7cf5d2a845e91274f1a010bcceb0e32463 Mon Sep 17 00:00:00 2001 From: longpanda Date: Thu, 17 Dec 2020 16:11:17 +0800 Subject: [PATCH] fix issue #614 --- INSTALL/Ventoy2Disk.exe | Bin 320512 -> 321536 bytes Ventoy2Disk/Ventoy2Disk/PhyDrive.c | 124 ++++++++++++++----- Ventoy2Disk/Ventoy2Disk/Utility.c | 45 ++++++- Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c | 5 +- Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h | 4 +- Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c | 10 +- Ventoy2Disk/Ventoy2Disk/ff14/source/ffconf.h | 2 +- 7 files changed, 146 insertions(+), 44 deletions(-) diff --git a/INSTALL/Ventoy2Disk.exe b/INSTALL/Ventoy2Disk.exe index 144fec91c85b07bb57608dc5c41c49643d93a83f..597dc3570e1604e69ccc3e57ab4dec5525b09080 100644 GIT binary patch delta 37160 zcmeEvdt6mT*Z-c)L5~U^6i`%9R8+j9fPjDk0^ao~2HwT;vLj1Vj`@^!(BmR9Ob;&cGpC!2essxd>U|xdIOB93}0RBQID!o`bTcE6DU7LAz z5`?@YQHb8qxdY2oK4wwPU+4)s9}xCZnu{F=?aM_p0jRYI`{^tY<9`Xr={IL~_H3jU zjKre?`F;rZD>KC&J&*qd_2Rh;7Cs~hRId>12|!rB`)zS66B8cYJ_|0ODN$}&p!uhL@y4sVJ%S04Gz<#Kpa zzN3|6g5j_%Iv7G(w3k>+AX0wv?#V7G?OKMhs@m2%s+8&E-hlY*;#^ooz` ze-FslY}dTfGvr?#V{1+Oyca1O{N{r6wqN&*{9lskHf9Y1c1=S@qOZ&*CF=KbqjF8i(QRJ3A# zyTQGRP|#kIExIbgOJ*LvpY|kXgZ-9iwH;FnK?%B|GI@hl6RHcIM)Qi*qEW zNk~io#biw>mv1=69+_ua=vf0CVJb5yCG1tSj=MZQ^kmA)pM7^1b+R#!o(852>Ky5D z!-FZ0b{Kl|;j>AaAMk7n$i-L+FQ(JN*5sy-D= zY<^pr)XynCbxZlKUpSMLw*7cHa z1ksoM1M$4wzl&&lQRxttY|LyoOmMJ*IlJeFEny%#KcE8<3?PpF1AB=xHt$Xx_$m_} z2XWr6HH2Nf4&D&rog@*bix)SESDqFGZu*&UmH zjMUI%a!0fwXnK1?2FWpOa^H@97VEnG*u!#3KI%L6LW@$1k9?bJ`GZPj{p0|Y_~&F& z+((mpiEll=`^Mx~8B!akhTwT%YA^A?!rhmrb|C(2I;lBmI#I_??uHyMfO52~_MV{{;Wc~fX?%9ug<7vIK2W>5D+=}LeK_6xb15aru4!K;& zOt+Vq?AL#ExwMaw3k0oIZjF4oTc=Og-lCE;wG5bAu$-7$)3o>8*^Sp3BMjHdyMn-k z-5)%TiEu#)Uot`g?xz4&G2`5J$$6(FiN#)Rz=}~*IR;(;Fd?pBv z~t1+uR+ZHLqEj`7+I%Tn?N7E7e z&~E=qCEwDS?NRPnI=A`9JGxF_%$mjvMnPEI2jWpy+az}uCV`OUlU{h{A}xFulmScI zi2m;=BbPqgj2dm)Sc1APE`3v6_RenS6K{y(=R1|?CpU}h-c(LKxk#KkUP*o`P7EBc zta_@q_|rJ$ou?wj{o|A?PX&w5k5i1x`-|P)P-2$9WGx>{J!VA5$Yr{Nv2?pG-SOj? zpewJ9!8k4uDzK(~;6*js{__TWwGYa`64 zoZ=;aCRduaoo<#^`fam`<_YQ2vUOH>+$L?|U**|qDoqMTj=Q!q^6C$i_lDfLYaz|&=`-WLMh?=x3W0d_Xx`uHP-8EnU z<)DTl)F4;desh^tL+_B^Y2OcS=B!|+y+Ud6bSLX^V({n~(vg>IZzVEadn@pi3{GTB z(lhL??1{Gb3C%1cU3)Kasw)1Z5>g+c4F#=iC+*md_{7*L!xAXlsrfN>BDS=Y?WB_! zJ2A+ff`MzcLO`w#U2d~$FR8=jKM8o6bY(~#%ES6vpAmwLbZG%qxPLVD0p^=gJ{o?4 zCfmH%b)89*D1S5ZF&S+u`~-{f=<3Lyz-zj@9!UZPD(*;}sgJc0Zxgjo_$?9(l~k|S zeBV$~twTFq16S~I*v*g(j;x<^7~|8w76$R%*OYD6A)@-0QuU>uQfmzrmyc4qj(smL)2OVnGs{f_rt?U(kkhpv`LJ*`2h&k8)wGV{qem!dt9myLT#tCW5sH0P7xCZ2l{Z!;io1p@*H%S} zPYqYP+G52a!<9_iqvFX_<)kezVrMGxHPWnd57}7-ZuJY#g3|_`Z)h~}h88HDR>z8+ z-cY8mj%#h;`CcuK&IAcGxhG$FbM^dDatfH(Gto}lkwAA=RKCvGD;?ML6(=MsW7pWc8!36~>&jPa28;G#O1o#`#nfTSBq^Ug6FBf4xZ3hwVhx>KU5g2>J-!vFN_3|EyrqjAM53p=PMf8$4XD|gq;$$1 z+ae6bAbpy4{2nIhWfh>iU*?#JV)F8|DX_8Y1t_L`5El%`1;$ z8>0_}bnS2h>FhM6uOqmN+JJ~e*_C!GluL8TJ_)fj?f4dDp<|}$sh5~A&lC!G`Dc?4 zwhk8@ao9<PU)yas_jy0gHo88Oy(wPrE_=Hw8X@GTjgA#{_K&lhx<2C+Zol5rT$`%%ik7>z zy5~PThcmP0`I7RO+#}$2B1Ge}I4js?xv8DO*vrt?zo@(=N4J;QFd@U&a{&VK0?V6C zgbQef3z(_6qc3L7B*b+dJe`oJ`<@zDyLnGC&e4IGr8zeeZN6% zMCt%J>t&wX@T^c15TmUM{b>PDkb%hVWR|jXp|Cf=LW%%i?G?_<>kv9is1B9_fh+So zgLRHYQMr|RUFh}s=oq;sT^d8BvN+lZA1nqNHZAXUAJ zvG3smYUefsS){z=9PV`q4yz#lYH2Pt=ZCRDlWPM_Yj{XJc_$p9%)K<5VE9COh zAN*Ecbh%7|9Ji@Td1QTZ$NG9cUvppUOJ3luS5B;N+irg>smsV)c(n_>k9QAZ%%G9V z@9W!lvg^6D^?DdOxTnwQ;P}5aW@_x57sgDxdt)X;5)>%x$Y2^C%JWLqv)#q#2P?+B z@nXtgWlCOuapxvwZC+5Pf5-3!kchMH6Y==!|2+{ibzXldVgv-p&^$INi#Bu@o5U!a zH>8LkL@VEH=-0}tb^q00wt#OU!ZQsSQrZc>HORd7jp=((=G z)Vb9xq3{w=<1FWA(&54j&y5`XtisvKHO>?-xHgiIAPDJLse;K;$+cRPp6|B0E{j)& zw0a|yxhhHtRMxh;HHeCPIa7+lPaP;nhS{02-K<%ol@FBmZ4T?XZl^{!@e4O7KPi#c zWjxD|uV7h%MB-_azT(UzOb1cx^BfnfkaA$MSJwh7g>6FB@hB==ikvBX%&thvmd|Dh z6Xdbmwea;+#xK^g$7J70^mB;bo9H7C!en7Cr%O9%^7!6~BvQ<)Y?D+@7%fuSw=op6 z;+u^<0-oo&J~R+cU?9krJx1W-! zhNk+3^GbAeUZAqHH$~?SaHiCTpTeN4J79huqfcAwRzgX3XK4;F+7|T<(`eKaOR$PO;QVx;4G*I!_++WNZs6=dz_3euS>Dmz|CxgM&4mg!nn=^yo9e_=h z^MPwx=a2XTPp;`e8Ul61W6J>GW9}y&tZ)6sLlP&j4lp3jUTc8|ICF8};)|_8mF52R}yc&@* z`xZPQrch?jM{MZe>B3R_4)~RVR(+O4@(M4>ZQ`)!BGa|R&$YxyOH0I}?6l>hkl8sb z*z8(jkT#MG$NE!&Kn!mtiR6Jq-W!ADbmU;PIjt#s_#kXN=oWHI;HS^`NvYKzZjTYL#|Q zS^84TX=9|o%_!7LFLc!YFEC4X`A1+!u+~Y5Qq5yK%l4w(*k{_^((TMrYdTblZbY$M zCuvGM(~tL9wZ-{9adwVp&X=GP<>X5}9wGuKS17h;eZW<&aog8)H(JUh0UiU7@z{^p zUDl&A?+}?cY%MRF%jGg1Dlto|i8?{A(P`fX_DZ{L{jFTTXGyoYq}#tx?FX<-ay)61 za*z1YtR@AYgG$0rX|^x*&5m0-X*<>Pc3<8yse%#(JYhhmdNl4-Ua2+jZ)zQdT2Wb} z4m~FsUjVmB;HGyb(<;A1XJQ*<#3E-2lHw>oLa&WG7>>O(Hm|nBNP<}ihO?H7!u-f; zFAYcgEvu!eGzZ11%Q-<7X7#1hRI^u^eIqF7(9g+ZW%kXK#vg`0tS{wY4Rjw6a)n}L zyxXZ^Wo+m$*Iv?gy0o0cd%h2G=c~q4%m=GH+Q+$xYJ$tY@+t|LB}}wc3JxbB%@Z;l zyxu=lB=gzCMK-$^;y+cljj9X1SKT!XG1}M@UsFbjd7jDFzR`+=YcI9TwU;v7Es{t3 z$-{hB-l0aCRu#g6Jz=DU=>^1OuDS_kc%h%rs!0u4hoWczdID`g8HbZFXa*X?+dy+o zZv$o#5r3-Pg{zfig+QbosE%uz^6FcJEp-1z-B>@sgk;)_Qz5CGnmD{S*XY$KFla0c zBuS#q(zQwQ{6P{@hT^xqYYGjLzu+#s2=1Ts(z(BfmQw-ZQ?EUWyZCH#?OmrV-`+dn zZ#X3or)h3ZqrpkaCd^2VFI-pwLb>3rjVU?JTNHm7hO+{gdkb3 zbm_$f*+GH~?b$GDJxGw_gzUwU22Q^3mF}7Mo9dFknb<{GQ|_PG{$yM95v{NCV^&E*!c-gr(Tx_+TbQGOTeGKzchGH%A?D~^W6lIT!U8~i0z;e+uwe(lR-+ufDv zymDVATMa86_XjJ@1*)%aGu2Vh1H#*LKn@M$22^`XrTnz-N0_NRrgB%ecsKLW-1->_R)Qku^_@INY^gr@W?&q zgigYKvVsL1WZgL_LiO75FVL!ZIzmFRoc9SQSVrr;fOgj?7l}bJeF{}4cgtbkF(+P9$J9gL8Y0j66l&Y87D#e980%oGXJ%@ybnl6u0 zQ`p8k44E=tXfQ7n-))f|FdE9r*VwS$Qq*>i@q(+hB==M0;gNmeJNe=!tvXH+JiM#B$JXUV}zdJHV3_G z`0#{vZZ2ga`)YG6e2~<$UQ%W4>p|1&yYREse<^^poEV?$%xjcCb?v43;Mz-bLtFX7 zy$Uu{1sgEdP(hD|3KqN()G$US|4ju&RKZMCAa5dDhlas6w7kyG+L}w3h;L_|Z)iQ= zh8-?xbpPLIRI~90S^sE*B;(7d@Om(B5%n+(oy$KIO4OB&v}v`B6^y$jwZ;G=^A)aoLj97gdz@t38?~ovV~-PWIQMcL#!*LG zjhwAlb+R;v(s%Gu$hnuwW2EU!59FXm=X<&6;a^_ETB{EV_tb}zNR8$5Km3;7(IDvg zmt#?PpYEI8z4`IV?3H{l{&6glvosZ*t2;}xl;Sr!Tl;>*%@+m}Mm_mT7f!ilC4}2o z3P3B6SM7mCVC}j{%31w!_Sjq}H~+`5X4p%dc1oDD1Epou@XJBGh#RYKPpex?+@<lIE4kBjPr$K~Q13)oxN-W*h?ojgg>`Y6hq z@mB6W4dMm-+-{TBLocs;P3@7m-)kD-57AxO%`&u?mXW*$nLF=TU9+3QThkq>x_U?I z#V1g{;YtQhJN9RzycT|udsd41U#Zr4hlveNGaU9j*ell)ey%5cvWwD(O{)(=az5R(2cJ+@?r1O0{!n>&$3(9!;N-C9 zT_NQ&zkc!KNv@-WnS4$)|jb)%zZ;b>G9Yz0&OMB(^~r^L7XJ znj*d3i#@3*Zznc7fB3s4`j@9j@;^6z+g6%`0rib%+6s&p-gy2V`zhEdXu9!Y>f%QZ z_pO`OMhBPj-&9md6>UI8G|lz7^r_3SmlT}EFltFN=m6JVQk1s;7$3EC^7jcD1G_%g zyj}s5F`S7}$H6M(2+E0fdN(ua=&MBvD+*(0m4QXk885d*!+0GSa@7Ix^lsZ^5A#45 zZ6{VMkPms>wSVHS{E2U634@ZWaftwQs`4jEeZ)p)X+0QFycMkKpj+qI=0KXh%w7l+0 z&s`C%qx9sVJ!leo=^DZSFgA0`;VPhH`+2fI(V2>m%}bi+;Bkk+S*1+a z^FTB0aDw0pu@@ay-q|y2#3Fj-c-F$(zn>C^6Olh0Fcy#om;#sum$KF4_Ya$iaT`IWh|YS zIM3ltaYux`3J#Q%Sx9fJ{gl%U#aHOje941Ue3 zKqFD)J0O1SFRC6#RZsl8s&gAvO?+m8i#Y3WMivgOsa{t_qgEFLL%DiQ3;sgChfJj3 z@V~2SbEB$=5vs~=p;x4A-5((O-B9-L54yk0dU2M2+hyAtu|)B12cn6~tOHRLY(9`@ z4A4iz(mxM|_q_k(U?^$CIpBt}@!c}<&4tR0_ku)up|bqF$fl!r(~=62-|Kw8$lbk^ z2_OFbD64G57{z-Y3~GI}1)m64`@%}emi;mD*ObWzgV{CZ9|t>{Ebhz;=zOa0^@F{T z^Vz|!?XRJGU`=wZ$dOZyWQnF?Ljc}f-FZ}L`F;;SceY~)vaj}|(uNz#$oKo)FYVgq zByIBF^;yEUdvn5|>#}S88Dj-nA`yX9hnUt&`R@Hi;;seC1BW{I3ZKhOL^uw#OSJBK zB25cIM1MCUm+4oS`pr@D4-M@YR7B)n`js8mQbXe_Ki3~oem~S}Aiwfcg>x+Tm7f}T zTkb1At>;i_e&vU-?khiglqnx1h~W?Mdoe{HbPxwWqMZ0(vhV7LxM;9@$(ZSwPBW(| zLzMufVnP!owWO!G;%(*elIO-&OepO+=@P<-U z>d)$wqoqA3{T+j%dkhK#^O>58>Halq>-_nTqEJijoWrl+8GIy_tx@J5nJ=QH6-P#h#v4lekCMIK{uu>z=iOJy`ltgdQ`USm zswpX1%bcs6`)G&=er=Biv%O06(ca>q8Oq$FJy}cT*`t@mxeqBz%Mv1qSc-lfCF0O> zbRL%AB%A@rx@=L1YTsgCO)nbVUt^q}O2g&3a*H_ULFI|^j_n^*p|fq^;ZftXSK&Ur zv>gevc4e;ePI-s^l@HS?KH;+%+~Fds>_`Jn+q;nJ4Z%q#z2*IAigKqsT>RvDrQgRR z+oep=m)Gq+mTQoJyRo-No`?#O@`5dL> zl^}(Zat)dEPWaGd;^sGVKjG>(6w(DWZ-QpYRPG#$2yhpYKyVa3*~_!2gwK9SN%~qqyQ#{ zzpuH|Q1jL9XHK+dV)S&S@Y7zR*L3CNr|rd>X-f5{apI;lrRT|@K1c){K71NZ8Z*V)Sx|ze`rFpaR%xX8b<$e|+= zPaiy}~*IBsqk!~L98YMe#Gm9g8WV9Omo;UzR+mAX@L%_A`Spj})1 z1tsb9Cs;RIo>_zErZcnJUw{bnOlNKTNuEn2kF5mJc?H_;mY?@xO^n|s2>Wj;qt5oU z2EUOc9Nr(wpJDtN!Jl#bnZTdP{5gg{Gx<~E&uid(SOl*vR}zF*0ows@1NH#k1(X1e z0*(Vt0V)As115rp|h{wVom6MenJJ%tO%Z)C7BPd)Jx&mmH2q_&Ws<0oG zmS0S;jsYjF5*s6QZ1}C1$T?S%gr}dXZsyz;0yzcQRUiSAB}&sl=!z)PmJg@adBNLE zs?W-FXU%TN>QSFH$DNg0pJi!N=2?d+L0YJ8US{($7S*70oFn}m3m z;T@3>`=KfM818qHBo2;uMQ%q&Nt;2c9jfL_8jLaBTb-#rrab#)pAfp=>#$4QYsrS? zk#fMu?AWvb7>AQ?@@lclH($njcR_KK#hW_Q>a$9Z^L?yE#Pt$(jzH5(+~+)Sz4rY@ zC?cRoP4-ntuXQd4)3x>`c;?)Bz+|5cWZau3yBT5ldFS3i$e>#!!_uUi#E&-frhTdC z;oyHEY3Io%W+|FdPas8}mzfgQES@q-3n(>1FZa7y%BAEuN*1TywN(u@OZkL}b7M+1 za63qtUV0H`JCb0QDhU&y(}=uO4PlzNF}##<2QW9UQiB7WOO**1d;|KTZ}n59!W8tR ze$Uyo`blN^g>dU0sM4*FWKzgBO20?SNl6_UY+1JQJpOwVUUsL=m;YCNu!oD&VN~%`Bj^M5Xvm&nJ}9CUON?DsI2=cC?JP2*YQka zqs+ld=~ok*mQZFFO=x`W7;>Cw z*vaqH5aj0Om)E4=x4`X9&dqr5l#j%Ez|ByiFNr2hG@JI>Q^9$>^b=T_rHv%UVqP$? zkr=`5Ql@<+D1rCA6*Txp>Ehmd5ltoNMf8nC<;0}`rQ0_qKf3sh<9#gQ4*NAYc;R$& zcf>ct{p0iD0;fv}kkqmI{aOgGy?900_RaX_F-~r2Z1LNb-@obTKZn{9c!g``YAvL+ z#S7mmVO8y$uA`hEFDnzOcKg@9j#h-HyLRV*leC9&x?NVmcSYHO_w7{mhckV zdEd(JAp7r7l#4wAcK~@vGBlT9Vs1q#Bc%RYG!-qxGQCigyL3r4^1Qi;Zkz?hGEJxhK`wX5Fqb+%-dc-B)zU{Y?rI;Wc^||tx$$pjV6f{eKmDI7J}sTce8mR?Bt?BstP9p;4Qc z5f@J4+PxYE(#3BsOFsCxM4S8#EQ5`(Fe`-zm0zw5wBDn~jv9-hVCh7>ahbbbw(21I zlCNIQ>Q?tsMA)2?Zqadx5+jida1$-4kNYK|HDl{^V=zBPH(~C3qsq4LyElK(t`By2 zlxMz=??fLVdKy4ymPSDA>Q?50MyNSTm=@T&5#k0GLsX^A)Y_!xMmKP$NsJpKFg3ay zxaKmW*4^X&G*KS@jV6!BIXN;A9t6JIa|F?ha`^92-qrfEGs+KI;%s-bSz1=uy=G=m zf?ssRM~*x(NAEj5QPMbZrg4Jn=B&FlZ(!{SI-;z*8sJUePP$HOH(;#rk>$>-ZTKL? z4k4btyEMDbxr@Lkn5AFz_Hw@WvL+y_{`RGt8oODbcnj(o%;qTGUFXnQ_#A|fHCsGg zZ-)b!-A4Zgv?o3e-HH3kaF>h*tf#HrEP>+}9D$=3+NUAy!XMgUbUJ?MiRbPg1`XER zNTWiJ$?*Z`e{w31qmHLLxn0UEK|bm&;E2jhQk;X|cUItPCg)%*ph~!$xb}~D29Jm11u$^`=*_7!z)af#Gs{!hWaih$k&&)Fr<|`Iz)mRM z*J4?@GV)q*uRUNSv3zPfe?wmfeM=lE0@;AVJXe%!W32-sX`~toxp=`XPJ+U$MZwf! zLg}BBNe97^?z(RVsT{NiLyOjMSNJV*)H0+>WP_5HCGvjF+9J>u5I@)z&(%PA9F?j_ zDsV+_`xMpFs*>UB_ zkHO4Ox%^{%uLiEpXX<_;3roDEP&{yMM}l%zS-i04)i65kB+){fz;5;a+`cL7!22e+&B zy6XpsY5j|6w;Z$|@`Sr^UVw&t`%_;`N1vLmO}I=sN=!``$S}R8CwoF!Qu7 zN(-+r*vl1ONq!sdo@vQVCC*v!?S&7VOS|PU< zXQiKcLbqMq;G`AmCQiD>b956YUH1^WqmXX?rJFp9y9KaZHJC|RkGdikK_q;Kz37+T z_??U`zx2>w>z<~gG%k(%9{*|BYG-mt0=&bYO^vVbNAW4=hrH-|1IL%Qtc5ynmwzqU zNDO{2*cpk288|PZ(WZ~C5{x9-n;ay1*CVu!Ei)ybbZ~_B^=)YUpfc%Zzm8m6r!&&Y zwsU2jmdAudXmqC)A}aYe9 zDTTm+fR@3We|JjYeej=o&%dAd{j8O5{_U?1EdPU0uJ#u04w#*5=3qW$1)H@syX|=iZ{cl!EHC!koznjc9q}M|{VgjfBr5@(+gb19tL{Gj^>(jmI_tmF@AqN4?QJw` z{-EE#SMPPjT06x0K~bZ@K8JL;01v=8y(A_l~z9i6Mb>t zCz@DoRv%$$w?CUA#<(e>wdl0FdTkyKvE(Ow|JBK8~pU(|FlWUf-9Ba98GJT|TCGp+<$9hivZoi$r+yDAwUK&#% zz>8mPDy{&#ki_L4IW%ih~9ndlHR-74@Wla^!({Z zVkpJeb9agqU1R*So)6=9r^sI8AcdBQjI0O<-i`!+ypiB%xzKMy=*B}<$70jhFl1Zl zO<7y+9%z#>~1$iso#<)}01xcKClDG_7%f()9kuD3N!&HK!HKw6WCTeNdTm zH{P3k7MFh|Eq%gOmD8t!kw(6v*Kc(0ZFw*VrySl-o11yD zHH!lajuZFdPdy0}TfU;j%2Lb^m)2Fua!p9l`*MJL#5OYa1@}g*z6!TRBl#)Zlo=oT zP)AveF8>k|^7oCb9~-i%Kl^6LkfWqRy5==fionn|YkhP~mXDN-G`3Fxk{J<{=WO@W z^)U=Wu#{@lF^mO_p|gIunU;uQ%8!4fgx#p*)Dg6KtPhxLW#=G%YxIETjj#Oin`H2~ zDok9jkC_YaX%DkWEn;jp%TwowY$(es-X^lKB9cEF*enDSJ=t@>UiM@&7?Q)9a@yNX z*)d>0G_w6n+!I*5ygAcY_fOj=3O50RJ0uF3fNa1XKo#I7V18ht;0!EY>&3EKigkU9 zZ?$Lp#4aOxCkoyABnk1|i8oqSMVX$NILb-52k1##-N4yiDryF9u z>8FA$;xC7<-cSQOvx_WWz1x`$3eJb#(Q!fA@~&{DI%=m7NOT2D``sTiC|{k_g>_?< z>XTjATuE-S-(V?B=Aof*1VU$uv2YTl?HAxtmwD!WM^lLj1(aDh2B|X71UyON zGS6h5OOBw~9m_IIexyVw%bA2U)*nIrrYq~tj;l>VSSM?@J9=~Qb4vfi=0J#f>;5OL zxrEkC`R_FXQaW;}9a88p^kEG)@ifBFKlo8EWFAfR!bjkic^TSn_4g3gy>m4>5HGV+ z4YOiBcYKbEdH(V^V?kvlMoZ!%^!`{ixf`43W$6Tk3Ah`HpA1m*z!~9cMbYUSZT$Ad{|F;P(zK z0Wm3c*}mFaxNMA(*Ie7CF7L@wTVj)C#L{obNK3~7WbxNMS+W=xjdIT6u9?$j9hS@J zndK#g6+>4yVo}@NOE|ZeR~X@&Y%0Ng@zc%+GzdIfo!N(V9^H}-0&5%=`sEXEEuZJ( zfsc7fMjTvPg0-~`rLyiiQ)+Pk6Vp;#5>E~Cs(uAOBk7Ztp?#+w>%-dja-!zLvc)K` zxRkC%;vis(-eJ53U#%B-Wwn{<2-9||E&F1Y{;EdwW&OR5wQZ2htS;=!`mmkqmcHz9 zwoh%@kEI)9agsm9tl8BC{a6=Pqdwb@4Quu!kmNC>sptE#ta+7&rT-N5j~#CX1-Xj;d(@>(ai?x1pj{h@zr?Xgw-=R2@BlMUB{oogCN2 z{!kx`yx1wQR1H6cmVs_^ynhX+O}J7Mpjq$n@XiX3 zOf>$e1`K5LD9jniBKjJC#5qwm>jMaN?bX0fTbqs^c2*%O*U0u7ggDH>4-lfr#er-T zR+B#AY%y`j4`;*JDD_e}OYT67rrku>uY=yqaS191NHYv)~-nrRohDK9Ld^v{noOfnw9F1 zLD1Jsb?PA2v*mScA{(lBUfnQ=`Hz0)9Zl!wJvSZSY55LZmF`4cq zRYbzm(9S}i&>)UdJ#8ml)xNf;1BGmF*U~_(d9`|D5c5l}AW6EQCgeL-T*4f@r-A^j z`Mv7$ywNpfS{w<5DigAs*yec&)z{Lsh3d#C)@$JIK5ivUNDDuo9y7yeX`{W4Li!Bq zOT~{~#eoKHZqiSsey5#NUyEXcS`I+Yl<<=3M2`})_PcsDiiH|~^THB1NV}-Ei)NY4 z%%C94^P0LUnhmx73k{q?=7#%9i*T!DidHZUtLh@SZqj5tv=gXi3TQ0Dq&=@B;vM=_ z=-3c4i3rR@uoMKg_%Uz^L6_Y@qL?<(%^2@V@LmnB6k)?lxETbBkqrM7)Pxx37b-!* zbgfSddOnHD)3x>dIfFly8Kn1snO76k9Q1=Wv!$Yn#C%fl>|WJ+>dzW7IZN zE}1Y}d?r?VW?KC*#4Gd6r37MYQ+!@sjks-v7v7m~0mcGMxoL%<~65ZjYIAZhwJF=O7Ax_2S*p z#p_Mt?MDev5OH2P;@1FvW_9UMnC3lZRUOJgDJ&hz!nzR=*hmN#0hR%B0J(rXz-GX| z%xaqih^1G41eoK13xFDP@!|xwkTDwqy{xDmrd3qUVo%2U^Uh-;-& zv_Tly9MMeMNeH---%*H3)YPnPRgWaGE=@Y(_kgql^;#0^71Qh%;tzrZudd<$y5yr; zH1^1}I@;p%YA`JEn`ckMWuvij8lmpd-o05oei$3bytY6LK5bl)TU2KWon=ett5v%~erQ(iZl? zlNLt&R2?>M6*CUcaCO@Vq0q#FBMrI8%QjH1%Re8PTr&mbf0eztA^W(>MzdsAp{9<; z${(TTjAm1;RH5svUZr#mVrLXmEe)tzjv~$tD8o3SI^Gx+%uyAMQDGc)rZFm+qbeJt ztkXH}LStMuM^!aO<#N=e#;ENar8P#CaMZQNs7j8iX^gtYQ8#r|Q?Bd6TJ`HOEWldV zm@aNSHB;c`&#j-y9A#*XTEWB$!Q|rl~5iG5>8y;g zn`&(aHr375FDJ9taE_2Og(Wanpq5T$PqO`L+%#4cF#Ic6trEORg*7m04?)uKlEc#R zhgHLLwgUU5Rnyrc>{jvh>8zTGTTiIxXJWlTXqd%bq42d?EZdh16~0SD1LbmT*m~LG zE7d-kYyhiMXJ)bx1h!1J)mQit>+wnEh^I((6B(fzF`GrT;b}3vD$YZDGp zpXRHtJj5=G!U1*792V?FoJ`Jr5DG^TyXLTnRz&NH*q@=@hUK3!1?byzup|)L;k6$> zWHvZW%7;H(Kp5Gu-&PWA*6!l$4EDA$4nL3rC8GG$xoj%iU%YoNc7dYdNA5rm&gVi&SvO(A(w0MlQBUiusV{9aak3Yut0^MUFR$(MZEM!O8(vHEA z+%8m3sc}qd*GC?EQ}%Nrv+E+(n~2PdnBPbuTALiuEv|X?XgI9HbHyat04m&~&ROBh zvP8!Nmu4LWL32xQcLvD2gFKM#UuSvL7f|0?#5xn(ibX7v!lsY2XbKbE;Zu*Zjg)S+ zn02Etda*9+l*McsrS~mn&r>*V3F{ER#cGn8o7}FOoO09ls|S8R*^72aE0?egqWW?P zb5i(lHhYJ{_7>Kc!jTr%J(!oqy|Lyf?}YvlcdosQ+zYZ~xhGGp_wl zjvM9vrQ;Up;GR(c<-8%a~Vre%a`-f>RPUk*7hsl zvqJ3{twHLH6|9mHQBSj{DJ*`P#qmCQnyD17x8i7Zyn4+F!y2r1$YGBXc5M!uLE+UL zcFCLiH8;6=glu>js4rLQ1BXYOl*XKtf5jL2m_@OhRqC(Q6WCfYRj=QaV- zc6FqK#SY2Cj5paffW2H+TI=aZxg>vM`>s>zcTMC3Dwe${LmNE8y+@Kk z#t#HObg-{T@`AN&EGt)kTFZtvrB*xQ^VE2mMN!^TnI9UI%B&+yK$XnK6L!ElHq1n% zES_YL4SRvKtz&7FS-FnAh!!q!vi?j{3!Q9G01+*DO8&a^H&6Ml?fXup-$O!D>kX&g z;I`}8GAg@ay*_ttuV>~a!Pwz_5Uh@UmbGsZO7T$j(PyErL+Z9?*(2SI@50A5R>Ew? z(~^UqXwlTY_&Tbi_9Ft_pAJwX@|Z(3URUu=!9SaZqKH(nOnr0%`?WXi<_c-Mhr=+> ztboZg58Jw9y_-p=8Y77J#?QeU$75S0Wlrf&d~;k#{@lIXjUIlSPGl0?o^oHkjXzK2}?a}pYmVD`G~#@;kRgCFlaqC4wX~zE7x7|5~owTHsW0%;wP&f8`+RHoJUZ)_S*rMYvoZ5%i@&S z$jNHPMi$8=)wz)k81=W2RdQ^KMMdb<>sU@4R3y3Sew21{W zwoGLz8!o2*vv`z>1Gj;?uN~0TDqkYNxL&g{4(|G zX7*4MdJR)Jr+DHE>{;eh&*b_(`~;jFxlz6GA{*qr2qakRUD?M774Z@q7Ear`bZx;J zTEHnT*m|I^%RHxpHF;!HFu9-+DygM%szvIXFR`Fr+kxSI1I5`(mUXt(icfpnYCSA% zWpCQYRkzT?!o1=eFJZ&cl0?GZZsQ(wRpf}`Q7^LtBHO4M^4XlIjl5Cx*|!;YUqjN# zW!-!qE}G-EG{zNfQ(wtvZ84>a^Vz`OIuGi!ERX8T1^FPAgD4qWmOVZuejC!+!@-_5 zh<*husU1~-yb$2v76jpk!tt$WwtvAEbzuPufM~e|EVT`vqJeU$?P4dGlG2O12~jT< z!0y52Xz?m5Vxh$cUxmjZ?mJX`w2-wju*cNOf3nLsP(QStbvLlt#g})ml`MMVzC2MBxeK@nPt7D}kSZEi($)K{y&WYF*T=Z?g(!Q5U|$;(d-Em-!o^ z@Dkg{EXI4g`tCcdr}fQ)F4udDE}(zuXG!{HXfFVP_}%O-8JZJuxhA9ZuBWyNQCn4~ zDWz3SJjgnsK(#0zUYigSVvQ3`t2Oj_hBjR<%o&**F-pG2DCRy!WB1PJ?+jPAVK|OLZFl{a_pB!) zC)edKV4QLceJv%WgSsGJ&HV&TD_8e@!giCqj~vHw#+T~4<2W)nTHNsjd{p*&@sLm1 zAtp|)QtzH*4~dyo>O&Q56~f~0EAT(pb@X`;6Sv#*(C`ZU#|aq0@@?CdPNi3xctntA z=W~kTd*2_`si*M%M^jgxVo83~m2{DV4!m*Hr!Pq7PO%q>aLH-(1yR^MX=ViLxqD9Q zZs+yWEVUP(F_ZEAW=*NfQ?E?+dY{VNN^WUj+3~ixmagn5e4?SwJcENPaLql#M(H!H z>L~B z=Re!!(yxvC(ElNZ7hW2=rIKZE|L2J>*oPv^DIRZ!dSoJeWJKiWXn~_Q~ZH#C{Al4z9+KJ zRZ}x@Bw9M9nb;RQ;b)qOPxv5owG#)4US^se-;O3u+Q=BO7siievm zMAFjzi@tg4_D*70J%3!IXw2WUf&cAJVl3RD@L(|xj28uq@puXMb}*0$>JPzUmySNX zn#rYyQAf92cU|lBFmkoptFyQQ!+v{baTi?pX@6bOeL}k^y4?a{x~R)&ueZdjKB- z&H%0e>HzIaM4=yG3}7B$IUo=4YKdqSb|G>Ea0+k*PzPvTDhi>1A%Jm!nSiB$^?*|l z%N70M-aRwxUo=g!s-{xP|y7z!|_1KoMXbfc~8D>nnS1KtHJ0Q~W<_k)ST_C<-pv?XwwUQHC#eP_7#W4iQDcJFMe1I_x4|~ zz!Gepy*PXPym?FJW)JR$v>+7kTPm($#R<#A+!pGxHR2KD#JRKQ1dmOcsP43hZHvFR ziKbw}P!bVv53xFhAMdPMx!aP`Xqv7h?VKNra}WS&0I@xq%qMzq1lm>#JfrQ`ZIekOLR!NU`msddW)`J#1pt!_S@S zs6ue6QSWuyyK1633!IWlHtWdxDsXL#S5=>$`QrWg%m0vn3 z#zu5qFn4@FSNq;Qx|uYefD3C>$1&idlSK9OYoh=EH{Snm8}G6ItH!%{z;^M27W?*y zHO6N7aJcC&zxd8U@tncxt0fBm72t*NFn*mR;0}XeK)3@N_5T}K-G7roUj+I;KocEN z{J@8z>Y-lvNDQ?`?@JPJmraO6*dAd5!VUJl{~YE9HjQSV3jMt6wr8J!Wm zJlYoRh~6CiYV@w?lIRoB-$h@Iz7_2q(>A6@OkB*cn1^Csh&dZ`E#_tn8$4w2)WHu9 zUO4#m!7R2{?9f*8_}su32EH=z?ScCT zmJj@D;CBP>3~Uk}6y75|Dtt`%#PE#p72&(WzX-Q}6MiZDhwz&4+Hhk;P(;^=sEAP! z<0Br6SQU{Qkr$C4u{Ywqh?0o!BYulukVHMh) z@=#=LWRF2{gT@YeW>Ddv{ewOp^!p&+sL-gGsL@f2qn?f08g)ME=cw8!A=)RpTXgT} z=;+bWR_L_M8vSW>ZFKVgY3e+~t17-VegZ*q>Cz2VnxW6^nLT??*|P!Zy@ME#suTs{ z14#8Cy-5{m5io!RqzM6{w19Mw4uVnwit-1gOI5sY_}>rr)BbdFX0Ns0-}|n~^CYsV z>?Q}wQF4>KEbFPaP{?5_swS#=YK_{cwyH}?>sET0-ldP}oBFvnrjwa%?wg!J{-9LQ zFlZ693wj3qgO7tb!Gd6Ma1{0YEqETp*jH>5`=K3UC)thmJGhMi{@Stc5@f^XtG`1kw-KaUpt$)E98+`Mi< zw4t=y!0ql1cBAficec9_Em-evcMrP9-81gbZl?RtjS;Vl8iI@3qLJt*x`=+_Bk{2q zE2fAUVu|=h>=b*&NfEsuZiw6Bxyb3|^9p(KUKy{tSKn*xb@Y09A9y3ZG3eeRFU4Ew zt@Ac{2fRPMN`5zgfd7S`?(g;w_-Fi!{w@EW|H98DUzJ5=DOpa=lN;shDnZp(?Ny@c zqmtBUH9^f$OQ4OfU$%3%I-riKlj`@Vx~(3n>^e>t)WvlvT~2e|RgcsA^pEX-(QP#e?P^f0~62WF}H&iri}2cv_PP|#Lr=$BxC{m9O@%k3_E)0PYq z!lq$|uv^$K92`c&b>Z>wO!yPpd^da&MovT`d19iGNKTTM#FI*-I&p|3wMcW)p7bIg zkdb5znL!qj6ta@6Bb&$pa++KtH_21-FUdoT(=xOItx5^R7o}w&w_Q$uHU_Qyg;72b zy7`X(!#la-+^z0!?*EATqP=)qtQH4Etf#yN-Y{>qcf)%a^>7*L_xIyudFjeN(7-r3 zOa36w$Y146`AjxbC)7RFSC=*wO%>xAYu+?1Ok2~{^fF0ih#6xhnmJ~^`O0iH+s%G+ z#GEjh=6CbVkRUM_8f*+s26uyp!4t40VqtJJ)_?qX)uY!auUWk_q5r z@?Rt6NM+KH{7CNNO^?x^D08|xTQS?$oWGnn%ym8XC0mWLy##Jl0~we zkp4pN(|ADFb?!TPp!*Kc`8>9atzzq0E?$w><{f!2K8{c2TltUt5`O@a=5XWPvTkFy zlRLuw#GU9yKSkk^-4yq*d*1!keeC8Fr9~xCO;Djl9nny<5bZ=~(Mt>v!^LQkEK;D} z%i@X1;pO&T^GXA>H84~mWcw~E8TH0{Q@vTZa_B%(NXIUd1WeLm$t6Q){)`tyYV?pOHFykB9cWf6s#cr_}UWixVinrwLc^BT3 zzt5BSP(F%}<&*gWzKrkZr}$-lhyTUnUF9}&Tf-lRL;G{xW$ribx4`mQK>3dQ)XgP| zqqQ|eUC~(d5d8t<1tPj$Y=JtTd~Whx})LysR!A*+h1dJ>_6I7BpEP*UQZ^1KPO& zraY0asC=q|s-oUhZ=-<|)%2)Zpq4{A8`ODqMLkllKsMC?;?}yO?ye_6Jn8x}OgB4V z{F*6m5{zq_nAT>PnQT5c8_c&RCMX6Qt`_j1Sz~K%b(|o16zuZTCx;i`ia% z|5bTdrI~b4GQ;dO2hCBC@{BoeB4uF$S*f$G{{M(9Y>V5HHbP<|S$|L~0qzh-i_)^R z3g!6Py0jr}N?X#lv?EQV-DxwYjnm5+=PYx+a}GHPtR|*uI2+9-uxV^Io6nZ8uh?1` z{Wi9T9bzXDysol8*(3HGla-rCivScZug9D7PxwUsDW8L(TEf5LYk3;t*B*Z8Wdg|L zH-L{P`~{Cg2B_#(al5+jxuXD(o8CWOVZW3bVjh}z!bq){NIDMPh@PYEot@4@rwnU} zQNGN2^HT2HZhKMByY0pKMf}=`VT1gUQGdKY-QVCp1OxKRcv(i)lv>up5Ve#2;{`= z)9rSfVfWgDwqRI1EE$#!D}bzX!wuoqFuFa=2=^l4Mq0*1K7*d~L&FV`Zd;PJq$5cr zT}e+^a2iP`+erqY$hV!H9?oDV>P&J@IA@(JPC1BnJ)6Z(@{9Z$Zve2)aCf-}++*$) z_qv-?B#2g`rx+wQi6i1H%;$-CA@XhP`wlwz%w!9426=-bL3~g) zNC>J2PN0KYLH(dP#PwFtEqFJ0KNu7Y3!=fqU|KL6GFuX?2-ZSq=|M)YFE|pM4$cRc zk$`Un_kyRviy#)h|Eeu!%h(FGigm1K16$8Fwk>T(+c|2x+kSSS9b!L*8fV+3cAeb} zIUcc!$iW9o19yLL~nfAScm$Y!;Y}=6iF}{EUkI1@u%7TZa$A$iV*|vJcolf~*Dm zPmxOqYDwV37@ADC(Gv(W59mKMms8kroWz%)pUsllx+vR$@O>7^?KU)-o#*8Yj8Edj z`C@*ApW%tA1eweJsV$WM1 z9DtE^vV#yuhlHPJRdRGpR_;W8NFs|d(1*z{c%T&2WZjfm>U^W$}^1#XqBQuRxOVvuXCJOSWsk7=|MYXSuuBGehhA4eY z-BvHw%XO+=qc`Yc7{A`Z^x##5#~k6Ch}M0vGeu@XvUsCahHXH{zGMiQK&HK1S2lu^JIQ`> z6bkr>WRl;=ZSt7BAg|E;^mQs}2=i(VMN+ zwrYUgZGb9jwqSAI2_EdXhwU+#bR;7tG7w)LL3!heBK{GQE*55BL)gUj zu^-ug;Ba|)8Pu;O@6HGD34A`U;m`34VGQT0Q>u;b1@DMfGwra`^)V|wea}V8P0BF*~p5|poRjC9E-6i<8`qiHydh9%5-SjqahhX&kN+nmRq9^~osUXDk-MAj|)6 z;%x`GGu_MXGq;3z>b>C~@wdx8a=$zxPs+3MXL&_lm;aHsaS8QAzW6_V7knAj7pn|? zP!9~U*?cw`8F~Xi)FkX4Ef;!qW(*PKB}EBSa)UJkw50p{g{Vjp2G9cf0J zaqz8aaIVj=XeMLrUJmz)6u<>N-e4-dMk_j3*ixQ~%bRm@f*E4@%e`q-xH+qJW${}$ zJPMNLYCL|%Qgh0@i6*~?OPb|DBiPS-w(c|-&S_gBEFV@4?}U%T2>I`a5|HNWV-4R$ z{vi@Us}E>C3>PnNIjfx+2X~AFaQ7m delta 36049 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 diff --git a/Ventoy2Disk/Ventoy2Disk/PhyDrive.c b/Ventoy2Disk/Ventoy2Disk/PhyDrive.c index 200a8cfd..b863bb17 100644 --- a/Ventoy2Disk/Ventoy2Disk/PhyDrive.c +++ b/Ventoy2Disk/Ventoy2Disk/PhyDrive.c @@ -289,7 +289,7 @@ out: } -static DWORD GetVentoyVolumeName(int PhyDrive, UINT32 StartSectorId, CHAR *NameBuf, UINT32 BufLen, BOOL DelSlash) +static DWORD GetVentoyVolumeName(int PhyDrive, UINT64 StartSectorId, CHAR *NameBuf, UINT32 BufLen, BOOL DelSlash) { size_t len; BOOL bRet; @@ -304,7 +304,7 @@ static DWORD GetVentoyVolumeName(int PhyDrive, UINT32 StartSectorId, CHAR *NameB PartOffset = 512ULL * StartSectorId; - Log("GetVentoyVolumeName PhyDrive %d SectorStart:%u PartOffset:%llu", PhyDrive, StartSectorId, (ULONGLONG)PartOffset); + Log("GetVentoyVolumeName PhyDrive %d SectorStart:%llu PartOffset:%llu", PhyDrive, (ULONGLONG)StartSectorId, (ULONGLONG)PartOffset); hVolume = FindFirstVolumeA(VolumeName, sizeof(VolumeName)); if (hVolume == INVALID_HANDLE_VALUE) @@ -1401,18 +1401,18 @@ int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLett goto End; } - // clear first and last 1MB space - pTmpBuf = malloc(SIZE_1MB); + // clear first and last 2MB space + pTmpBuf = malloc(SIZE_2MB); if (!pTmpBuf) { Log("Failed to alloc memory."); rc = 1; goto End; } - memset(pTmpBuf, 0, SIZE_1MB); + memset(pTmpBuf, 0, SIZE_2MB); SET_FILE_POS(512); - bRet = WriteFile(hDrive, pTmpBuf, SIZE_1MB - 512, &dwSize, NULL); + bRet = WriteFile(hDrive, pTmpBuf, SIZE_2MB - 512, &dwSize, NULL); Log("Write fisrt 1MB ret:%d size:%u err:%d", bRet, dwSize, LASTERR); if (!bRet) { @@ -1420,8 +1420,8 @@ int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLett goto End; } - SET_FILE_POS(SIZE_1MB); - bRet = WriteFile(hDrive, pTmpBuf, SIZE_1MB, &dwSize, NULL); + SET_FILE_POS(pPhyDrive->SizeInBytes - SIZE_2MB); + bRet = WriteFile(hDrive, pTmpBuf, SIZE_2MB, &dwSize, NULL); Log("Write 2nd 1MB ret:%d size:%u err:%d", bRet, dwSize, LASTERR); if (!bRet) { @@ -1430,30 +1430,71 @@ int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLett } SET_FILE_POS(0); - bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL); - Log("Read MBR ret:%d size:%u err:%d", bRet, dwSize, LASTERR); - if (!bRet) + + if (pPhyDrive->SizeInBytes > 2199023255552ULL) { - rc = 1; - goto End; - } + VTOY_GPT_INFO *pGptInfo; + VTOY_GPT_HDR BackupHead; + LARGE_INTEGER liCurrentPosition; - //clear boot code and partition table (reserved disk signature) - memset(MBR.BootCode, 0, 440); - memset(MBR.PartTbl, 0, sizeof(MBR.PartTbl)); + pGptInfo = (VTOY_GPT_INFO *)pTmpBuf; - VentoyFillLocation(pPhyDrive->SizeInBytes, 2048, (UINT32)(pPhyDrive->SizeInBytes / 512 - 2048), MBR.PartTbl); + VentoyFillWholeGpt(pPhyDrive->SizeInBytes, pGptInfo); - MBR.PartTbl[0].Active = 0x00; // bootable - MBR.PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS + 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(0); - bRet = WriteFile(hDrive, &MBR, 512, &dwSize, NULL); - Log("Write MBR ret:%d size:%u err:%d", bRet, dwSize, LASTERR); - if (!bRet) + 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 { - rc = 1; - goto End; + bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL); + Log("Read MBR ret:%d size:%u err:%d", bRet, dwSize, LASTERR); + if (!bRet) + { + rc = 1; + goto End; + } + + //clear boot code and partition table (reserved disk signature) + memset(MBR.BootCode, 0, 440); + memset(MBR.PartTbl, 0, sizeof(MBR.PartTbl)); + + VentoyFillMBRLocation(pPhyDrive->SizeInBytes, 2048, (UINT32)(pPhyDrive->SizeInBytes / 512 - 2048), MBR.PartTbl); + + MBR.PartTbl[0].Active = 0x00; // bootable + MBR.PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS + + SET_FILE_POS(0); + bRet = WriteFile(hDrive, &MBR, 512, &dwSize, NULL); + Log("Write MBR ret:%d size:%u err:%d", bRet, dwSize, LASTERR); + if (!bRet) + { + rc = 1; + goto End; + } } Log("Clear Ventoy successfully finished"); @@ -1490,7 +1531,7 @@ End: if (state != 1) { Log("need to mount ventoy part1..."); - if (0 == GetVentoyVolumeName(pPhyDrive->PhyDrive, MBR.PartTbl[0].StartSectorId, DriveLetters, sizeof(DriveLetters), FALSE)) + if (0 == GetVentoyVolumeName(pPhyDrive->PhyDrive, 2048, DriveLetters, sizeof(DriveLetters), FALSE)) { DriveName[0] = MountDrive; bRet = SetVolumeMountPointA(DriveName, DriveLetters); @@ -1528,6 +1569,10 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) CHAR DriveLetters[MAX_PATH] = { 0 }; MBR_HEAD MBR; VTOY_GPT_INFO *pGptInfo = NULL; + UINT64 Part1StartSector = 0; + UINT64 Part1SectorCount = 0; + UINT64 Part2StartSector = 0; + Log("InstallVentoy2PhyDrive %s PhyDrive%d <<%s %s %dGB>>", PartStyle ? "GPT" : "MBR", pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId, @@ -1541,10 +1586,19 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN); - VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR, PartStyle);//also used to format 1st partition in GPT mode if (PartStyle) { VentoyFillGpt(pPhyDrive->SizeInBytes, pGptInfo); + Part1StartSector = pGptInfo->PartTbl[0].StartLBA; + Part1SectorCount = pGptInfo->PartTbl[0].LastLBA - Part1StartSector + 1; + Part2StartSector = pGptInfo->PartTbl[1].StartLBA; + } + else + { + VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR, PartStyle); + Part1StartSector = MBR.PartTbl[0].StartSectorId; + Part1SectorCount = MBR.PartTbl[0].SectorCount; + Part2StartSector = MBR.PartTbl[1].StartSectorId; } Log("Lock disk for clean ............................. "); @@ -1608,7 +1662,7 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) //Refresh Drive Layout DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL); - disk_io_set_param(hDrive, MBR.PartTbl[0].StartSectorId + MBR.PartTbl[0].SectorCount); + disk_io_set_param(hDrive, Part1StartSector + Part1SectorCount);// include the 2048 sector gap PROGRESS_BAR_SET_POS(PT_FORMAT_PART1); @@ -1626,9 +1680,12 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) goto End; } + + PROGRESS_BAR_SET_POS(PT_FORMAT_PART2); Log("Writing part2 FAT img ..."); - if (0 != FormatPart2Fat(hDrive, MBR.PartTbl[1].StartSectorId)) + + if (0 != FormatPart2Fat(hDrive, Part2StartSector)) { Log("FormatPart2Fat failed."); rc = 1; @@ -1679,7 +1736,7 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) } Log("Write GPT Info OK ..."); - memcpy(&(pPhyDrive->MBR), &MBR, 512); + memcpy(&(pPhyDrive->MBR), &(pGptInfo->MBR), 512); } else { @@ -1728,7 +1785,8 @@ End: if (state != 1) { Log("need to mount ventoy part1..."); - if (0 == GetVentoyVolumeName(pPhyDrive->PhyDrive, MBR.PartTbl[0].StartSectorId, DriveLetters, sizeof(DriveLetters), FALSE)) + + if (0 == GetVentoyVolumeName(pPhyDrive->PhyDrive, Part1StartSector, DriveLetters, sizeof(DriveLetters), FALSE)) { DriveName[0] = MountDrive; bRet = SetVolumeMountPointA(DriveName, DriveLetters); @@ -1872,7 +1930,7 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive) Log("Lock volume for update .......................... "); hVolume = INVALID_HANDLE_VALUE; - Status = GetVentoyVolumeName(pPhyDrive->PhyDrive, (UINT32)StartSector, DriveLetters, sizeof(DriveLetters), TRUE); + Status = GetVentoyVolumeName(pPhyDrive->PhyDrive, StartSector, DriveLetters, sizeof(DriveLetters), TRUE); if (ERROR_SUCCESS == Status) { Log("Now lock and dismount volume <%s>", DriveLetters); diff --git a/Ventoy2Disk/Ventoy2Disk/Utility.c b/Ventoy2Disk/Ventoy2Disk/Utility.c index ff77db55..91403bd2 100644 --- a/Ventoy2Disk/Ventoy2Disk/Utility.c +++ b/Ventoy2Disk/Ventoy2Disk/Utility.c @@ -382,7 +382,7 @@ BOOL IsVentoyLogicalDrive(CHAR DriveLetter) } -int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table) +int VentoyFillMBRLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table) { BYTE Head; BYTE Sector; @@ -473,7 +473,7 @@ int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle) //Part1 PartStartSector = VENTOY_PART1_START_SECTOR; PartSectorCount = DiskSectorCount - ReservedSector - VENTOY_EFI_PART_SIZE / 512 - PartStartSector; - VentoyFillLocation(DiskSizeBytes, PartStartSector, PartSectorCount, pMBR->PartTbl); + VentoyFillMBRLocation(DiskSizeBytes, PartStartSector, PartSectorCount, pMBR->PartTbl); pMBR->PartTbl[0].Active = 0x80; // bootable pMBR->PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS @@ -481,7 +481,7 @@ int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle) //Part2 PartStartSector += PartSectorCount; PartSectorCount = VENTOY_EFI_PART_SIZE / 512; - VentoyFillLocation(DiskSizeBytes, PartStartSector, PartSectorCount, pMBR->PartTbl + 1); + VentoyFillMBRLocation(DiskSizeBytes, PartStartSector, PartSectorCount, pMBR->PartTbl + 1); pMBR->PartTbl[1].Active = 0x00; pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition @@ -538,6 +538,45 @@ static int VentoyFillProtectMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR) return 0; } +int VentoyFillWholeGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) +{ + 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 } }; + + VentoyFillProtectMBR(DiskSizeBytes, &pInfo->MBR); + + Part1SectorCount = DiskSectorCount - 33 - 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"Data", 4 * 2); + + //Update CRC + Head->PartTblCrc = VentoyCrc32(Table, sizeof(pInfo->PartTbl)); + Head->Crc = VentoyCrc32(Head, Head->Length); + + return 0; +} int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) { diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c index 5fe037bb..1f206aaa 100644 --- a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c +++ b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c @@ -153,6 +153,8 @@ static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR, UIN } *Part2StartSector = pGpt->PartTbl[1].StartLBA; + + memcpy(pMBR, &(pGpt->MBR), sizeof(MBR_HEAD)); } else { @@ -188,9 +190,10 @@ static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR, UIN } *Part2StartSector = MBR.PartTbl[1].StartSectorId; + + memcpy(pMBR, &MBR, sizeof(MBR_HEAD)); } - memcpy(pMBR, &MBR, sizeof(MBR_HEAD)); Log("PhysicalDrive%d is ventoy disk", PhyDrive); return TRUE; } diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h index 0f8e76c6..8407ae14 100644 --- a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h +++ b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h @@ -24,6 +24,7 @@ #include #define SIZE_1MB (1024 * 1024) +#define SIZE_2MB (2048 * 1024) #define VENTOY_EFI_PART_SIZE (32 * SIZE_1MB) #define VENTOY_PART1_START_SECTOR 2048 @@ -208,6 +209,7 @@ int ParseCmdLineOption(LPSTR lpCmdLine); int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle); int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive); int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead); +int VentoyFillWholeGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo); void SetProgressBarPos(int Pos); int ReadWholeFileToBuf(const CHAR *FileName, int ExtLen, void **Bufer, int *BufLen); int INIT unxz(unsigned char *in, int in_size, @@ -219,7 +221,7 @@ void disk_io_set_param(HANDLE Handle, UINT64 SectorCount); INT_PTR CALLBACK PartDialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); int GetReservedSpaceInMB(void); int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive); -int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table); +int VentoyFillMBRLocation(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); diff --git a/Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c b/Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c index 22cbac5c..c39bea6f 100644 --- a/Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c +++ b/Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c @@ -475,9 +475,9 @@ static const char* const VolumeStr[FF_VOLUMES] = {FF_VOLUME_STRS}; /* Pre-define #endif #if FF_LBA64 -#if FF_MIN_GPT > 0x100000000 -#error Wrong FF_MIN_GPT setting -#endif +//#if FF_MIN_GPT > 0x100000000 +//#error Wrong FF_MIN_GPT setting +//#endif static const BYTE GUID_MS_Basic[16] = {0xA2,0xA0,0xD0,0xEB,0xE5,0xB9,0x33,0x44,0x87,0xC0,0x68,0xB6,0xB7,0x26,0x99,0xC7}; #endif @@ -5983,10 +5983,10 @@ FRESULT f_mkfs ( if (sz_vol >= 0x4000000) sz_au = 256; /* >= 64Ms */ } b_fat = b_vol + 32; /* FAT start at offset 32 */ - sz_fat = (DWORD)((sz_vol / sz_au + 2) * 4 + ss - 1) / ss; /* Number of FAT sectors */ + sz_fat = (DWORD)(((sz_vol / sz_au + 2) * 4 + ss - 1) / ss); /* Number of FAT sectors */ b_data = (b_fat + sz_fat + sz_blk - 1) & ~((LBA_t)sz_blk - 1); /* Align data area to the erase block boundary */ if (b_data - b_vol >= sz_vol / 2) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ - n_clst = (DWORD)(sz_vol - (b_data - b_vol)) / sz_au; /* Number of clusters */ + n_clst = (DWORD)((sz_vol - (b_data - b_vol)) / sz_au); /* Number of clusters */ if (n_clst <16) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too few clusters? */ if (n_clst > MAX_EXFAT) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters? */ diff --git a/Ventoy2Disk/Ventoy2Disk/ff14/source/ffconf.h b/Ventoy2Disk/Ventoy2Disk/ff14/source/ffconf.h index 229d865a..d40f8696 100644 --- a/Ventoy2Disk/Ventoy2Disk/ff14/source/ffconf.h +++ b/Ventoy2Disk/Ventoy2Disk/ff14/source/ffconf.h @@ -205,7 +205,7 @@ / To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) */ -#define FF_MIN_GPT 0x100000000 +#define FF_MIN_GPT 0x10000000000000 /* Minimum number of sectors to switch GPT format to create partition in f_mkfs and / f_fdisk function. 0x100000000 max. This option has no effect when FF_LBA64 == 0. */