From cbbd57eee5980acc6879e119fe6b8913285f2af6 Mon Sep 17 00:00:00 2001 From: longpanda Date: Sat, 27 Feb 2021 17:57:41 +0800 Subject: [PATCH] 1.0.36 release --- INSTALL/README | 5 +- INSTALL/Ventoy2Disk.exe | Bin 324096 -> 324096 bytes INSTALL/VentoyWeb.sh | 7 +- INSTALL/grub/grub.cfg | 2 +- INSTALL/tool/VentoyWorker.sh | 30 ++-- INSTALL/tool/ventoy_lib.sh | 29 ++++ LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c | 8 +- LinuxGUI/Ventoy2Disk/Core/ventoy_log.c | 28 +++ LinuxGUI/Ventoy2Disk/Core/ventoy_util.c | 33 ++-- LinuxGUI/Ventoy2Disk/Core/ventoy_util.h | 2 +- .../Lib/fat_io_lib/{release => }/API.txt | 0 .../fat_io_lib/{release => }/COPYRIGHT.txt | 0 .../{release => }/Configuration.txt | 0 .../Lib/fat_io_lib/{release => }/History.txt | 0 .../Lib/fat_io_lib/{release => }/License.txt | 0 .../{release => }/Media Access API.txt | 0 .../Ventoy2Disk/Lib/fat_io_lib/buildlib.sh | 30 ---- .../Lib/fat_io_lib/{release => }/fat_access.c | 0 .../Lib/fat_io_lib/{include => }/fat_access.h | 0 .../Lib/fat_io_lib/{release => }/fat_cache.c | 0 .../Lib/fat_io_lib/{include => }/fat_cache.h | 0 .../Lib/fat_io_lib/{include => }/fat_defs.h | 0 .../fat_io_lib/{release => }/fat_filelib.c | 0 .../fat_io_lib/{include => }/fat_filelib.h | 0 .../Lib/fat_io_lib/{release => }/fat_format.c | 0 .../Lib/fat_io_lib/{include => }/fat_format.h | 0 .../Lib/fat_io_lib/{include => }/fat_list.h | 0 .../Lib/fat_io_lib/{release => }/fat_misc.c | 0 .../Lib/fat_io_lib/{include => }/fat_misc.h | 0 .../Lib/fat_io_lib/{include => }/fat_opts.h | 13 +- .../Lib/fat_io_lib/{release => }/fat_string.c | 0 .../Lib/fat_io_lib/{include => }/fat_string.h | 0 .../Lib/fat_io_lib/{release => }/fat_table.c | 0 .../Lib/fat_io_lib/{include => }/fat_table.h | 0 .../Lib/fat_io_lib/{include => }/fat_types.h | 0 .../Lib/fat_io_lib/{release => }/fat_write.c | 0 .../Lib/fat_io_lib/{include => }/fat_write.h | 0 .../Lib/fat_io_lib/lib/libfat_io_32.a | Bin 45670 -> 0 bytes .../Lib/fat_io_lib/lib/libfat_io_64.a | Bin 58226 -> 0 bytes .../Lib/fat_io_lib/lib/libfat_io_aa64.a | Bin 47506 -> 0 bytes .../Lib/fat_io_lib/release/example.c | 87 ---------- .../Lib/fat_io_lib/release/fat_access.h | 133 --------------- .../Lib/fat_io_lib/release/fat_cache.h | 13 -- .../Lib/fat_io_lib/release/fat_defs.h | 128 -------------- .../Lib/fat_io_lib/release/fat_filelib.h | 146 ---------------- .../Lib/fat_io_lib/release/fat_format.h | 15 -- .../Lib/fat_io_lib/release/fat_list.h | 161 ------------------ .../Lib/fat_io_lib/release/fat_misc.h | 63 ------- .../Lib/fat_io_lib/release/fat_opts.h | 90 ---------- .../Lib/fat_io_lib/release/fat_string.h | 20 --- .../Lib/fat_io_lib/release/fat_table.h | 20 --- .../Lib/fat_io_lib/release/fat_types.h | 69 -------- .../Lib/fat_io_lib/release/fat_write.h | 14 -- .../Lib/fat_io_lib/{release => }/version.txt | 0 LinuxGUI/Ventoy2Disk/Web/ventoy_http.c | 4 +- LinuxGUI/WebUI/index.html | 1 + LinuxGUI/build.sh | 6 +- Ventoy2Disk/Ventoy2Disk/Utility.c | 21 ++- 58 files changed, 136 insertions(+), 1042 deletions(-) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/API.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/COPYRIGHT.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/Configuration.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/History.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/License.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/Media Access API.txt (100%) delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/buildlib.sh rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_access.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_access.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_cache.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_cache.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_defs.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_filelib.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_filelib.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_format.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_format.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_list.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_misc.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_misc.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_opts.h (83%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_string.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_string.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_table.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_table.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_types.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_write.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_write.h (100%) delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_32.a delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_64.a delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_aa64.a delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/example.c delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_access.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_cache.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_defs.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_filelib.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_format.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_list.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_opts.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_types.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.h rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/version.txt (100%) diff --git a/INSTALL/README b/INSTALL/README index 2535f490..db836ce6 100644 --- a/INSTALL/README +++ b/INSTALL/README @@ -18,9 +18,8 @@ Please refer https://www.ventoy.net/en/doc_start.html for details. ========== VentoyWeb.sh =============== -sudo sh VentoyWeb.sh -Normally, it will popup a web browser window. -If not you can open your browser and visit http://127.0.0.1:24680 +1. sudo sh VentoyWeb.sh +2. open your browser and visit http://127.0.0.1:24680 diff --git a/INSTALL/Ventoy2Disk.exe b/INSTALL/Ventoy2Disk.exe index 770a8b1b5e06246b5ec7bc66b7b53f646fe66994..d831232bb537176b2afb7085b1b31267a7b50786 100644 GIT binary patch delta 14773 zcmZp8BHZvqcmoF`Q}_SLT#RyzCX+Q8!x`sHZe(<4oG|$$qdDWs$&5_ujL$Y}GAT1L z25k0aS;NA(c=9if4~&y0zvkS}cxm!#E@Q@dlkam?GMY?|&r!ep|ipdOQI^5hFbB24_roBIXr85z$_J})H7xMTBE zApu6l_Q~IbtC_e(HW!O z?DRd7#-Gosu+519ByuAh#5347`Gwpj#z&iH%gXwD?aJ~>x0LR374k)hl7 zPxBETaWdvl=CcoB(tou%#om;W@xbO;4s$sfT_;<3DKaVF+Z^rnl#$V9 zv!l;uHpY(4UxRFz7`-POh5q63o5jeG#gLT}6!2p4W~(rM4o2h2UU6q+t4}d7bbn|* z!qQo~r1e{=NUxhw?0s02R!(Ngb`$3ZNeMGBFd&;EyLWS9_I=iR$sG&~-N%t-w6-&V<1dTB z=+cX``~LrLKEe{#dVs(6-P`~FU%cE7HU|{5P^bRd22mgO;w(rfD3n=@&+gy@hjR3b z+feB<5D?n^ruhv=Sog=qe+&$a44d~C?qX(KHMy!ZlyU9k3#A5(b0#yEX)xZHtX1a8 z#JOp5X_+Y~!IhbTqNJ>nk@3Xln2J?QOsZQZb5ze@yt8>>bs8gM>12-Db&SU*Z?AP` zTr~N2Z32_xs?D)=nT(9vCLgc25}C09zHkPH)&u-5dsF`Y{~w;QU~^xa zEF3K7#R;vzSvR1B(h+#duIrD=6tZN-RE9>pS-M7f!hwwKQsAarvkSyoWF4L zpH4-k=ks9dOM@908e0?o{{P>>!ocvqHRkXC|G_V0=1;coiWCkBVqoa*7hnP@<_P#- z&hz5X`con08x+VVe`fC;m9r z2U|h3Ad5=Ii}g+nSq=d&=FFTtak=PZk?A_pl9NCtvNYE&U??%%_kh8fp_{GsKnZ8S zi~p0Or%S7{O@t)eg&--2#D$4qE#1CjpN)I*X!7joUW{udKbvmGXggVUh9YC% zWcwLyJX0os6pH*W{qv%8^TipBj7(a6lS5`HFmd!vE}JFK_ul}#_5c6>Vv+yF0xup<=9+CGxnrvnL$B+W<~JOl_>sL}KRJ4KIOD0!n`hfIN*=(W zsDCo|+!(17IAof_P0!ER!m%(o8ZO!`k|9_T4 z7DK>`uF1j+-%0+!VOGOrsYOamvh9=Y78x^XU)o%}NRyHA!Q{D%)5T|80Gnm}t#j)V zgzqj*mR@2hY1;~tW9e)K$#j3nU~pkz$YKb4VK6y&iM$lV?>jL3{{m<`mXi}# z)JxsKA-k}B^2Ft0lLc0KO1;3LL<6FvbESjS2OLUvv`wD4TzvAcm5GcKH^;2{!YBm^ zc}&+BwtxepevJX++szx+*fBC@Pkz5vSt6?nl5pWA>W&go28I`(Cu^1UU;R@You#(MTn^rU84C96xurY>PZZj#UZ|2*& zg;9KZ5y(d@piJ4iqF*f8d~=%=Bjd8oU$(omF;-2s*(b*sJvn-x858%m z&6D>f{%o$)qjQ{^HJ@DdNI+zpu;%z#pIRDdpgr)m9#Mpn6 z>km3G-kp5lpfuyY$#)LAF+Q5Cd?<{GIc;+FAp<6^yvb`1MKFd;W;^W3=sP*!@MOlF zo1YxM$inC_dE1FzCb5Lgt|$2!8C@rbo+@G7Jo(hAZbp~MVW;IKjb|}1WGq?c#K8Qa zxAnpA|Nk>qEOTNAcyVlU-)R}W9XSjP|F?pKvlz1&Gd3)9VtBCxF7{$7I0#g_eSd%o zrKOW^oHk*cGnw~{m!xV8B+^z0l)mZq{R7S|#%Evf#Y`?ZqsO>)^87P8QA-Ly-sJ%m zR`c?qZH`_ZyTBJ~L7G98S?m8&a9NgF2vW(?>&_S-2WrD*F=R1-v?ak!2+Lv&f8m(P z02a2Ita^3=`;#OFhOig&Chs{b%@{iQ##tA}+R3u#9CYlLfehp6ZQb$r|No3R3=9n6 z0WY**f)W1^f}+bNcb+p~d^~yAxv8K~J>So`ck_eu3mKUt;wLv>)M9)ydEG^6#tV~A zU9@E^oy>7bjxlVq`lTnrg`p7NgBnc-zy)^vWVy@cqV0i<4BbDvKlOSt@NYXjGbkV| z{6+EPtjn921UNR!T@hep^qZ`IRh{wLWCoxUHsPj}XS>D|r1#J~{r!eBDT4b}SA zOEpsUEUgDhM7lq8-{N2Lnfu@~?&f2P&6gQEV}EqVe$l?yUHU<~^he`ih9Cd_cb{&) z_P_Zdd-uW4(jUzy7&?7gqc{;Y6fcoF^S|Nm}Zp5`MW&9)aFIx#Sm=yo4$ zKEY5T8JMvFq`>MEsBy-j9m~^vkD;?v_Qz}941<+U3@?O@ z2Di&6oZM9Cw!hHIt9K z%YZa=`YRlF*HB_$U^wos0~QE3`G2k3_0QxVH%xVW|1=){&(6Tm?fRqn0z>Ca4HgE5 z?wiLO6<8P;7&sUhjyI}+SPTpdoz0UIZw4{z{0?gwlD%D(b;^2g@K{@#Q)t40t^h@|0g?K_n%yUOGJ{tx1N!I+aco<2VZd* zi}Wt2cVh4>ebMd8GkMLeIrT4|J231>S?R=Zct;MHECG`hV6p*Bwt&eVFgXEC&H$4O zz~mAzxdu#b0Fzt5C*+vEp#3>Y^|7QB03u4I)HLk1HAL&JYj76&JW?hj!ZU?ByN`uUUj z?#V0Uta4)bU;5?0D2D@x@#BB#pMVUIV1^AyQNm>3dqHe_KunIwOYbS0p8=^i+3=#r z6P#CD50p49%y{O+kj0d70V-7pmr{pGU77sT3Lp`Y$ul2#)u(`%M_&H_&%e#>Pe8^55O*t> z%NCHa0>oSX^8f$;Wh@y7K%7}%4oAiv5T_Tc&h2kN#t#s;4#eH=_OJPYeL#l58YhMq zIZ%;|Nn*7FWjF=KMf%QcKQCUd^hX1p`m^i>|7cJ~@ra9icd zD+5N3$*iyEFlKLF^g5oA?az8Ah8N2wv%hs`Guhz8@FH?^$Xg3Wk%SFS46g+P7H;|I z#K6j8%fJwjQL}l$yY0-pGd4Ieg#Et^Dn&D9OiuZ9RP)RRCx#5h1)z#6iy`d4=pRQX zhKws9LAC|pHYHT(%;ccYEplHrKso}VW(*A7vRfRS7(l)L|Hj`Ygl7nBoc!gpGOxr& zCur|1!(-!Ql`ket5*sH+eTic7**JOI7aJ|Od~f@o*Z=ve$GBE?B zB8w}dVzSIvDTWFo4X=_U|Ew66rG-FUrCt{m z3q(_U^0ME_*o3A3xG=7robbn!@x|m-e|p_b=YlP2J;2|x7G!$}$d-h&U_oTtTR`F- z5b<6Y74z6;@J-97x`;XPq-~U}0&rWq889rKW#oVhn^^&djI`vD|8U zF*Bn%qrvpm%#20+V7GN01BXO>T;%jXW=1Iv!3?l7tYEfZcNnCK zqxC?kXGYFuP>nMOB9bMLQM1{Jq4hwCL`KJECr~R-bdRGG!;T4{y8CJDApwRAjV;q{ zIT$sZDz-Q=yl^@MYKsUoAK`exe(nGN3{Z;BV#rWf@5GRyGu?^dzvux_jl_H6qZ7j} zP|E?T!un8#$@=NbIT)1$jF0~R|67Th_y7O@85&!i7+x}iSS29VPf#Ou3W)Xo-~a!; zo(wuBjts#jjtuU`5Zctlk-^@?k--y$xBF@^-e+XYnXaqFD8p#A-Ajw{10&;->DD@o zYKnKX85la*y4_gfty$Mxbz&$H?e^nXc;ki>L#ty!DaQ-D=}kI}GZ^n}m)2$EVivh! z%)rp=`+Xuv4Ln74hN0pkfK#)R$Z#*8nR7#p?+ zm@&R&WL&V_%7Rglh4H|29~;JBY!7xgF}z@$9%#cTHa*Ff@iG&`&h6%Qj4v1&k4#r^ zVC-fzoW90^v4BZo=XN{~vrm&dk8TP%3)xB~$Yw=H{OqMOvSi{#Tg_ zlAX|fd>2Tz`6WvcPxAw2<`e%_T5SRy8UCyES_C;VO!%+TyC=|*VS-PfBSS@?Bg35O zlCF#zOd3Jcon0AKKy;=nql^m3tX@wB`5;FIo*+jCmLNxlKY@-6UjiK&-UK=_JPCAU zxHEmFE2F0{NM-kbkl7AFjto9QjtmLYS=|^@ZH@#xGIam{e)GRdZ%MEtL$4pjZvQQ$n;}wjGBx`rhjl_G*kg8>Gfo&2zF#> z2zF%X2zF$c5bVe>BiNB)L9ipkieN{E-P2v&89hZnD!cz*33g<-6YR+FCfJdIA!Pd^ zcgAE!KGP@$hL@mLa+XMj!_Mi#o{WWzQ>M3iGMX~VOyBLvXvdhf{g)?WDqrCx0EOq4tUXvkS$9A$^I{^cu|26%$>d`j8Q??=hFZG-EC7C z7#Q}0Mkuw92fVNZ3(a6)U;y#7!CE>%wkS;J3}=+(iA`Z(_`eO*gM0CPx=}czmg<>{ zpk~I4qZj}GkBsbg5{r8^akz87EDj9?rOiEn%k< z!wcr=o)L_Cf|}3&|BviG_Cipcf#Gl#&kK#|9TAL1jPcWVM=)+-+&sM?lChkzW%`Rq z#=DI3rXP!9RA5w`{yd6No$=>%{%FS4f)mgD{}0N!Sv(mHAafh1pN?kK6kPKdV(t`S zkh#1sR!?V*Vbo##KHVsW(SU!uH3LKB;VglS1t2ZArx(UB8Z#zLUmC+0%BVN}cMPK* zW7~ACSjJw)!s$C=8C4l=rr(QY6q7JH{r`XDi=cP^{~u=%V_;x-&1C$)`}m92={#|a zix~G#UmwRfhf!g=Pdwvt@rV-;hk=K=C3<~d1phA;cp*8RD}m8~F=)DV0;4VC>*)z(O%E-XH(}KQfE= zMc#C$L`EgiBOvZ^*FXRM|Ns9YoPmKMi|2*;^vXm=XVV;z)QfYx3=D@@Kn~C1ec@#W z3fAsYjx3%Rc3^hc3n2zjYpwNLDMyyTiw)C1CNfHD{CofZfA@#T)^DZm8GD!+7_t~& z%(nn3i;QgjR$?6X-*mw>Cx#c_rW++OD$86x_WysR@wf2*qAm_j4DsE^;tpqVWV`@{ z+3o3tNsKm(Ow-pTF)A=VoPIuuQNMl?4+FztJ5X|O zJy0SI8p-_p55)T~>fq?aFugXJQ9;k=-T(j1ydcB=N4~T)W?;zT$Pn1&#PDJ&Hv_{y zi5pG~mZl;%oES>9vUpxRoqjr*QJr%hHz=+0ypW&%JDE|5k#)LU3Zoh0g6W|tj0TKH zr?;grx*0b-ho!w2Y|sDyZ$9z=n=DlyqNzF)Jl+O{_(HW=Y`?3|NomUluEN- zs6YGvzfUfHX)q|Nmbq_2Tzah%VC?AD@C63V%8| zUTd}gx8z>5Msy+XXTimoPCI?ApF9n{hTX0&Qi*_kthyr?MU7ray||{wkzs;Ok0V1yk0V1*&vYqQ zMs+5MUP#3#(K{VfF{*+L1C3nuIx_s}ab)( zW%LjMDee9bGTorpk-?_dks+XWI-46~ip`cjc-5HFhqG$j0rHhfFG%r(6TOZMZ+aaW zMEby0Bh!|?>Brp|H9+)7H%0?hkfL5shKxQ(hJrpvhKfE%hK4>zhK@c*h6#O+3^V#1 z8CLgAcXMa-5C$pj{(q#;k>O0ABg36OM}`mECpIyrF)|ix|Iy6&myz-1_HV6>92|@j zrvL9{e9X9G`{O>wsf>&_wpUJIT*}D!W4rt$#?4Gj61%rwnZmf3ku6|{6T|+1>9x}s zrPv}s?1<@er!g*Kve>=daXMotBU{97Cx(m%+vm(+6lY|t*uG^Zqb#F@6{w#0(R_rb z^?#|VC2PccCx$ZFuou14U(RB5X7rq{JDbsm@z3Bna? zsx!Wv{(d&22jh8v?$nfITHc;tw0F+$AUgT`=p2wKN$SAq} z!+b_fCdT*Mr4}(NGcul;Zo8QA3FG7GN=q1(7@tgcUBZ~m_-6XbC5&p@FDzkHVPibD z{p%{mgrG`?b|nRWy}#^(z>%<@fhPx zPFe3Ojts$<92wd#IWpY3sgx`!&03ge9FxvETx zj0MyCLA(jmx2Q6?3kHB^69rTwwt>bY^K>^%=TT!i%sGFX6GN%mP2B_2Z>TXDz|02? zWr7TZn$HTgu41~nI+HbH$Mj@%CL6{H(-){S*)mp4zXuX5m@cKkq$KA6wkG1>;WYj{ z)g4f~_CRRUEz_ekm}(glw%^cT`oU4(aFmIm;3yMA%u$ek7#N(6GBKDPWnvIJ%EX`n z6%#nX#GrJ5iNWLm6NBFYCWeFqObjIlm>6mfFfmLyz{Ifb029N$156AT4lpr1Il#p5 z=>QW0%Rwdvv4czuItQ5;ybdxk#2sW}s5!{QFzp}{!xehnN_|4lyz49AaW{I>f{fafpc_?+_D1-61B1zC%n5%MLLy>^sE7z;u9#;ol)9 z2C2hL3~Gm&7>o`xF?bzjVhB6T#4zV16GO*ICWeZWObi((nHVBYGBLQFWMVKl$;2Rb zl8NEZ2_}X|Czu#coM2+ubb^Ut!HIe%hK>_V3>7Ds7&1;UF@&99V(>b_#PDf96T_90 zObpNVGcnxS&%|(SKNG`>lS~ZTPBJkZImyKE;1Cmo(FrC7sS`{LEGL*4ejI0FcypYI zf#nzzgTOH+2AN|_36~(V`4aUjEUh+ z{V^tnH^-P5n2s|s$Q@^5usP1ekaC=fq2f3bL(6d{hDpbn7#197Vpw&YiDA!iCWZ^g znHU}&heTD#5hjLZhnX0*9A;uTaF~gqsMMszz>Qjy|F`PTh#9()XiNW9q6NB0jCI*osObjeX zm>9ksW@317n2BN9VTgrG_A@bb?Pp@B*bm`vILgFu;wTftjiXEquZ}V?%z>sCP?rRT zZBiW>b{0D_WS2QIY+UNduzZyxOp4)tz9Sn$@i#|?d(#_Dn1qeG|63-2BtfRTF)%RP z*v`aoVb zi=6XI^Gd8#b8<=*GK&@R@=FvFb28KOQd1O?Diut;ofI@ca+(YbdHD)?si`RnCHW8) z3gww486Xwgf6iiR=aY5V;lu#S+d;uD!S^h`O;ee$#%ZbF#JJGDGH!wCb5}A2b3dqN zWDuxhWGHydI8jk_y1*(X31&|R$LZXwm}Hs%J3$$@T%e3=9#F;$PY8qY^z@UfnB*Cg zr@vgqB+VWe=E#s529aWZngU@k_D=U)%_Psnku^PQHIp3wuUtn4P_r2nUTk@e)ALs| zN%EWIBLtoEA%aXA1=GD&Gs!W1sesU8O<2%9AO!E8;vk?(;YL?@4|J6*Aj2EUi zu3?gA%$vRtM17ln5Jat+{%{SGJQL3nkPD<(J(oH%#7tLQ%OuYvy$md*%DKXkfp-PO zJecG5{Qv(S4vW#QH#K*nx>50m+VEN0}HboS3E`UdJRlT40Xs0@IhO1?G0ejZFPq z+x9SB;8jz8?Z`kFZ~u0ZNsgsHW4jZBECT~W&UPmTDFz0Hg6&QW(hLj?CEJ}C;1H+YVP7M4E3=DU+Ie{iU8J=u&VgR); z-fVMXkYiwA__EE30o1qtvCWA=fq{YH&o(CpP|?e<-HCylfgy>3W4jZBC<6n7z;-7F z83qOhiS14dlAv;VyAy*T0|SG`b|(f21_lO$?M~pa42$hf4B`w73=Z3!7(g8;kL^wj z$_xw)KHHrbR6y(3wmUJXGJwXmoEX#?7#L#Ozn)`i|9Xyj``2?U^LZIvrcb@YVyG`_ zB4?svQe)CowN9toK_Vx4vP0&-#h=OKT|`ZJS)1Vw+Z*O*V&Zgl&~<4Qy>~y=)_Gv+HeZ zZToE(+HSV}VasPHZWm?8X|HYXZJ%x5V?Wb=xBWSL1_p)?3=C5k85k@Kk__e=Ts8P> zz+-4-=wcXd*kHKKkjF^d$j&IrNXdAz@gn0># zi{BRfmLisNmO7S(mM)flmcf>hmI;<=mW7t(mUWgrmQyWfTQ0I(VY$olfaMj-2bS;Z zEg7wNt%R*4t>mq|tctB_teUJgTJ5nqVs+l?j@28hzgEoFT-MswX4W>=Ue>|Zk=C8o z`>an}->`ma{mJ^jHII#?je?D~jh&5)O`uJW@O}R~n%>BO@a}qa>phMw^Xx z)En(JI&5^>=(^EEqhCh+#>U1L#?i*JjMo_-F+OGd(D=WxqKUalzR7fxqb8?K-kW?i zkuudVwKnxI4K+0Z;Lrl(9Vm|iu#WBSPSyD5tqkC}*>q?x{% zlbM%Uf?1kbg;}TBe6y`)`^}D;oi)2|_REajyk5jy)m+;=%Dl?F*L;%sYV%#@N6fF9 zKQ{kp{?nY_LexURLf^vD!pkDUBF!StqQ#=iVzI?Ki^CQ-E#6yvvtYF3u@thDu=KJl zx9qa)x7=X4-}0p8Ez1{{-z@)Gidacmsaly>*;)Bp#ad-s6VegB zt4~&c>#dlrIjya%qpWkSi>$k?XIU??-fDf=`l9ts>-W}Qtr=|iZ6s~9Y%FZtZ2W9e zY_e>cZD!kSv^j2b&gQ1g6L6eL*vi|Q*}B9Sk_!?vwLykuUM9gN(I(j@#U?E#6HKO>tTNeXvdv_V$sv<7 zCRa`FnmjgnY4XK{!&Jyr!c@-mvZ=6HqQyar5X((gY1W1|uWYZ_->|=9|G@r<{R{gy z_8;uO*#EF+P+$ZX+$naT!kCfa2m=FyjG=;Iy^5iRp^l+}p^2e|p^c%3v9Ga)iJ6Im ziI+);NrFj=Nrp*|Nr6d;Nrg#`Ns~#gX|ZXm=@Qe!rngLAntGV|n zCbJ!8`^}D-oi)2+cH8Wc*-NvJWWz@XkJ)8v~;ndv=K5i@(U0<&9Y|I9kfZ7r%T$}Cf@_^dUo zO|28Hv#qCC&#_)=z0UfAwTO+3jlPYQjlE61zfH7Ff=#wfsZF=d8XF(mWZMGU8rvS* zNw$k^582+ZePsK>_Oq>+owS|0osONiov^*Ny{A1x03(9~BLl-%17SlQLt{g0LkB|_ zLl473!|8@w4fhxxFg#*-!tjjY1;ZmkN42(>SW*IFtI$(6%=#0??qbo*V zjpXZ%1C1k$V~i7wQ;ai=bBqg&ON{p!A2B{*e8%{Kv7>2{DJ01IO=p-sFnwzJ-qgr! zve|yKh2{^<-i}w~^EyOJ?EE6qDEL$uOTi&*OYRPEDVZ~=9 zW2IzeZslPWVij$bWL0a`Znf3wgq66phE2V`&2HOYwk&pBc2agqb{cl(c8+%Lc42l2 zc4>AMc3pN$?N-|zv%6+@-|o5He>-7&Nqc#FHG6$~6MHLrCve#qY9D2vV4q>1YhP?% zZQo$uX5VK&*?y+|Li=U*YwWk!@3h}*s-}H>>HPdINmS)*zZD!xhc`aNmqAW5j3N7YXC|mki zrdj4$R$5N5TxEIG@~q`;%LkV4EoH4dtm?sm9%0>Mz1jMo^#hv(+g{tF^|ohi_3TXS zV(lvICfLofTWxp2PRKslKG(kAewF=U`z!X3?BCdbvS%n@WB|>Fu^9*%SQ#Z7u^3kw zHyHOA?=wDQ{Mh)Nv8+jxNw>*lleH#iOdguNHeoU4GnF<~HFYx0F>5oMY_`a3joChM z)_iLA+3cSgo4K&Lthuv!eTjLad6)S*^V{Z6%-JjiE!-@^EE+8)TP(NOVzJXg#B!?D zajR!mtk#j%jn?z5e^__hOtx8NbHawpcB<_{+ckER?dRAtG%zxpVPIg`VsPES*f7hm z#qhjgo6$0(9OFiCMRv>hvoW`co{5u5s!5(ng~@!AO(r)@@=YsDo9a!cnQk`~F^e`U zHET6nV|LQ)zL~VSh52#w3X4XIZj0p>=PmAAytN3ntg~dc(zdd+dTPyVBV(g%qithg zV`5`rlW5a!v(#pd%?6t-Hal$g*c`AqVspYq$X3Eu##X^r#kR|Ks_h2b?Y4Vt57-{D zeQL{Z=V<3)=VKRO7h)G-S07`SV3%UI&Tfm{4!b>e2SCN+1V#qXl&88uoI!=bJOf3; zsfMCP!A3DgRYq@&b{fAh{%GuO5@4chYGLYa8gHs-re$VkZf~w_QEE|VvCM+O(%e$d zD#R+@s?q9-m5{Zkb+UD*wWdvo%_N%@HcxCAZ56<+jsLcOc8&FR)9mKhU9o#$r(kby zUt-^Hf5rZm{X=_(1&j<|7#JAL4Dt*b4K5il8Cn|p8aub4oh{b1gjNR;x;-qW;Ql9 zPBtDkYiu^!INAk(TT|EV9^1XQ`)9{#uWs*b?`y<_&p zOvOCiYL&IBZN0W_pl!HqrER^f8mLk^z{rrpz`$_K@RZ>>!%K$O3~w3UGkj#oXDn%~ zVeDaCX?)0-*TmYi&@|Jm+N{@XzS%~z!)8~_o}2wN<2IKy*Ee@GPcSbsZ!w={zQWwj zda<>#jgak9+efy^cBOX0_BQsZ_Qm#<_FF-AU0`Ggsb^qd@HI#^*kO=tm}NM@aJnJ8 zk-U+=(OlCmvw!9+7Fret7XB8Y79T9NZ1il5Y|Lz|Z0u~DY}{=4?6mAE>}J|6usd#d z#qOrvb30M{llBY`AR!oIe9-u;v8zeENrp*~X`bm0(<7!2OqI<{%_f^IHoIuXV$NkQ zWbR{LKgE2N`Cjw;=FiNHEZi&_Ev8#6wm4yN-h#(c)KbAx-_p-A(Q=~YI?FSb4=rC? z=2#V3ZM52Mb=c~cm5{Z)^;MfYHa)fzZKvDLv;AW`6XdH8kZO68!Cr&w2Ja1i8SofJ z85S9an$(-DF}Y;&&qTu1&NRlf#H`h9rrG>@vn6IC=F;YS&5xM>GS{-Gw^(5D&VtKQ z+mh4T-1@fl8JkNs*KBUvJhXXg^V;UU%~zYBHveo`Y&mTCY$17E$yUwQ+;*Mq1-lz| z3=B*RAq)%*4F*Dna)xURw-_EUJZ~6nRAjW$NWs|2#LMK9X^YteGdXiLb0c#{^Rwpl zPt4^kmRYdbNZ9n)Pq3e2Kf`{G{Q~+!*atphWiX38)_RF8yi_0{WoGawlH=#4l|x)eBPMX#M30lq|&6(q|=1mG}CmK z>3p+YW*5w!nY}YpuoAUav)+Ewpd-T`d}qsZD1W>onu{KJ;8d7^#J5abU%$f-0l0v_&|J|@!9AXER#J2^_adUO}-!`!gN1rbHAWHBjdcu=Y>QWJ2pQR z5@2KupZra@n(4Oi=3)_Uc1FF;_0p3V8KWl)$?7uZZg!AuVN^M=)rlcE>@$D8>xu4< zoxVrX`14sWY;|G)iQEVW@g8iQ{6cOMaWdLZ=CcoB`u}osioGc#e+{x>Vw9e26#9opZWbd$7DHA_P{51g%~oOj9E{A9z2eTudY@uo=>E`r zgr&1|N$a;#kzO~!__%0Lu$_G&HQ6{`Tm1A%1_rQmn~$)-rEZ?sTpI7q$n@s$X!o1uHymNz9~=KMFfcM~-e0(jnXzheRcR<=?c@uk28=nA8Ot;nS4`F_ z^JKcYadK&yDJa2}nSr9Dtdfy&#^#ucRZL7@H&5oMp24_g^TO&hMn>1k9JT8hr%m2o z>&#d*`FCvs)5n#YW9u>*8QUfwueTD(*Z^|1fbqBB|Dpj7P7JU6UKmdnZE%q1SqYM0 z>1+-7|NnpMfl`rPXGU;H|1duL;@0xXB@K2=+t*JHcp$R*M1u&Uu<%|}>_ z&w|6?Mcm}~jiJ&SpFrmD^tM*~|NlQMV@0nMLq-Dw14FJ?N(o=D~l#qwN``Df2%R0@?@>H5P`UG28PxH{4RS_{{H_To)NIQ zuT7Sbao^@O?JA6n6DMEnC}Dasf3kaL2)E^Yu&v$aUL2pitW$xT56+)6`C_L6_v3jm z`NGM6Iu(_+!}+ek3=EB}34j0p?_gnI_}?1y_y7Ok7jNcGw(p7*RtaKY=?una7{Xu3ZRY7QVqsLCY(HToqvPb46P_|oo_v1d ze8%0A^Cw+al%EDNf~EUIuPaX$LqG$s*Hrq+d=1naI*yyMUp@aNh$4XNGRJ)&nJ+ z0WZ!^j-D>9dTjzEp)UkUK_nJHv~>Ia={_EBd^YaIrpdFXdok8bem32Vk$1A}3`NGc z$@Vkacv2>S%oh1y`sYRD=8H2L8JT|dP7ax+z;vT`a@j0-#_f}*&5D++z6nyrV|<{4 zt+Tb`*Z=?ji$(qy3%uAonQOL%WX4t}hF;e#&2Kn9@gsYIe{%HfaK>4iH_x_blq|rZ zD1I{c+!(0}9I~$_O>UeU!q_wU+FT{ZlFdKorZO_dZH}M6fKep(GT2SMty%y6|Ic#B zVhDHEam|z-AeL>)g5o z;k!kXrI%Pr^0tEHSUOulGTk3C7+e?_vKYc%Fig%}A}yaF+aIeD+2E=6y@OV4;Gk-E*?y@-RtAs9?(8nw+>oZ1S?@izFMse#KP5IXQ7f zy;KJd*~0e86PJrk7Fg*iH3Nr|A8lYIohu!r7T{3Q0a7A9`Pa%s#>CArtG+NwK|&tW zHHwLt&9R&p&kMV)d z)(Nlv|Nmbu^1oc*g~8AJjJUZQa5s zo?Zm<5eq0&wk~<~|G)9s__*j7C7W+-nx16 zzDP#KnVaA4cVlD>nrw1VN%L|#*bw9Y|4R?NI0oSazu21&D$f5jA7SY}4l(xJiz7IWaJQ=xu%Q z`~Uxp70a9$0$xm;+;>_=uOo+n;r~{Ua28`0W5$MMP7E(f;9@UQ!9k$X?fU~%D3wmW zaoU72dou4CFUhabkVso0Q2M6Z_YXL?7@vJ{FM4vp89m0<$@9uvn&LuWa)KhjE@7g;j$RA7(m*L;3kA+F^0bo%wzxy zb4^w~JAr*m5(7ini@eEu&Pp??PQG#0h0%Ai>^TP={$(J;czRoR{QdtwV-5oYLwLZ8 zUrV8a5&sZ^PnS;aJZHeTdGfAvQ$eA6zMrvo^MmsX8JS+hO>VxZ#kgnkx{K0`3nrhs zXbYF8}$-uwu@XVlqu<#eo zld~>wVtT;7S?-DeBct48{j2JX%O;0k4QJdpdHq#CM*q$KuHIxcbmi#|

T7H~!Y? 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 Sn!`rJ#>K{CyXFU$>x=;Nn!U*Y diff --git a/INSTALL/VentoyWeb.sh b/INSTALL/VentoyWeb.sh index bb6a910a..721e419a 100644 --- a/INSTALL/VentoyWeb.sh +++ b/INSTALL/VentoyWeb.sh @@ -97,6 +97,11 @@ if [ -f ./tool/$TOOLDIR/V2DServer.xz ]; then chmod +x ./tool/$TOOLDIR/V2DServer fi + +V2DServer "$HOST" "$PORT" & +wID=$! +sleep 1 + vtVer=$(cat ventoy/version) echo "" echo "===============================================================" @@ -112,7 +117,7 @@ echo "" echo "################## Press Ctrl + C to exit #####################" echo "" -V2DServer "$HOST" "$PORT" +wait $wID if [ -n "$OLDDIR" ]; then CURDIR=$(pwd) diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index a7d44ca3..3f44dad5 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -1546,7 +1546,7 @@ function img_unsupport_menuentry { ############################################################# ############################################################# -set VENTOY_VERSION="1.0.35" +set VENTOY_VERSION="1.0.36" #ACPI not compatible with Window7/8, so disable by default set VTOY_PARAM_NO_ACPI=1 diff --git a/INSTALL/tool/VentoyWorker.sh b/INSTALL/tool/VentoyWorker.sh index ac2102c8..c820ffc4 100644 --- a/INSTALL/tool/VentoyWorker.sh +++ b/INSTALL/tool/VentoyWorker.sh @@ -125,11 +125,7 @@ if [ "$MODE" = "list" ]; then fi #check mountpoint -grep "^$DISK" /proc/mounts | while read mtline; do - mtpnt=$(echo $mtline | awk '{print $2}') - vtdebug "Trying to umount $mtpnt ..." - umount $mtpnt >/dev/null 2>&1 -done +check_umount_disk "$DISK" if grep "$DISK" /proc/mounts; then vterr "$DISK is already mounted, please umount it first!" @@ -299,6 +295,9 @@ if [ "$MODE" = "install" ]; then xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1 fi + # check and umount + check_umount_disk "$DISK" + xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector #test UUID @@ -317,10 +316,7 @@ if [ "$MODE" = "install" ]; then vtinfo "esp partition processing ..." sleep 1 - mtpnt=$(grep "^${PART2}" /proc/mounts | awk '{print $2}') - if [ -n "$mtpnt" ]; then - umount $mtpnt >/dev/null 2>&1 - fi + check_umount_disk "$DISK" if [ "$SECUREBOOT" != "YES" ]; then mkdir ./tmp_mnt @@ -332,10 +328,7 @@ if [ "$MODE" = "install" ]; then break fi - mtpnt=$(grep "^${PART2}" /proc/mounts | awk '{print $2}') - if [ -n "$mtpnt" ]; then - umount $mtpnt >/dev/null 2>&1 - fi + check_umount_disk "$DISK" sleep 2 done @@ -349,6 +342,8 @@ if [ "$MODE" = "install" ]; then mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI mv ./tmp_mnt/EFI/BOOT/grubia32_real.efi ./tmp_mnt/EFI/BOOT/BOOTIA32.EFI + sync + for tt in 1 2 3; do if umount ./tmp_mnt; then vtdebug "umount part2 success" @@ -439,15 +434,19 @@ else dd status=none conv=fsync if=./rsvdata.bin seek=2040 bs=512 count=8 of=${DISK} rm -f ./rsvdata.bin + check_umount_disk "$DISK" + xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start sync - + if [ "$SECUREBOOT" != "YES" ]; then mkdir ./tmp_mnt vtdebug "mounting part2 ...." - for tt in 1 2 3 4 5; do + for tt in 1 2 3 4 5; do + check_umount_disk "$DISK" + if mount ${PART2} ./tmp_mnt > /dev/null 2>&1; then vtdebug "mounting part2 success" break @@ -467,6 +466,7 @@ else mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI mv ./tmp_mnt/EFI/BOOT/grubia32_real.efi ./tmp_mnt/EFI/BOOT/BOOTIA32.EFI + sync for tt in 1 2 3; do if umount ./tmp_mnt > /dev/null 2>&1; then diff --git a/INSTALL/tool/ventoy_lib.sh b/INSTALL/tool/ventoy_lib.sh index c108197a..a394eb14 100644 --- a/INSTALL/tool/ventoy_lib.sh +++ b/INSTALL/tool/ventoy_lib.sh @@ -97,6 +97,14 @@ get_disk_part_name() { fi } +check_umount_disk() { + DiskOrPart="$1" + grep "^${DiskOrPart}" /proc/mounts | while read mtline; do + mtpnt=$(echo $mtline | awk '{print $2}') + vtdebug "Trying to umount $mtpnt ..." + umount $mtpnt >/dev/null 2>&1 + done +} get_ventoy_version_from_cfg() { if grep -q 'set.*VENTOY_VERSION=' $1; then @@ -218,6 +226,14 @@ format_ventoy_disk_mbr() { fi part2_start_sector=$(expr $part1_end_sector + 1) + + modsector=$(expr $part2_start_sector % 8) + if [ $modsector -gt 0 ]; then + vtdebug "modsector:$modsector need to be aligned with 4KB" + part1_end_sector=$(expr $part1_end_sector - $modsector) + part2_start_sector=$(expr $part1_end_sector + 1) + fi + part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1) export part2_start_sector @@ -302,6 +318,8 @@ EOF echo "create efi fat fs $PART2 ..." for i in 0 1 2 3 4 5 6 7 8 9; do + check_umount_disk "$PART2" + if mkfs.vfat -F 16 -n VTOYEFI $PART2; then echo 'success' break @@ -333,6 +351,14 @@ format_ventoy_disk_gpt() { fi part2_start_sector=$(expr $part1_end_sector + 1) + + modsector=$(expr $part2_start_sector % 8) + if [ $modsector -gt 0 ]; then + vtdebug "modsector:$modsector need to be aligned with 4KB" + part1_end_sector=$(expr $part1_end_sector - $modsector) + part2_start_sector=$(expr $part1_end_sector + 1) + fi + part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1) export part2_start_sector @@ -397,7 +423,10 @@ format_ventoy_disk_gpt() { fi echo "create efi fat fs $PART2 ..." + for i in 0 1 2 3 4 5 6 7 8 9; do + check_umount_disk "$PART2" + if mkfs.vfat -F 16 -n VTOYEFI $PART2; then echo 'success' break diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c b/LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c index 4d0871b8..4df2040e 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c @@ -330,6 +330,7 @@ static int fatlib_is_secure_boot_enable(void) flfile = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); if (flfile) { + vlog("/EFI/BOOT/grubx64_real.efi find, secure boot in enabled\n"); fl_fclose(flfile); return 1; } @@ -504,7 +505,10 @@ int ventoy_get_vtoy_data(ventoy_disk *info, int *ppartstyle) goto end; } - vdebug("now check secure boot ...\n"); + vdebug("ventoy partition layout check OK: [%llu %llu] [%llu %llu]\n", + part1_start_sector, part1_sector_count, part2_start_sector, part2_sector_count); + + vdebug("now check secure boot for %s ...\n", info->disk_path); g_fatlib_media_fd = fd; g_fatlib_media_offset = part2_start_sector; @@ -546,7 +550,7 @@ int ventoy_get_vtoy_data(ventoy_disk *info, int *ppartstyle) rc = 0; end: - close(fd); + vtoy_safe_close_fd(fd); return rc; } diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c b/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c index 469f843e..6e788c2f 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c @@ -80,6 +80,34 @@ void ventoy_syslog_newline(int level, const char *Fmt, ...) pthread_mutex_unlock(&g_log_mutex); } +void ventoy_syslog_printf(const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); + vsnprintf(log, 512, Fmt, arg); + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + fp = fopen(VTOY_LOG_FILE, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + } + pthread_mutex_unlock(&g_log_mutex); +} + void ventoy_syslog(int level, const char *Fmt, ...) { char log[512]; diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.c b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.c index 562c3a09..d15a4191 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.c +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.c @@ -347,6 +347,7 @@ static int ventoy_fill_gpt_partname(uint16_t Name[36], const char *asciiName) int ventoy_fill_gpt(uint64_t size, uint64_t reserve, int align4k, VTOY_GPT_INFO *gpt) { uint64_t ReservedSector = 33; + uint64_t ModSectorCount = 0; uint64_t Part1SectorCount = 0; uint64_t DiskSectorCount = size / 512; VTOY_GPT_HDR *Head = &gpt->Head; @@ -362,18 +363,28 @@ int ventoy_fill_gpt(uint64_t size, uint64_t reserve, int align4k, VTOY_GPT_INFO ReservedSector += reserve / 512; } + Part1SectorCount = DiskSectorCount - ReservedSector - (VTOYEFI_PART_BYTES / 512) - 2048; + + ModSectorCount = (Part1SectorCount % 8); + if (ModSectorCount) + { + vlog("Part1SectorCount:%llu is not aligned by 4KB (%llu)\n", (_ull)Part1SectorCount, (_ull)ModSectorCount); + } + // check aligned with 4KB if (align4k) { - if (DiskSectorCount % 8) + if (ModSectorCount) { - vdebug("Disk need to align with 4KB %u\n", (uint32_t)(DiskSectorCount % 8)); - ReservedSector += (DiskSectorCount % 8); + vdebug("Disk need to align with 4KB %u\n", (uint32_t)ModSectorCount); + Part1SectorCount -= ModSectorCount; + } + else + { + vdebug("no need to align with 4KB\n"); } } - Part1SectorCount = DiskSectorCount - ReservedSector - (VTOYEFI_PART_BYTES / 512) - 2048; - memcpy(Head->Signature, "EFI PART", 8); Head->Version[2] = 0x01; Head->Length = 92; @@ -461,7 +472,7 @@ int VentoyFillMBRLocation(uint64_t DiskSizeInBytes, uint32_t StartSectorId, uint return 0; } -int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, int PartStyle, MBR_HEAD *pMBR) +int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR) { ventoy_guid Guid; uint32_t DiskSignature; @@ -498,11 +509,6 @@ int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, int PartStyle, ReservedSector = (uint32_t)(reserve / 512); } - if (PartStyle) - { - ReservedSector += 33; // backup GPT part table - } - // check aligned with 4KB if (align4k) { @@ -512,11 +518,14 @@ int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, int PartStyle, vlog("Disk need to align with 4KB %u\n", (uint32_t)(sectors % 8)); ReservedSector += (uint32_t)(sectors % 8); } + else + { + vdebug("no need to align with 4KB\n"); + } } vlog("ReservedSector: %u\n", ReservedSector); - //Part1 PartStartSector = VTOYIMG_PART_START_SECTOR; PartSectorCount = DiskSectorCount - ReservedSector - VTOYEFI_PART_BYTES / 512 - PartStartSector; diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h index eb093106..72cec62d 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h @@ -46,7 +46,7 @@ int unxz(unsigned char *in, int in_size, int ventoy_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen); const char * ventoy_get_local_version(void); int ventoy_fill_gpt(uint64_t size, uint64_t reserve, int align4k, VTOY_GPT_INFO *gpt); -int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, int PartStyle, MBR_HEAD *pMBR); +int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR); #endif /* __VENTOY_UTIL_H__ */ diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/API.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/API.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/API.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/API.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/COPYRIGHT.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/COPYRIGHT.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/COPYRIGHT.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/COPYRIGHT.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/Configuration.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/Configuration.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/Configuration.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/Configuration.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/History.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/History.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/History.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/History.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/License.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/License.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/License.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/License.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/Media Access API.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/Media Access API.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/Media Access API.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/Media Access API.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/buildlib.sh b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/buildlib.sh deleted file mode 100644 index dec432f7..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/buildlib.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -rm -rf include -rm -rf lib - -cd release -gcc -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c -ar -rc libfat_io_64.a *.o -rm -f *.o - - -gcc -m32 -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c -ar -rc libfat_io_32.a *.o -rm -f *.o - - -aarch64-linux-gnu-gcc -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c -ar -rc libfat_io_aa64.a *.o -rm -f *.o - - -cd - - - -mkdir lib -mkdir include - -mv release/*.a lib/ -cp -a release/*.h include/ - diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_access.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_access.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_access.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_access.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_access.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_access.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_access.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_access.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_cache.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_cache.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_cache.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_cache.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_cache.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_cache.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_cache.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_cache.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_defs.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_defs.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_defs.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_defs.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_filelib.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_filelib.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_filelib.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_filelib.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_format.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_format.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_format.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_format.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_format.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_format.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_format.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_format.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_list.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_list.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_list.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_list.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_misc.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_misc.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_misc.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_misc.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_misc.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_misc.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_opts.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_opts.h similarity index 83% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_opts.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_opts.h index ac4dc860..6db158c4 100644 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_opts.h +++ b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_opts.h @@ -63,7 +63,7 @@ // Include support for formatting disks (1 / 0)? #ifndef FATFS_INC_FORMAT_SUPPORT - #define FATFS_INC_FORMAT_SUPPORT 1 + #define FATFS_INC_FORMAT_SUPPORT 0 #endif // Sector size used @@ -71,15 +71,8 @@ // Printf output (directory listing / debug) #ifndef FAT_PRINTF - // Don't include stdio, but there is a printf function available - #ifdef FAT_PRINTF_NOINC_STDIO - extern int printf(const char* ctrl1, ... ); - #define FAT_PRINTF(a) printf a - // Include stdio to use printf - #else - #include - #define FAT_PRINTF(a) printf a - #endif + void ventoy_syslog_printf(const char *Fmt, ...); + #define FAT_PRINTF(a) ventoy_syslog_printf a #endif // Time/Date support requires time.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_string.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_string.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_string.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_string.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_string.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_string.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_table.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_table.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_table.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_table.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_table.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_table.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_types.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_types.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_types.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_types.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_write.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_write.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_write.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_write.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_write.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_write.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_32.a b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_32.a deleted file mode 100644 index e68fa3865044193a9c77cdde9634650b9a512eba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45670 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 GsRIBcTapF< diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_64.a b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_64.a deleted file mode 100644 index 8598a87c74e5b726f4b3a04750741feee31c6799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58226 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 diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/example.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/example.c deleted file mode 100644 index 5d30e5b6..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/example.c +++ /dev/null @@ -1,87 +0,0 @@ -#include -#include "fat_filelib.h" - -int media_init() -{ - // ... - return 1; -} - -int media_read(unsigned long sector, unsigned char *buffer, unsigned long sector_count) -{ - unsigned long i; - - for (i=0;im))) : 0 -#define fat_list_next(l, p) (p)->next -#define fat_list_prev(l, p) (p)->previous -#define fat_list_first(l) (l)->head -#define fat_list_last(l) (l)->tail -#define fat_list_for_each(l, p) for ((p) = (l)->head; (p); (p) = (p)->next) - -//----------------------------------------------------------------- -// Inline Functions -//----------------------------------------------------------------- - -//----------------------------------------------------------------- -// fat_list_init: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_init(struct fat_list *list) -{ - FAT_ASSERT(list); - - list->head = list->tail = 0; -} -//----------------------------------------------------------------- -// fat_list_remove: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_remove(struct fat_list *list, struct fat_node *node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - - if(!node->previous) - list->head = node->next; - else - node->previous->next = node->next; - - if(!node->next) - list->tail = node->previous; - else - node->next->previous = node->previous; -} -//----------------------------------------------------------------- -// fat_list_insert_after: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_insert_after(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - FAT_ASSERT(new_node); - - new_node->previous = node; - new_node->next = node->next; - if (!node->next) - list->tail = new_node; - else - node->next->previous = new_node; - node->next = new_node; -} -//----------------------------------------------------------------- -// fat_list_insert_before: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_insert_before(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - FAT_ASSERT(new_node); - - new_node->previous = node->previous; - new_node->next = node; - if (!node->previous) - list->head = new_node; - else - node->previous->next = new_node; - node->previous = new_node; -} -//----------------------------------------------------------------- -// fat_list_insert_first: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_insert_first(struct fat_list *list, struct fat_node *node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - - if (!list->head) - { - list->head = node; - list->tail = node; - node->previous = 0; - node->next = 0; - } - else - fat_list_insert_before(list, list->head, node); -} -//----------------------------------------------------------------- -// fat_list_insert_last: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_insert_last(struct fat_list *list, struct fat_node *node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - - if (!list->tail) - fat_list_insert_first(list, node); - else - fat_list_insert_after(list, list->tail, node); -} -//----------------------------------------------------------------- -// fat_list_is_empty: -//----------------------------------------------------------------- -static FAT_INLINE int fat_list_is_empty(struct fat_list *list) -{ - FAT_ASSERT(list); - - return !list->head; -} -//----------------------------------------------------------------- -// fat_list_pop_head: -//----------------------------------------------------------------- -static FAT_INLINE struct fat_node * fat_list_pop_head(struct fat_list *list) -{ - struct fat_node * node; - - FAT_ASSERT(list); - - node = fat_list_first(list); - if (node) - fat_list_remove(list, node); - - return node; -} - -#endif - diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.h deleted file mode 100644 index 0c026343..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef __FAT_MISC_H__ -#define __FAT_MISC_H__ - -#include "fat_defs.h" -#include "fat_opts.h" - -//----------------------------------------------------------------------------- -// Defines -//----------------------------------------------------------------------------- -#define MAX_LONGFILENAME_ENTRIES 20 -#define MAX_LFN_ENTRY_LENGTH 13 - -//----------------------------------------------------------------------------- -// Macros -//----------------------------------------------------------------------------- -#define GET_32BIT_WORD(buffer, location) ( ((uint32)buffer[location+3]<<24) + ((uint32)buffer[location+2]<<16) + ((uint32)buffer[location+1]<<8) + (uint32)buffer[location+0] ) -#define GET_16BIT_WORD(buffer, location) ( ((uint16)buffer[location+1]<<8) + (uint16)buffer[location+0] ) - -#define SET_32BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ - buffer[location+1] = (uint8)((value>>8)&0xFF); \ - buffer[location+2] = (uint8)((value>>16)&0xFF); \ - buffer[location+3] = (uint8)((value>>24)&0xFF); } - -#define SET_16BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ - buffer[location+1] = (uint8)((value>>8)&0xFF); } - -//----------------------------------------------------------------------------- -// Structures -//----------------------------------------------------------------------------- -struct lfn_cache -{ -#if FATFS_INC_LFN_SUPPORT - // Long File Name Structure (max 260 LFN length) - uint8 String[MAX_LONGFILENAME_ENTRIES][MAX_LFN_ENTRY_LENGTH]; - uint8 Null; -#endif - uint8 no_of_strings; -}; - -//----------------------------------------------------------------------------- -// Prototypes -//----------------------------------------------------------------------------- -void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable); -void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer); -char* fatfs_lfn_cache_get(struct lfn_cache *lfn); -int fatfs_entry_lfn_text(struct fat_dir_entry *entry); -int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry); -int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry); -int fatfs_entry_sfn_only(struct fat_dir_entry *entry); -int fatfs_entry_is_dir(struct fat_dir_entry *entry); -int fatfs_entry_is_file(struct fat_dir_entry *entry); -int fatfs_lfn_entries_required(char *filename); -void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk); -void fatfs_sfn_create_entry(char *shortfilename, uint32 size, uint32 startCluster, struct fat_dir_entry *entry, int dir); -int fatfs_lfn_create_sfn(char *sfn_output, char *filename); -int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum); -void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds); -void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year); -uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds); -uint16 fatfs_convert_to_fat_date(int day, int month, int year); -void fatfs_print_sector(uint32 sector, uint8 *data); - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_opts.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_opts.h deleted file mode 100644 index ac4dc860..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_opts.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef __FAT_OPTS_H__ -#define __FAT_OPTS_H__ - -#ifdef FATFS_USE_CUSTOM_OPTS_FILE - #include "fat_custom.h" -#endif - -//------------------------------------------------------------- -// Configuration -//------------------------------------------------------------- - -// Is the processor little endian (1) or big endian (0) -#ifndef FATFS_IS_LITTLE_ENDIAN - #define FATFS_IS_LITTLE_ENDIAN 1 -#endif - -// Max filename Length -#ifndef FATFS_MAX_LONG_FILENAME - #define FATFS_MAX_LONG_FILENAME 260 -#endif - -// Max open files (reduce to lower memory requirements) -#ifndef FATFS_MAX_OPEN_FILES - #define FATFS_MAX_OPEN_FILES 2 -#endif - -// Number of sectors per FAT_BUFFER (min 1) -#ifndef FAT_BUFFER_SECTORS - #define FAT_BUFFER_SECTORS 1 -#endif - -// Max FAT sectors to buffer (min 1) -// (mem used is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE) -#ifndef FAT_BUFFERS - #define FAT_BUFFERS 1 -#endif - -// Size of cluster chain cache (can be undefined) -// Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 -// Improves access speed considerably -//#define FAT_CLUSTER_CACHE_ENTRIES 128 - -// Include support for writing files (1 / 0)? -#ifndef FATFS_INC_WRITE_SUPPORT - #define FATFS_INC_WRITE_SUPPORT 1 -#endif - -// Support long filenames (1 / 0)? -// (if not (0) only 8.3 format is supported) -#ifndef FATFS_INC_LFN_SUPPORT - #define FATFS_INC_LFN_SUPPORT 1 -#endif - -// Support directory listing (1 / 0)? -#ifndef FATFS_DIR_LIST_SUPPORT - #define FATFS_DIR_LIST_SUPPORT 1 -#endif - -// Support time/date (1 / 0)? -#ifndef FATFS_INC_TIME_DATE_SUPPORT - #define FATFS_INC_TIME_DATE_SUPPORT 0 -#endif - -// Include support for formatting disks (1 / 0)? -#ifndef FATFS_INC_FORMAT_SUPPORT - #define FATFS_INC_FORMAT_SUPPORT 1 -#endif - -// Sector size used -#define FAT_SECTOR_SIZE 512 - -// Printf output (directory listing / debug) -#ifndef FAT_PRINTF - // Don't include stdio, but there is a printf function available - #ifdef FAT_PRINTF_NOINC_STDIO - extern int printf(const char* ctrl1, ... ); - #define FAT_PRINTF(a) printf a - // Include stdio to use printf - #else - #include - #define FAT_PRINTF(a) printf a - #endif -#endif - -// Time/Date support requires time.h -#if FATFS_INC_TIME_DATE_SUPPORT - #include -#endif - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.h deleted file mode 100644 index 90ca8e05..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __FILESTRING_H__ -#define __FILESTRING_H__ - -//----------------------------------------------------------------------------- -// Prototypes -//----------------------------------------------------------------------------- -int fatfs_total_path_levels(char *path); -int fatfs_get_substring(char *Path, int levelreq, char *output, int max_len); -int fatfs_split_path(char *FullPath, char *Path, int max_path, char *FileName, int max_filename); -int fatfs_compare_names(char* strA, char* strB); -int fatfs_string_ends_with_slash(char *path); -int fatfs_get_sfn_display_name(char* out, char* in); -int fatfs_get_extension(char* filename, char* out, int maxlen); -int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen); - -#ifndef NULL - #define NULL 0 -#endif - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.h deleted file mode 100644 index ead75f32..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __FAT_TABLE_H__ -#define __FAT_TABLE_H__ - -#include "fat_opts.h" -#include "fat_misc.h" - -//----------------------------------------------------------------------------- -// Prototypes -//----------------------------------------------------------------------------- -void fatfs_fat_init(struct fatfs *fs); -int fatfs_fat_purge(struct fatfs *fs); -uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster); -void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue); -int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster); -int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster); -int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry); -int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster); -uint32 fatfs_count_free_clusters(struct fatfs *fs); - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_types.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_types.h deleted file mode 100644 index 5e2cca8a..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_types.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef __FAT_TYPES_H__ -#define __FAT_TYPES_H__ - -// Detect 64-bit compilation on GCC -#if defined(__GNUC__) && defined(__SIZEOF_LONG__) - #if __SIZEOF_LONG__ == 8 - #define FATFS_DEF_UINT32_AS_INT - #endif -#endif - -//------------------------------------------------------------- -// System specific types -//------------------------------------------------------------- -#ifndef FATFS_NO_DEF_TYPES - typedef unsigned char uint8; - typedef unsigned short uint16; - - // If compiling on a 64-bit machine, use int as 32-bits - #ifdef FATFS_DEF_UINT32_AS_INT - typedef unsigned int uint32; - // Else for 32-bit machines & embedded systems, use long... - #else - typedef unsigned long uint32; - #endif -#endif - -#ifndef NULL - #define NULL 0 -#endif - -//------------------------------------------------------------- -// Endian Macros -//------------------------------------------------------------- -// FAT is little endian so big endian systems need to swap words - -// Little Endian - No swap required -#if FATFS_IS_LITTLE_ENDIAN == 1 - - #define FAT_HTONS(n) (n) - #define FAT_HTONL(n) (n) - -// Big Endian - Swap required -#else - - #define FAT_HTONS(n) ((((uint16)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8)) - #define FAT_HTONL(n) (((((uint32)(n) & 0xFF)) << 24) | \ - ((((uint32)(n) & 0xFF00)) << 8) | \ - ((((uint32)(n) & 0xFF0000)) >> 8) | \ - ((((uint32)(n) & 0xFF000000)) >> 24)) - -#endif - -//------------------------------------------------------------- -// Structure Packing Compile Options -//------------------------------------------------------------- -#ifdef __GNUC__ - #define STRUCT_PACK - #define STRUCT_PACK_BEGIN - #define STRUCT_PACK_END - #define STRUCT_PACKED __attribute__ ((packed)) -#else - // Other compilers may require other methods of packing structures - #define STRUCT_PACK - #define STRUCT_PACK_BEGIN - #define STRUCT_PACK_END - #define STRUCT_PACKED -#endif - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.h deleted file mode 100644 index 5558a86e..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __FAT_WRITE_H__ -#define __FAT_WRITE_H__ - -#include "fat_defs.h" -#include "fat_opts.h" - -//----------------------------------------------------------------------------- -// Prototypes -//----------------------------------------------------------------------------- -int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir); -int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters); -int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size); - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/version.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/version.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/version.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/version.txt diff --git a/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c b/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c index 755a08c2..e7329d8a 100644 --- a/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c +++ b/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c @@ -346,6 +346,8 @@ static int ventoy_clean_disk(int fd, uint64_t size) len = write(fd, buf, zerolen); vdebug("write disk at off:%llu writelen:%lld datalen:%d\n", (_ull)offset, (_ll)len, zerolen); + fsync(fd); + free(buf); return 0; } @@ -800,7 +802,7 @@ static void * ventoy_install_thread(void *data) else { vdebug("Fill MBR part table\n"); - ventoy_fill_mbr(disk->size_in_byte, thread->reserveBytes, thread->align4kb, 0, &MBR); + ventoy_fill_mbr(disk->size_in_byte, thread->reserveBytes, thread->align4kb, &MBR); Part1StartSector = MBR.PartTbl[0].StartSectorId; Part1SectorCount = MBR.PartTbl[0].SectorCount; Part2StartSector = MBR.PartTbl[1].StartSectorId; diff --git a/LinuxGUI/WebUI/index.html b/LinuxGUI/WebUI/index.html index c77ee448..8b166927 100644 --- a/LinuxGUI/WebUI/index.html +++ b/LinuxGUI/WebUI/index.html @@ -342,6 +342,7 @@ var vtoy_cur_process_disk_name; var vtoy_chrome_app_mode = (window.location.href.indexOf('chrome-app') >= 0) ? 1 : 0; + function sort_language_list() { var tmp; for (var i = 0; i < vtoy_language_data.length; i++) { diff --git a/LinuxGUI/build.sh b/LinuxGUI/build.sh index 21830acc..001c4850 100644 --- a/LinuxGUI/build.sh +++ b/LinuxGUI/build.sh @@ -5,9 +5,9 @@ build_func() { toolDir=$3 XXFLAG='-std=gnu99 -D_FILE_OFFSET_BITS=64' - XXLIB="./Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_${libsuffix}.a" + XXLIB="" - echo "CC=$1 libsuffix=$libsuffix" + echo "CC=$1 libsuffix=$libsuffix toolDir=$toolDir" $1 $XXFLAG -c -Wall -Wextra -Wshadow -Wformat-security -Winit-self \ -Wmissing-prototypes -O2 -DLINUX \ @@ -29,6 +29,7 @@ build_func() { -I./Ventoy2Disk/Lib/xz-embedded/userspace \ -I ./Ventoy2Disk/Lib/exfat/src/libexfat \ -I ./Ventoy2Disk/Lib/exfat/src/mkfs \ + -I ./Ventoy2Disk/Lib/fat_io_lib \ \ -L ./Ventoy2Disk/Lib/fat_io_lib/lib \ Ventoy2Disk/*.c \ @@ -37,6 +38,7 @@ build_func() { Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c \ Ventoy2Disk/Lib/exfat/src/libexfat/*.c \ Ventoy2Disk/Lib/exfat/src/mkfs/*.c \ + Ventoy2Disk/Lib/fat_io_lib/*.c \ $XXLIB \ -l pthread \ ./civetweb.o \ diff --git a/Ventoy2Disk/Ventoy2Disk/Utility.c b/Ventoy2Disk/Ventoy2Disk/Utility.c index cf86fef4..800855e6 100644 --- a/Ventoy2Disk/Ventoy2Disk/Utility.c +++ b/Ventoy2Disk/Ventoy2Disk/Utility.c @@ -592,6 +592,7 @@ int VentoyFillWholeGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) { INT64 ReservedValue = 0; + UINT64 ModSectorCount = 0; UINT64 ReservedSector = 33; UINT64 Part1SectorCount = 0; UINT64 DiskSectorCount = DiskSizeBytes / 512; @@ -609,18 +610,28 @@ int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) ReservedSector += ReservedValue * 2048; } + Part1SectorCount = DiskSectorCount - ReservedSector - (VENTOY_EFI_PART_SIZE / 512) - 2048; + + ModSectorCount = (Part1SectorCount % 8); + if (ModSectorCount) + { + Log("Part1SectorCount:%llu is not aligned by 4KB (%llu)", (ULONGLONG)Part1SectorCount, (ULONGLONG)ModSectorCount); + } + // check aligned with 4KB if (IsPartNeed4KBAlign()) { - if (DiskSectorCount % 8) + if (ModSectorCount) { - Log("Disk need to align with 4KB %u", (UINT32)(DiskSectorCount % 8)); - ReservedSector += (DiskSectorCount % 8); + Log("Disk need to align with 4KB %u", (UINT32)ModSectorCount); + Part1SectorCount -= ModSectorCount; + } + else + { + Log("no need to align with 4KB"); } } - Part1SectorCount = DiskSectorCount - ReservedSector - (VENTOY_EFI_PART_SIZE / 512) - 2048; - memcpy(Head->Signature, "EFI PART", 8); Head->Version[2] = 0x01; Head->Length = 92;