mirror of
https://github.com/ventoy/Ventoy.git
synced 2026-04-23 22:26:18 +00:00
Compare commits
88 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dba7530b21 | ||
|
|
e9b4c86082 | ||
|
|
dbcdf51950 | ||
|
|
de3e6c6d1d | ||
|
|
3c0df07b92 | ||
|
|
c1c27cd30c | ||
|
|
167c87402c | ||
|
|
d35b8431fe | ||
|
|
a1771bd9b8 | ||
|
|
ed61a955bf | ||
|
|
e7cf29fd9d | ||
|
|
b5d87d394a | ||
|
|
36da0e0f3d | ||
|
|
903fd7aa01 | ||
|
|
81728a817c | ||
|
|
f68d4a8076 | ||
|
|
f6c248e983 | ||
|
|
0906cd34fe | ||
|
|
d3b911d249 | ||
|
|
5c6e1c2446 | ||
|
|
3a97ab9165 | ||
|
|
6fe6231790 | ||
|
|
9564f125a7 | ||
|
|
e380575b91 | ||
|
|
0fd49126bd | ||
|
|
a466d787b8 | ||
|
|
ab5d00bafb | ||
|
|
450caa6654 | ||
|
|
ef93b55c91 | ||
|
|
4d7fcc26d4 | ||
|
|
3597f15814 | ||
|
|
f7e4a7a6ec | ||
|
|
65b88aabc5 | ||
|
|
c42abd33c2 | ||
|
|
af34df278f | ||
|
|
68fd17df5b | ||
|
|
628a72db2f | ||
|
|
a20ee878df | ||
|
|
3de3a36e9f | ||
|
|
06f164ef70 | ||
|
|
40fbc041ea | ||
|
|
935516ed49 | ||
|
|
a71d4513e4 | ||
|
|
82fef5314b | ||
|
|
052a0152e4 | ||
|
|
5fae0ca35f | ||
|
|
6482f2e7b3 | ||
|
|
bd8aebf166 | ||
|
|
3c05d55b8a | ||
|
|
92ed0c995e | ||
|
|
dc7e310828 | ||
|
|
67d7091255 | ||
|
|
2ab1474694 | ||
|
|
aa7a77df5a | ||
|
|
4790dedbb1 | ||
|
|
de085ba086 | ||
|
|
bb94ec6d6f | ||
|
|
b9892660b5 | ||
|
|
0e9d34422a | ||
|
|
c7c9c62ec7 | ||
|
|
9e13955af1 | ||
|
|
2dafe75509 | ||
|
|
6fbc08cfcb | ||
|
|
6034b25cba | ||
|
|
c5fd64d21c | ||
|
|
32fac72b5b | ||
|
|
022322c8fa | ||
|
|
96f11252d9 | ||
|
|
004ad27e0d | ||
|
|
9a8dc42d93 | ||
|
|
6166a813ea | ||
|
|
786a9ec678 | ||
|
|
0600576c78 | ||
|
|
72b722c86c | ||
|
|
bea5607ea5 | ||
|
|
b3c2bcf58f | ||
|
|
4e8d8b2e19 | ||
|
|
60d88cb7b1 | ||
|
|
f7e6bbc70c | ||
|
|
ee994a0569 | ||
|
|
966ed21de7 | ||
|
|
ff7ee9c10e | ||
|
|
f43461a16c | ||
|
|
377e3fb7bc | ||
|
|
f62bd1be14 | ||
|
|
b11c38779d | ||
|
|
f202542c62 | ||
|
|
279491a36a |
14
.github/workflows/ci.yml
vendored
14
.github/workflows/ci.yml
vendored
@@ -13,25 +13,25 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Run docker-compose up
|
||||
run: docker-compose up
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Run docker compose up
|
||||
run: docker compose up
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ventoy-windows
|
||||
path: INSTALL/ventoy-*windows*
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ventoy-linux
|
||||
path: INSTALL/ventoy-*linux*
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ventoy-livecd
|
||||
path: INSTALL/ventoy-*livecd*
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: SHA256SUM
|
||||
path: INSTALL/sha256.txt
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: xxx-build-log
|
||||
path: DOC/build.log
|
||||
|
||||
194
BLOB_List.md
Normal file
194
BLOB_List.md
Normal file
@@ -0,0 +1,194 @@
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>BLOB</th>
|
||||
<th>File Source</th>
|
||||
<th>Desc</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr> <td>./BUSYBOX/chmod/vtchmod32</td> <td rowspan=5>build</td> <td rowspan=5>Build Instructions:<br/> ./BUSYBOX/chmod/build.sh</td> </tr>
|
||||
<tr> <td>./BUSYBOX/chmod/vtchmod64</td> </tr>
|
||||
<tr> <td>./BUSYBOX/chmod/vtchmod64_musl</td> </tr>
|
||||
<tr> <td>./BUSYBOX/chmod/vtchmodaa64</td> </tr>
|
||||
<tr> <td>./BUSYBOX/chmod/vtchmodm64e</td> </tr>
|
||||
<tr> <td>./cryptsetup/veritysetup32</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/> ./cryptsetup/cryptsetup-build.txt</td> </tr>
|
||||
<tr> <td>./cryptsetup/veritysetup64</td> </tr>
|
||||
<tr> <td>./DMSETUP/dmsetup32</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/> ./DMSETUP/build.txt</td> </tr>
|
||||
<tr> <td>./DMSETUP/dmsetup64</td> </tr>
|
||||
<tr> <td>./DMSETUP/dmsetupaa64</td> </tr>
|
||||
<tr> <td>./DMSETUP/dmsetupm64e</td> </tr>
|
||||
<tr> <td>./FUSEISO/vtoy_fuse_iso_32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/> ./FUSEISO/build.sh<br/>./FUSEISO/build_aarch64.sh<br/>./FUSEISO/build_libfuse.sh<br/>./FUSEISO/build_libfuse_aarch64.sh </td> </tr>
|
||||
<tr> <td>./FUSEISO/vtoy_fuse_iso_64</td> </tr>
|
||||
<tr> <td>./FUSEISO/vtoy_fuse_iso_aa64</td> </tr>
|
||||
<tr> <td>./IMG/cpio_arm64/ventoy/busybox/a64</td> <td>build</td> <td>Build Instructions:<br/>./BUSYBOX/build.txt ash</td> </tr>
|
||||
<tr> <td>./IMG/cpio_arm64/ventoy/busybox/vtchmodaa64</td> <td>build</td> <td>Same with ./BUSYBOX/chmod/vtchmodaa64<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_arm64/ventoy/busybox/xzminidecaa64</td> <td>build</td> <td>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.17</td> </tr>
|
||||
<tr> <td>./IMG/cpio_arm64/ventoy/tool/lz4cataa64</td> <td>build</td> <td>Same with ./LZIP/lz4cataa64<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_arm64/ventoy/tool/zstdcataa64</td> <td>build</td> <td>Same with ./ZSTD/zstdcataa64<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_mips64/ventoy/busybox/m64</td> <td>build</td> <td>Build Instructions:<br/>./BUSYBOX/build.txt ash</td> </tr>
|
||||
<tr> <td>./IMG/cpio_mips64/ventoy/busybox/vtchmodm64e</td> <td>build</td> <td>Same with ./BUSYBOX/chmod/vtchmodm64e<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_mips64/ventoy/busybox/xzminidecm64e</td> <td>build</td> <td>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.18</td> </tr>
|
||||
<tr> <td>./IMG/cpio_mips64/ventoy/tool/lz4catm64e</td> <td>build</td> <td>Same with ./LZIP/lz4catm64e<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/64h</td> <td>build</td> <td>Build Instructions:<br/>./BUSYBOX/build.txt ash</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/ash</td> <td>upstream</td> <td>Download from BusyBox website.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.4</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/vtchmod32</td> <td>build</td> <td>Same with ./BUSYBOX/chmod/vtchmod32<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/vtchmod64</td> <td>build</td> <td>Same with ./BUSYBOX/chmod/vtchmod64<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/vtchmod64_musl</td> <td>build</td> <td>Same with ./BUSYBOX/chmod/vtchmod64_musl<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/xzminidec32</td> <td>build</td> <td>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.15</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/xzminidec64</td> <td>build</td> <td>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.16</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/xzminidec64_musl</td> <td>build</td> <td>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.16</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/tool/ar</td> <td>upstream</td> <td>Download from BusyBox website.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.2</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/tool/inotifyd</td> <td>upstream</td> <td>Download from BusyBox website.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.3</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/tool/lz4cat</td> <td>upstream</td> <td>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.1</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/tool/lz4cat64</td> <td>build</td> <td>Build Instructions:<br/>./LZIP/buildlz4.txt</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/tool/zstdcat</td> <td>build</td> <td>Same with ./ZSTD/zstdcat<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/tool/zstdcat64</td> <td>build</td> <td>Same with ./ZSTD/zstdcat64<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/BOOTAA64.EFI</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/> ./DOC/BuildVentoyFromSource.txt 4.1-Build grub2</td> </tr>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/BOOTMIPS.EFI</td>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/grubia32_real.efi</td>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/grubx64_real.efi</td>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/grub.efi</td> <td rowspan=6>upstream</td> <td rowspan=6>https://github.com/ValdikSS/Super-UEFIinSecureBoot-Disk </td> </tr>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/BOOTIA32.EFI</td>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/BOOTX64.EFI</td>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/grubia32.efi</td>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/mmia32.efi</td>
|
||||
<tr> <td>./INSTALL/EFI/BOOT/MokManager.efi</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/ash</td> <td rowspan=12>build</td> <td rowspan=12>Build Instructions:<br/>./DOC/BUSYBOX/build.txt</td> </tr>
|
||||
<tr> <td>./INSTALL/tool/aarch64/hexdump</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/xzcat</td>
|
||||
<tr> <td>./INSTALL/tool/i386/ash</td>
|
||||
<tr> <td>./INSTALL/tool/i386/hexdump</td>
|
||||
<tr> <td>./INSTALL/tool/i386/xzcat</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/ash</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/hexdump</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/xzcat</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/ash</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/hexdump</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/xzcat</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/Ventoy2Disk.gtk3</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./LinuxGUI/build_gtk.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/tool/i386/Ventoy2Disk.gtk3</td>
|
||||
<tr> <td>./INSTALL/tool/i386/Ventoy2Disk.gtk2</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/Ventoy2Disk.gtk3</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.gtk3</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.gtk2</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/Ventoy2Disk.qt5</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build_qt.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/tool/i386/Ventoy2Disk.qt5</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/Ventoy2Disk.qt5</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/Ventoy2Disk.qt5</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/Plugson</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Plugson/build.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/tool/i386/Plugson</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/Plugson</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/Plugson</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/V2DServer</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/tool/i386/V2DServer</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/V2DServer</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/V2DServer</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/mkexfatfs</td> <td rowspan=9>build</td> <td rowspan=8>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.9<br/>./ExFAT/buidexfat.sh<br/>./ExFAT/buidexfat_aarch64.sh<br/>./ExFAT/buidlibfuse.sh<br/>./ExFAT/buidlibfuse_aarch64.sh<br/></td> </tr>
|
||||
<tr> <td>./INSTALL/tool/aarch64/mount.exfat-fuse</td>
|
||||
<tr> <td>./INSTALL/tool/i386/mkexfatfs</td>
|
||||
<tr> <td>./INSTALL/tool/i386/mount.exfat-fuse</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/mkexfatfs</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/mount.exfat-fuse</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/mkexfatfs</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/mkexfatfs_static</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/mount.exfat-fuse</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/vlnk</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Vlnk/build.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/tool/i386/vlnk</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/vlnk</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/vlnk</td>
|
||||
<tr> <td>./INSTALL/tool/aarch64/vtoycli</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./vtoycli/build.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/tool/i386/vtoycli</td>
|
||||
<tr> <td>./INSTALL/tool/mips64el/vtoycli</td>
|
||||
<tr> <td>./INSTALL/tool/x86_64/vtoycli</td>
|
||||
<tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.cpl</td> <td rowspan=6>upstream</td> <td rowspan=6>Download from imdisk project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.8</td> </tr>
|
||||
<tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.exe</td>
|
||||
<tr> <td>./INSTALL/ventoy/imdisk/32/imdisk.sys</td>
|
||||
<tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.cpl</td>
|
||||
<tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.exe</td>
|
||||
<tr> <td>./INSTALL/ventoy/imdisk/64/imdisk.sys</td>
|
||||
<tr> <td>./INSTALL/ventoy/iso9660_aa64.efi</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.17</td> </tr>
|
||||
<tr> <td>./INSTALL/ventoy/udf_aa64.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/iso9660_ia32.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/udf_ia32.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/iso9660_x64.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/udf_x64.efi</td>
|
||||
<tr> <td>./INSTALL/VentoyGUI.aarch64</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./LinuxGUI/build_gtk.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/VentoyGUI.i386</td>
|
||||
<tr> <td>./INSTALL/VentoyGUI.mips64el</td>
|
||||
<tr> <td>./INSTALL/VentoyGUI.x86_64</td>
|
||||
<tr> <td>./INSTALL/Ventoy2Disk.exe</td> <td rowspan=4>build</td> <td rowspan=4>Build Instructions:<br/>./Ventoy2Disk/Ventoy2Disk.sln</td> </tr>
|
||||
<tr> <td>./INSTALL/Ventoy2Disk_ARM.exe</td>
|
||||
<tr> <td>./INSTALL/Ventoy2Disk_ARM64.exe</td>
|
||||
<tr> <td>./INSTALL/Ventoy2Disk_X64.exe</td>
|
||||
<tr> <td>./INSTALL/ventoy/vtoyjump32.exe</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./vtoyjump/vtoyjump.sln</td> </tr>
|
||||
<tr> <td>./INSTALL/ventoy/vtoyjump64.exe</td>
|
||||
<tr> <td>./INSTALL/ventoy/ventoy_aa64.efi</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./EDK2/buildedk.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/ventoy/ventoy_ia32.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/ventoy_x64.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/vtoyutil_aa64.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/vtoyutil_ia32.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/vtoyutil_x64.efi</td>
|
||||
<tr> <td>./INSTALL/ventoy/ipxe.krn</td> <td>build</td> <td>Build Instructions:<br/>./IPXE/buildipxe.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/ventoy/memdisk</td> <td>upstream</td> <td>Download from syslinux project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.9</td> </tr>
|
||||
<tr> <td>./LiveCD/ISO/EFI/boot/vmlinuz64</td> <td>upstream</td> <td>Download from TinyLinux website.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.14</td> </tr>
|
||||
<tr> <td>./LiveCDGUI/EXT/busybox-x86_64</td> <td>build</td> <td>Same with ./IMG/cpio_x86/ventoy/busybox/busybox64<br/>Check the file hash to confirm</td> </tr>
|
||||
<tr> <td>./LiveCDGUI/GRUB/bootx64.efi</td> <td rowspan=2>build</td> <td rowspan=2>./DOC/BuildVentoyFromSource.txt 4.1-Build grub2</td> </tr>
|
||||
<tr> <td>./LiveCD/GRUB/bootx64.efi</td>
|
||||
<tr> <td>./LZIP/lunzip32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./DOC/BuildVentoyFromSource.txt 4.19</td> </tr>
|
||||
<tr> <td>./LZIP/lunzip64</td>
|
||||
<tr> <td>./LZIP/lunzipaa64</td>
|
||||
<tr> <td>./LZIP/lz4cat64</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./LZIP/buildlz4.txt</td> </tr>
|
||||
<tr> <td>./LZIP/lz4cataa64</td>
|
||||
<tr> <td>./LZIP/lz4catm64e</td>
|
||||
<tr> <td>./Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./Plugson/vs/VentoyPlugson/VentoyPlugson.sln</td> </tr>
|
||||
<tr> <td>./Plugson/vs/VentoyPlugson/x64/Release/VentoyPlugson_X64.exe</td>
|
||||
<tr> <td>./SQUASHFS/unsquashfs_32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./SQUASHFS/build.sh</td> </tr>
|
||||
<tr> <td>./SQUASHFS/unsquashfs_64</td>
|
||||
<tr> <td>./SQUASHFS/unsquashfs_aa64</td>
|
||||
<tr> <td>./Unix/ventoy_unix/DragonFly/sbin/dmsetup</td> <td>upstream</td> <td>Get from DragonFly ISO.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.13</td> </tr>
|
||||
<tr> <td>./Unix/ventoy_unix/DragonFly/sbin/init</td> <td>build</td> <td>Build Instructions:<br/>./Unix/ventoy_unix_src/DragonFly/build.sh</td> </tr>
|
||||
<tr> <td>./VBLADE/vblade-master/vblade_32</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./VBLADE/vblade-master/build.sh</td> </tr>
|
||||
<tr> <td>./VBLADE/vblade-master/vblade_64</td>
|
||||
<tr> <td>./VBLADE/vblade-master/vblade_aa64</td>
|
||||
<tr> <td>./Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe</td> <td>build</td> <td>Build Instructions:<br/>./Vlnk/vs/VentoyVlnk/VentoyVlnk.sln</td> </tr>
|
||||
<tr> <td>./VtoyTool/vtoytool/00/vtoytool_32</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./VtoyTool/build.sh</td> </tr>
|
||||
<tr> <td>./VtoyTool/vtoytool/00/vtoytool_64</td>
|
||||
<tr> <td>./VtoyTool/vtoytool/00/vtoytool_aa64</td>
|
||||
<tr> <td>./VtoyTool/vtoytool/00/vtoytool_m64e</td>
|
||||
<tr> <td>./VtoyTool/vtoytool/01/vtoytool_64</td>
|
||||
<tr> <td>./VtoyTool/vtoytool/02/vtoytool_64</td>
|
||||
<tr> <td>./ZSTD/zstdcat</td> <td rowspan=3>build</td> <td rowspan=3>Build Instructions:<br/>./ZSTD/build.txt</td> </tr>
|
||||
<tr> <td>./ZSTD/zstdcat64</td>
|
||||
<tr> <td>./ZSTD/zstdcataa64</td>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/busybox32</td> <td rowspan=6>build</td> <td rowspan=6>Build Instructions:<br/>./BUSYBOX/build.txt full busybox</td> </tr>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/busybox64</td>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/xzcat32_musl</td>
|
||||
<tr> <td>./IMG/cpio_x86/ventoy/busybox/xzcat64_musl</td>
|
||||
<tr> <td>./IMG/cpio_arm64/ventoy/busybox/busyboxaa64</td>
|
||||
<tr> <td>./IMG/cpio_mips64/ventoy/busybox/busyboxm64e</td>
|
||||
<tr> <td>ISNTALL/ventoy/7z/64/7za.exe</td> <td rowspan=2>upstream</td> <td>Download from 7z project.<br/>URL & File Hash documented in<br/> ./DOC/BuildVentoyFromSource.txt 5.12</td> </tr>
|
||||
<tr> <td>ISNTALL/ventoy/7z/32/7za.exe</td>
|
||||
<tr> <td>./INSTALL/ventoy/wimboot.i386.efi</td> <td rowspan=2>build</td> <td rowspan=2>Build Instructions:<br/>./wimboot/build.sh</td> </tr>
|
||||
<tr> <td>./INSTALL/ventoy/wimboot.x86_64</td>
|
||||
<tr> <td> ./Unix/ventoy_unix/ClonOS/geom_ventoy_ko/13.x/64/geom_ventoy.ko</td> <td rowspan=18>build</td> <td rowspan=18>Build Instructions:<br/>./Unix/BuildUnixKmod.txt</td> </tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/10.x/32/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/10.x/64/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/11.x/32/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/11.x/64/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/12.x/32/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/12.x/64/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/13.x/32/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/13.x/64/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/14.x/32/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/14.x/64/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/9.x/32/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/FreeBSD/geom_ventoy_ko/9.x/64/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/MidnightBSD/geom_ventoy_ko/11.x/32/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/MidnightBSD/geom_ventoy_ko/11.x/64/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/MidnightBSD/geom_ventoy_ko/2.x/32/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/MidnightBSD/geom_ventoy_ko/2.x/64/geom_ventoy.ko</td></tr>
|
||||
<tr> <td> ./Unix/ventoy_unix/pfSense/geom_ventoy_ko/14.x/64/geom_ventoy.ko</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -1,7 +0,0 @@
|
||||
|
||||
obj-m += dm_patch.o
|
||||
|
||||
EXTRA_CFLAGS := -Wall
|
||||
|
||||
dm_patch-objs := dmpatch.o
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
|
||||
obj-m += dm_patch_ibt.o
|
||||
|
||||
EXTRA_CFLAGS := -Wall -DVTOY_IBT -fcf-protection=branch -mindirect-branch-register
|
||||
|
||||
dm_patch_ibt-objs := dmpatch.o
|
||||
|
||||
@@ -1,632 +0,0 @@
|
||||
/******************************************************************************
|
||||
* dmpatch.c ---- patch for device-mapper
|
||||
*
|
||||
* Copyright (c) 2021, longpanda <admin@ventoy.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/mempool.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define MAX_PATCH 4
|
||||
|
||||
#define magic_sig 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF
|
||||
|
||||
typedef int (*kprobe_reg_pf)(void *);
|
||||
typedef void (*kprobe_unreg_pf)(void *);
|
||||
typedef int (*printk_pf)(const char *fmt, ...);
|
||||
typedef int (*set_memory_attr_pf)(unsigned long addr, int numpages);
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct ko_param
|
||||
{
|
||||
unsigned char magic[16];
|
||||
unsigned long struct_size;
|
||||
unsigned long pgsize;
|
||||
unsigned long printk_addr;
|
||||
unsigned long ro_addr;
|
||||
unsigned long rw_addr;
|
||||
unsigned long reg_kprobe_addr;
|
||||
unsigned long unreg_kprobe_addr;
|
||||
unsigned long sym_get_addr;
|
||||
unsigned long sym_get_size;
|
||||
unsigned long sym_put_addr;
|
||||
unsigned long sym_put_size;
|
||||
unsigned long kv_major;
|
||||
unsigned long ibt;
|
||||
unsigned long kv_minor;
|
||||
unsigned long blkdev_get_addr;
|
||||
unsigned long blkdev_put_addr;
|
||||
unsigned long bdev_open_addr;
|
||||
unsigned long kv_subminor;
|
||||
unsigned long bdev_file_open_addr;
|
||||
unsigned long padding[1];
|
||||
}ko_param;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
static printk_pf kprintf = NULL;
|
||||
static set_memory_attr_pf set_mem_ro = NULL;
|
||||
static set_memory_attr_pf set_mem_rw = NULL;
|
||||
static kprobe_reg_pf reg_kprobe = NULL;
|
||||
static kprobe_unreg_pf unreg_kprobe = NULL;
|
||||
|
||||
static volatile ko_param g_ko_param =
|
||||
{
|
||||
{ magic_sig },
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
#if defined(CONFIG_X86_64)
|
||||
#define PATCH_OP_POS1 3
|
||||
#define CODE_MATCH1(code, i) \
|
||||
(code[i] == 0x40 && code[i + 1] == 0x80 && code[i + 2] == 0xce && code[i + 3] == 0x80)
|
||||
|
||||
#define PATCH_OP_POS2 1
|
||||
#define CODE_MATCH2(code, i) \
|
||||
(code[i] == 0x0C && code[i + 1] == 0x80 && code[i + 2] == 0x89 && code[i + 3] == 0xC6)
|
||||
|
||||
#define PATCH_OP_POS3 4
|
||||
#define CODE_MATCH3(code, i) \
|
||||
(code[i] == 0x44 && code[i + 1] == 0x89 && code[i + 2] == 0xe8 && code[i + 3] == 0x0c && code[i + 4] == 0x80)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#elif defined(CONFIG_X86_32)
|
||||
#define PATCH_OP_POS1 2
|
||||
#define CODE_MATCH1(code, i) \
|
||||
(code[i] == 0x80 && code[i + 1] == 0xca && code[i + 2] == 0x80 && code[i + 3] == 0xe8)
|
||||
|
||||
#define PATCH_OP_POS2 PATCH_OP_POS1
|
||||
#define CODE_MATCH2 CODE_MATCH1
|
||||
#define PATCH_OP_POS3 PATCH_OP_POS1
|
||||
#define CODE_MATCH3 CODE_MATCH1
|
||||
|
||||
|
||||
#else
|
||||
#error "unsupported arch"
|
||||
#endif
|
||||
|
||||
#ifdef VTOY_IBT
|
||||
#ifdef CONFIG_X86_64
|
||||
/* Using 64-bit values saves one instruction clearing the high half of low */
|
||||
#define DECLARE_ARGS(val, low, high) unsigned long low, high
|
||||
#define EAX_EDX_VAL(val, low, high) ((low) | (high) << 32)
|
||||
#define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high)
|
||||
#else
|
||||
#define DECLARE_ARGS(val, low, high) unsigned long long val
|
||||
#define EAX_EDX_VAL(val, low, high) (val)
|
||||
#define EAX_EDX_RET(val, low, high) "=A" (val)
|
||||
#endif
|
||||
|
||||
#define EX_TYPE_WRMSR 8
|
||||
#define EX_TYPE_RDMSR 9
|
||||
#define MSR_IA32_S_CET 0x000006a2 /* kernel mode cet */
|
||||
#define CET_ENDBR_EN (1ULL << 2)
|
||||
|
||||
/* Exception table entry */
|
||||
#ifdef __ASSEMBLY__
|
||||
|
||||
#define _ASM_EXTABLE_TYPE(from, to, type) \
|
||||
.pushsection "__ex_table","a" ; \
|
||||
.balign 4 ; \
|
||||
.long (from) - . ; \
|
||||
.long (to) - . ; \
|
||||
.long type ; \
|
||||
.popsection
|
||||
|
||||
#else /* ! __ASSEMBLY__ */
|
||||
|
||||
#define _ASM_EXTABLE_TYPE(from, to, type) \
|
||||
" .pushsection \"__ex_table\",\"a\"\n" \
|
||||
" .balign 4\n" \
|
||||
" .long (" #from ") - .\n" \
|
||||
" .long (" #to ") - .\n" \
|
||||
" .long " __stringify(type) " \n" \
|
||||
" .popsection\n"
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* VTOY_IBT */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define vdebug(fmt, args...) if(kprintf) kprintf(KERN_ERR fmt, ##args)
|
||||
|
||||
static unsigned int g_claim_ptr = 0;
|
||||
static unsigned char *g_get_patch[MAX_PATCH] = { NULL };
|
||||
static unsigned char *g_put_patch[MAX_PATCH] = { NULL };
|
||||
|
||||
static int notrace dmpatch_kv_above(unsigned long Major, unsigned long Minor, unsigned long SubMinor)
|
||||
{
|
||||
if (g_ko_param.kv_major != Major)
|
||||
{
|
||||
return (g_ko_param.kv_major > Major) ? 1 : 0;
|
||||
}
|
||||
|
||||
if (g_ko_param.kv_minor != Minor)
|
||||
{
|
||||
return (g_ko_param.kv_minor > Minor) ? 1 : 0;
|
||||
}
|
||||
|
||||
if (g_ko_param.kv_subminor != SubMinor)
|
||||
{
|
||||
return (g_ko_param.kv_subminor > SubMinor) ? 1 : 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void notrace dmpatch_restore_code(int bytes, unsigned char *opCode, unsigned int code)
|
||||
{
|
||||
unsigned long align;
|
||||
|
||||
if (opCode)
|
||||
{
|
||||
align = (unsigned long)opCode / g_ko_param.pgsize * g_ko_param.pgsize;
|
||||
set_mem_rw(align, 1);
|
||||
if (bytes == 1)
|
||||
{
|
||||
*opCode = (unsigned char)code;
|
||||
}
|
||||
else
|
||||
{
|
||||
*(unsigned int *)opCode = code;
|
||||
}
|
||||
set_mem_ro(align, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static int notrace dmpatch_replace_code
|
||||
(
|
||||
int style,
|
||||
unsigned long addr,
|
||||
unsigned long size,
|
||||
int expect,
|
||||
const char *desc,
|
||||
unsigned char **patch
|
||||
)
|
||||
{
|
||||
int i = 0;
|
||||
int cnt = 0;
|
||||
unsigned long align;
|
||||
unsigned char *opCode = (unsigned char *)addr;
|
||||
|
||||
vdebug("patch for %s style[%d] 0x%lx %d\n", desc, style, addr, (int)size);
|
||||
|
||||
for (i = 0; i < (int)size - 8; i++)
|
||||
{
|
||||
if (style == 1)
|
||||
{
|
||||
if (CODE_MATCH1(opCode, i) && cnt < MAX_PATCH)
|
||||
{
|
||||
patch[cnt] = opCode + i + PATCH_OP_POS1;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
else if (style == 2)
|
||||
{
|
||||
if (CODE_MATCH2(opCode, i) && cnt < MAX_PATCH)
|
||||
{
|
||||
patch[cnt] = opCode + i + PATCH_OP_POS2;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
else if (style == 3)
|
||||
{
|
||||
if (CODE_MATCH3(opCode, i) && cnt < MAX_PATCH)
|
||||
{
|
||||
patch[cnt] = opCode + i + PATCH_OP_POS3;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (cnt != expect || cnt >= MAX_PATCH)
|
||||
{
|
||||
vdebug("patch error: cnt=%d expect=%d\n", cnt, expect);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < cnt; i++)
|
||||
{
|
||||
opCode = patch[i];
|
||||
align = (unsigned long)opCode / g_ko_param.pgsize * g_ko_param.pgsize;
|
||||
|
||||
set_mem_rw(align, 1);
|
||||
*opCode = 0;
|
||||
set_mem_ro(align, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long notrace dmpatch_find_call_offset(unsigned long addr, unsigned long size, unsigned long func)
|
||||
{
|
||||
unsigned long i = 0;
|
||||
unsigned long dest;
|
||||
unsigned char *opCode = NULL;
|
||||
unsigned char aucOffset[8] = { 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
|
||||
opCode = (unsigned char *)addr;
|
||||
|
||||
for (i = 0; i + 4 < size; i++)
|
||||
{
|
||||
if (opCode[i] == 0xE8)
|
||||
{
|
||||
aucOffset[0] = opCode[i + 1];
|
||||
aucOffset[1] = opCode[i + 2];
|
||||
aucOffset[2] = opCode[i + 3];
|
||||
aucOffset[3] = opCode[i + 4];
|
||||
|
||||
dest = addr + i + 5 + *(unsigned long *)aucOffset;
|
||||
if (dest == func)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int notrace dmpatch_patch_claim_ptr(void)
|
||||
{
|
||||
unsigned long i = 0;
|
||||
unsigned long t = 0;
|
||||
unsigned long offset1 = 0;
|
||||
unsigned long offset2 = 0;
|
||||
unsigned long align = 0;
|
||||
unsigned char *opCode = NULL;
|
||||
|
||||
opCode = (unsigned char *)g_ko_param.sym_get_addr;
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
vdebug("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
|
||||
opCode[i + 0], opCode[i + 1], opCode[i + 2], opCode[i + 3],
|
||||
opCode[i + 4], opCode[i + 5], opCode[i + 6], opCode[i + 7],
|
||||
opCode[i + 8], opCode[i + 9], opCode[i + 10], opCode[i + 11],
|
||||
opCode[i + 12], opCode[i + 13], opCode[i + 14], opCode[i + 15]);
|
||||
}
|
||||
|
||||
if (dmpatch_kv_above(6, 7, 0)) /* >= 6.7 kernel */
|
||||
{
|
||||
vdebug("Get addr: 0x%lx %lu open 0x%lx\n", g_ko_param.sym_get_addr, g_ko_param.sym_get_size, g_ko_param.bdev_open_addr);
|
||||
offset1 = dmpatch_find_call_offset(g_ko_param.sym_get_addr, g_ko_param.sym_get_size, g_ko_param.bdev_open_addr);
|
||||
if (offset1 == 0)
|
||||
{
|
||||
vdebug("call bdev_open_addr Not found\n");
|
||||
|
||||
vdebug("Get addr: 0x%lx %lu file_open 0x%lx\n", g_ko_param.sym_get_addr, g_ko_param.sym_get_size, g_ko_param.bdev_file_open_addr);
|
||||
offset1 = dmpatch_find_call_offset(g_ko_param.sym_get_addr, g_ko_param.sym_get_size, g_ko_param.bdev_file_open_addr);
|
||||
if (offset1 == 0)
|
||||
{
|
||||
vdebug("call bdev_file_open_addr Not found\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
vdebug("Get addr: 0x%lx %lu 0x%lx\n", g_ko_param.sym_get_addr, g_ko_param.sym_get_size, g_ko_param.blkdev_get_addr);
|
||||
vdebug("Put addr: 0x%lx %lu 0x%lx\n", g_ko_param.sym_put_addr, g_ko_param.sym_put_size, g_ko_param.blkdev_put_addr);
|
||||
|
||||
offset1 = dmpatch_find_call_offset(g_ko_param.sym_get_addr, g_ko_param.sym_get_size, g_ko_param.blkdev_get_addr);
|
||||
offset2 = dmpatch_find_call_offset(g_ko_param.sym_put_addr, g_ko_param.sym_put_size, g_ko_param.blkdev_put_addr);
|
||||
if (offset1 == 0 || offset2 == 0)
|
||||
{
|
||||
vdebug("call blkdev_get or blkdev_put Not found, %lu %lu\n", offset1, offset2);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
vdebug("call addr1:0x%lx call addr2:0x%lx\n",
|
||||
g_ko_param.sym_get_addr + offset1,
|
||||
g_ko_param.sym_put_addr + offset2);
|
||||
|
||||
opCode = (unsigned char *)g_ko_param.sym_get_addr;
|
||||
for (i = offset1 - 1, t = 0; (i > 0) && (t < 24); i--, t++)
|
||||
{
|
||||
/* rdx */
|
||||
if (opCode[i] == 0x48 && opCode[i + 1] == 0xc7 && opCode[i + 2] == 0xc2)
|
||||
{
|
||||
g_claim_ptr = *(unsigned int *)(opCode + i + 3);
|
||||
g_get_patch[0] = opCode + i + 3;
|
||||
vdebug("claim_ptr(%08X) found at get addr 0x%lx\n", g_claim_ptr, g_ko_param.sym_get_addr + i + 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (g_claim_ptr == 0)
|
||||
{
|
||||
vdebug("Claim_ptr not found in get\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
align = (unsigned long)g_get_patch[0] / g_ko_param.pgsize * g_ko_param.pgsize;
|
||||
set_mem_rw(align, 1);
|
||||
*(unsigned int *)(g_get_patch[0]) = 0;
|
||||
set_mem_ro(align, 1);
|
||||
|
||||
|
||||
if (offset2 > 0)
|
||||
{
|
||||
opCode = (unsigned char *)g_ko_param.sym_put_addr;
|
||||
for (i = offset2 - 1, t = 0; (i > 0) && (t < 24); i--, t++)
|
||||
{
|
||||
/* rsi */
|
||||
if (opCode[i] == 0x48 && opCode[i + 1] == 0xc7 && opCode[i + 2] == 0xc6)
|
||||
{
|
||||
if (*(unsigned int *)(opCode + i + 3) == g_claim_ptr)
|
||||
{
|
||||
vdebug("claim_ptr found at put addr 0x%lx\n", g_ko_param.sym_put_addr + i + 3);
|
||||
g_put_patch[0] = opCode + i + 3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g_put_patch[0] == 0)
|
||||
{
|
||||
vdebug("Claim_ptr not found in put\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
align = (unsigned long)g_put_patch[0] / g_ko_param.pgsize * g_ko_param.pgsize;
|
||||
set_mem_rw(align, 1);
|
||||
*(unsigned int *)(g_put_patch[0]) = 0;
|
||||
set_mem_ro(align, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef VTOY_IBT
|
||||
static __always_inline unsigned long long dmpatch_rdmsr(unsigned int msr)
|
||||
{
|
||||
DECLARE_ARGS(val, low, high);
|
||||
|
||||
asm volatile("1: rdmsr\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_RDMSR)
|
||||
: EAX_EDX_RET(val, low, high) : "c" (msr));
|
||||
|
||||
return EAX_EDX_VAL(val, low, high);
|
||||
}
|
||||
|
||||
static __always_inline void dmpatch_wrmsr(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
asm volatile("1: wrmsr\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_WRMSR)
|
||||
: : "c" (msr), "a"(low), "d" (high) : "memory");
|
||||
}
|
||||
|
||||
static u64 notrace dmpatch_ibt_save(void)
|
||||
{
|
||||
u64 msr = 0;
|
||||
u64 val = 0;
|
||||
|
||||
msr = dmpatch_rdmsr(MSR_IA32_S_CET);
|
||||
val = msr & ~CET_ENDBR_EN;
|
||||
dmpatch_wrmsr(MSR_IA32_S_CET, (u32)(val & 0xffffffffULL), (u32)(val >> 32));
|
||||
|
||||
return msr;
|
||||
}
|
||||
|
||||
static void notrace dmpatch_ibt_restore(u64 save)
|
||||
{
|
||||
u64 msr;
|
||||
|
||||
msr = dmpatch_rdmsr(MSR_IA32_S_CET);
|
||||
|
||||
msr &= ~CET_ENDBR_EN;
|
||||
msr |= (save & CET_ENDBR_EN);
|
||||
|
||||
dmpatch_wrmsr(MSR_IA32_S_CET, (u32)(msr & 0xffffffffULL), (u32)(msr >> 32));
|
||||
}
|
||||
#else
|
||||
static u64 notrace dmpatch_ibt_save(void) { return 0; }
|
||||
static void notrace dmpatch_ibt_restore(u64 save) { (void)save; }
|
||||
#endif
|
||||
|
||||
static int notrace dmpatch_process(unsigned long a, unsigned long b, unsigned long c)
|
||||
{
|
||||
int r = 0;
|
||||
int rc = 0;
|
||||
unsigned long kv_major = 0;
|
||||
unsigned long kv_minor = 0;
|
||||
unsigned long kv_subminor = 0;
|
||||
|
||||
vdebug("dmpatch_process as KV %d.%d.%d ...\n", (int)a, (int)b, (int)c);
|
||||
|
||||
kv_major = g_ko_param.kv_major;
|
||||
kv_minor = g_ko_param.kv_minor;
|
||||
kv_subminor = g_ko_param.kv_subminor;
|
||||
|
||||
g_ko_param.kv_major = a;
|
||||
g_ko_param.kv_minor = b;
|
||||
g_ko_param.kv_subminor = c;
|
||||
|
||||
if (dmpatch_kv_above(6, 5, 0)) /* >= kernel 6.5 */
|
||||
{
|
||||
vdebug("new interface patch dm_get_table_device...\n");
|
||||
r = dmpatch_patch_claim_ptr();
|
||||
}
|
||||
else
|
||||
{
|
||||
r = dmpatch_replace_code(1, g_ko_param.sym_get_addr, g_ko_param.sym_get_size, 2, "dm_get_table_device", g_get_patch);
|
||||
if (r && g_ko_param.kv_major >= 5)
|
||||
{
|
||||
vdebug("new2 patch dm_get_table_device...\n");
|
||||
r = dmpatch_replace_code(2, g_ko_param.sym_get_addr, g_ko_param.sym_get_size, 1, "dm_get_table_device", g_get_patch);
|
||||
}
|
||||
|
||||
if (r && g_ko_param.kv_major >= 5)
|
||||
{
|
||||
vdebug("new3 patch dm_get_table_device...\n");
|
||||
r = dmpatch_replace_code(3, g_ko_param.sym_get_addr, g_ko_param.sym_get_size, 1, "dm_get_table_device", g_get_patch);
|
||||
}
|
||||
}
|
||||
|
||||
if (r)
|
||||
{
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
vdebug("patch dm_get_table_device success\n");
|
||||
|
||||
if (dmpatch_kv_above(6, 5, 0))
|
||||
{
|
||||
r = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = dmpatch_replace_code(1, g_ko_param.sym_put_addr, g_ko_param.sym_put_size, 1, "dm_put_table_device", g_put_patch);
|
||||
if (r)
|
||||
{
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
vdebug("patch dm_put_table_device success\n");
|
||||
}
|
||||
|
||||
vdebug("#####################################\n");
|
||||
vdebug("######## dm patch success ###########\n");
|
||||
vdebug("#####################################\n");
|
||||
|
||||
out:
|
||||
|
||||
g_ko_param.kv_major = kv_major;
|
||||
g_ko_param.kv_minor = kv_minor;
|
||||
g_ko_param.kv_subminor = kv_subminor;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int notrace dmpatch_init(void)
|
||||
{
|
||||
int rc = 0;
|
||||
u64 msr = 0;
|
||||
|
||||
if (g_ko_param.ibt == 0x8888)
|
||||
{
|
||||
msr = dmpatch_ibt_save();
|
||||
}
|
||||
|
||||
kprintf = (printk_pf)(g_ko_param.printk_addr);
|
||||
|
||||
vdebug("dmpatch_init start pagesize=%lu kernel=%lu.%lu.%lu ...\n",
|
||||
g_ko_param.pgsize, g_ko_param.kv_major, g_ko_param.kv_minor, g_ko_param.kv_subminor);
|
||||
|
||||
if (g_ko_param.struct_size != sizeof(ko_param))
|
||||
{
|
||||
vdebug("Invalid struct size %d %d\n", (int)g_ko_param.struct_size, (int)sizeof(ko_param));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (g_ko_param.sym_get_addr == 0 || g_ko_param.sym_put_addr == 0 ||
|
||||
g_ko_param.ro_addr == 0 || g_ko_param.rw_addr == 0)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
set_mem_ro = (set_memory_attr_pf)(g_ko_param.ro_addr);
|
||||
set_mem_rw = (set_memory_attr_pf)(g_ko_param.rw_addr);
|
||||
reg_kprobe = (kprobe_reg_pf)g_ko_param.reg_kprobe_addr;
|
||||
unreg_kprobe = (kprobe_unreg_pf)g_ko_param.unreg_kprobe_addr;
|
||||
|
||||
rc = dmpatch_process(g_ko_param.kv_major, g_ko_param.kv_minor, g_ko_param.kv_subminor);
|
||||
if (rc)
|
||||
{
|
||||
if (g_ko_param.kv_major >= 5)
|
||||
{
|
||||
rc = dmpatch_process(6, 5, 0);
|
||||
if (rc)
|
||||
{
|
||||
rc = dmpatch_process(6, 7, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g_ko_param.ibt == 0x8888)
|
||||
{
|
||||
dmpatch_ibt_restore(msr);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void notrace dmpatch_exit(void)
|
||||
{
|
||||
int i = 0;
|
||||
u64 msr;
|
||||
|
||||
if (g_ko_param.ibt == 0x8888)
|
||||
{
|
||||
msr = dmpatch_ibt_save();
|
||||
}
|
||||
|
||||
if (g_claim_ptr)
|
||||
{
|
||||
dmpatch_restore_code(4, g_get_patch[0], g_claim_ptr);
|
||||
if (g_put_patch[0])
|
||||
{
|
||||
dmpatch_restore_code(4, g_put_patch[0], g_claim_ptr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < MAX_PATCH; i++)
|
||||
{
|
||||
dmpatch_restore_code(1, g_get_patch[i], 0x80);
|
||||
dmpatch_restore_code(1, g_put_patch[i], 0x80);
|
||||
}
|
||||
}
|
||||
|
||||
vdebug("dmpatch_exit success\n");
|
||||
|
||||
if (g_ko_param.ibt == 0x8888)
|
||||
{
|
||||
dmpatch_ibt_restore(msr);
|
||||
}
|
||||
}
|
||||
|
||||
module_init(dmpatch_init);
|
||||
module_exit(dmpatch_exit);
|
||||
|
||||
|
||||
MODULE_DESCRIPTION("dmpatch driver");
|
||||
MODULE_AUTHOR("longpanda <admin@ventoy.net>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
1. install ubuntu 22.04 5.15.0-25
|
||||
2. apt-get install build-essential flex libncurses-dev linux-headers-generic linux-source libssl-dev bison yacc vim libelf-dev ...... and so on
|
||||
3. cp /lib/modules/5.15.0-25-generic/build/Module.symvers ./
|
||||
4. /boot/config-5.15.0-25-generic as .config make oldconfig
|
||||
5. make menuconfig
|
||||
1. close CONFIG_STACKPROTECTOR
|
||||
2. close CONFIG_RETPOLINE
|
||||
3. close CONFIG_UBSAN_BOUNDS
|
||||
4. close CONFIG_UBSAN_ENUM
|
||||
|
||||
6. modify ./scripts/mod/modpost.c
|
||||
1. skip add_srcversion (just return)
|
||||
2. force add_retpoline (#ifdef --> #ifndef)
|
||||
3. force add_intree_flag
|
||||
|
||||
7. make modules_prepare LOCALVERSION=-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
|
||||
8. Append padding at the end of struct module <include/linux/module.h>
|
||||
struct module {
|
||||
enum module_state state;
|
||||
|
||||
/* Member of list of modules */
|
||||
struct list_head list;
|
||||
|
||||
/* Unique handle for this module */
|
||||
char name[MODULE_NAME_LEN];
|
||||
|
||||
....
|
||||
|
||||
char padding[1024];
|
||||
};
|
||||
|
||||
This is because struct module size is different in different kernel versions or with different CONFIG item.
|
||||
|
||||
|
||||
9. make modules M=/home/dmpatch
|
||||
10. strip --strip-debug /home/dmpatch/dm_patch.ko
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
FTPIP=192.168.44.1
|
||||
FTPUSR='a:a'
|
||||
|
||||
rm -f dmpatch.c Makefile Makefile_IBT
|
||||
|
||||
for f in dmpatch.c Makefile Makefile_IBT; do
|
||||
curl -s -u $FTPUSR ftp://$FTPIP/$f -o $f
|
||||
if [ -f $f ]; then
|
||||
echo "download $f OK ..."
|
||||
else
|
||||
echo "download $f FAILED ..."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
|
||||
rm -f *.ko
|
||||
|
||||
|
||||
echo "build dm_patch.ko ..."
|
||||
rm -rf ./aa
|
||||
mkdir ./aa
|
||||
|
||||
cp -a *.c aa/
|
||||
cp -a Makefile aa/
|
||||
|
||||
cd /home/panda/linux-source-5.15.0
|
||||
make modules M=/home/panda/build/aa/
|
||||
strip --strip-debug /home/panda/build/aa/dm_patch.ko
|
||||
cd -
|
||||
|
||||
cp -a aa/dm_patch.ko ./
|
||||
|
||||
|
||||
|
||||
echo "build dm_patch_ibt.ko ..."
|
||||
rm -rf ./aa
|
||||
mkdir ./aa
|
||||
|
||||
cp -a *.c aa/
|
||||
cp -a Makefile_IBT aa/Makefile
|
||||
|
||||
cd /home/panda/linux-source-5.15.0
|
||||
make modules M=/home/panda/build/aa/
|
||||
strip --strip-debug /home/panda/build/aa/dm_patch_ibt.ko
|
||||
cd -
|
||||
|
||||
cp -a aa/dm_patch_ibt.ko ./
|
||||
|
||||
rm -rf ./aa
|
||||
|
||||
|
||||
curl -s -T dm_patch.ko -u $FTPUSR ftp://$FTPIP/dm_patch_64.ko || exit 1
|
||||
curl -s -T dm_patch_ibt.ko -u $FTPUSR ftp://$FTPIP/dm_patch_ibt_64.ko || exit 1
|
||||
|
||||
|
||||
if [ -f ./dm_patch.ko -a -f ./dm_patch_ibt.ko ]; then
|
||||
echo -e "\n\n=============== SUCCESS =============\n\n"
|
||||
else
|
||||
echo -e "\n\n=============== FAILED ==============\n\n"
|
||||
fi
|
||||
|
||||
@@ -159,12 +159,12 @@
|
||||
make -f ventoy_makefile
|
||||
strip --strip-all xzminidec
|
||||
|
||||
4.16 == Build xzminidec64 ==
|
||||
4.16 == Build xzminidec64/xzminidec64_musl ==
|
||||
cd /home/Ventoy-master/Ventoy2Disk/Ventoy2Disk/xz-embedded-20130513/userspace
|
||||
make -f ventoy_makefile64
|
||||
make -f ventoy_makefile64 or make -f ventoy_makefile64_musl
|
||||
strip --strip-all xzminidec
|
||||
|
||||
4.17 == Build iso9660_x64.efi ==
|
||||
4.17 == Build iso9660_x64.efi/udf_x64.efi/iso9660_ia32.efi/udf_ia32.efi/iso9660_aa64.efi/udf_aa64.efi/ ==
|
||||
This efi driver is from https://github.com/pbatard/efifs
|
||||
Follow all the build instructions in this project. I modified 3 files (the original and modified source are at /home/Ventoy-master/EDK2/efiffs)
|
||||
|
||||
@@ -185,6 +185,16 @@
|
||||
make
|
||||
aarch64-buildroot-linux-uclibc-strip --strip-all lunzip
|
||||
|
||||
4.17 == Build xzminidecaa64 ==
|
||||
cd /home/Ventoy-master/Ventoy2Disk/Ventoy2Disk/xz-embedded-20130513/userspace
|
||||
make -f ventoy_makefileaa64
|
||||
strip --strip-all xzminidec
|
||||
|
||||
4.18 == Build xzminidecm64e ==
|
||||
cd /home/Ventoy-master/Ventoy2Disk/Ventoy2Disk/xz-embedded-20130513/userspace
|
||||
make -f ventoy_makefilem64e
|
||||
strip --strip-all xzminidec
|
||||
|
||||
|
||||
|
||||
==========================================
|
||||
@@ -222,7 +232,7 @@
|
||||
SHA-256: cde08b6a2cf5ad914f05203e18e3f7c2ed6060a63604e3d75536f19b55e8e0af
|
||||
|
||||
5.8 imdisk
|
||||
download http://www.ltr-data.se/files/imdiskinst.exe and extract it by 7zip.
|
||||
download http://static.ltr-data.se/files/imdiskinst_2.0.10.exe and extract it by 7zip.
|
||||
|
||||
INSTALL/ventoy/imdisk/64/imdisk.sys --> sys/amd64/imdisk.sys SHA-256: 6702202220268787e361f5a82dae53362c8e6c6dcd240bb01b44dd77ae0788da
|
||||
INSTALL/ventoy/imdisk/64/imdisk.exe --> cli/amd64/imdisk.exe SHA-256: 9759175380af836869443e5f21ce2e33022125d154bc6b3d1c04dc36b190de04
|
||||
@@ -256,5 +266,12 @@
|
||||
ISNTALL/ventoy/7z/64/7za.exe SHA-256: 8117e40ee7f824f63373a4f5625bb62749f69159d0c449b3ce2f35aad3b83549
|
||||
ISNTALL/ventoy/7z/32/7za.exe SHA-256: ea308c76a2f927b160a143d94072b0dce232e04b751f0c6432a94e05164e716d
|
||||
|
||||
5.13 ./Ventoy/Unix/ventoy_unix/DragonFly/sbin/dmsetup
|
||||
download from https://cdimage.debian.org/mirror/dragonflybsd.org/iso-images/dfly-x86_64-5.8.3_REL.iso.bz2
|
||||
extract from the ISO file sbin/dmsetup
|
||||
dmsetup SHA-256: bedcf26650e87edfe961e33bae20d832bce73efd4b6239f9a6a5785661e4e698
|
||||
|
||||
5.14 ./LiveCD/ISO/EFI/boot/vmlinuz64
|
||||
download from http://www.tinycorelinux.net/11.x/x86_64/archive/11.0/distribution_files/vmlinuz64
|
||||
vmlinuz64 SHA-256: 641077fc1f9914af244c248453005f56536ba9e7f54ba3e52402f26709ddb8a5
|
||||
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
FROM centos:7
|
||||
|
||||
RUN yum -y -q install \
|
||||
RUN sed -i \
|
||||
-e 's/^mirrorlist/#mirrorlist/' \
|
||||
-e 's/^#baseurl/baseurl/' \
|
||||
-e 's/mirror\.centos\.org/vault.centos.org/' \
|
||||
/etc/yum.repos.d/*.repo && \
|
||||
yum -y -q install \
|
||||
libXpm net-tools bzip2 wget vim gcc gcc-c++ samba dos2unix glibc-devel glibc.i686 glibc-devel.i686 \
|
||||
mpfr.i686 mpfr-devel.i686 rsync autogen autoconf automake libtool gettext* bison binutils \
|
||||
flex device-mapper-devel SDL libpciaccess libusb freetype freetype-devel gnu-free-* qemu-* virt-* \
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
@@ -76,7 +76,7 @@ STATIC EFI_EXIT_BOOT_SERVICES g_org_exit_boot_service = NULL;
|
||||
|
||||
/* Boot filename */
|
||||
UINTN gBootFileStartIndex = 1;
|
||||
CONST CHAR16 *gEfiBootFileName[] =
|
||||
CONST CHAR16 *gEfiBootFileName[] =
|
||||
{
|
||||
L"@",
|
||||
EFI_REMOVABLE_MEDIA_FILE_NAME,
|
||||
@@ -101,7 +101,7 @@ CONST CHAR16 *gEfiBootFileName[] =
|
||||
L"\\EFI\\BOOT\\bootaa64.efi",
|
||||
L"\\efi\\boot\\bootaa64.efi",
|
||||
#endif
|
||||
|
||||
|
||||
};
|
||||
|
||||
VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...)
|
||||
@@ -112,14 +112,14 @@ VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...)
|
||||
VA_START (Marker, Format);
|
||||
UnicodeVSPrintAsciiFormat(Buffer, sizeof(Buffer), Format, Marker);
|
||||
VA_END (Marker);
|
||||
|
||||
|
||||
gST->ConOut->OutputString(gST->ConOut, Buffer);
|
||||
}
|
||||
|
||||
VOID EFIAPI ventoy_clear_input(VOID)
|
||||
{
|
||||
EFI_INPUT_KEY Key;
|
||||
|
||||
|
||||
gST->ConIn->Reset(gST->ConIn, FALSE);
|
||||
while (EFI_SUCCESS == gST->ConIn->ReadKeyStroke(gST->ConIn, &Key))
|
||||
{
|
||||
@@ -142,7 +142,7 @@ static void EFIAPI ventoy_dump_img_chunk(ventoy_chain_head *chain)
|
||||
for (i = 0; i < chain->img_chunk_num; i++)
|
||||
{
|
||||
debug("%2u: [ %u - %u ] <==> [ %llu - %llu ]",
|
||||
i, chunk[i].img_start_sector, chunk[i].img_end_sector,
|
||||
i, chunk[i].img_start_sector, chunk[i].img_end_sector,
|
||||
chunk[i].disk_start_sector, chunk[i].disk_end_sector);
|
||||
|
||||
if (i > 0 && (chunk[i].img_start_sector != chunk[i - 1].img_end_sector + 1))
|
||||
@@ -161,7 +161,7 @@ static void EFIAPI ventoy_dump_img_chunk(ventoy_chain_head *chain)
|
||||
{
|
||||
debug("image chunk size check failed %d", errcnt);
|
||||
}
|
||||
|
||||
|
||||
ventoy_debug_pause();
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ static void EFIAPI ventoy_dump_override_chunk(ventoy_chain_head *chain)
|
||||
{
|
||||
UINT32 i;
|
||||
ventoy_override_chunk *chunk;
|
||||
|
||||
|
||||
chunk = (ventoy_override_chunk *)((char *)chain + chain->override_chunk_offset);
|
||||
|
||||
debug("##################### ventoy_dump_override_chunk #######################");
|
||||
@@ -186,7 +186,7 @@ static void EFIAPI ventoy_dump_virt_chunk(ventoy_chain_head *chain)
|
||||
{
|
||||
UINT32 i;
|
||||
ventoy_virt_chunk *node;
|
||||
|
||||
|
||||
debug("##################### ventoy_dump_virt_chunk #######################");
|
||||
debug("virt_chunk_offset=%u", chain->virt_chunk_offset);
|
||||
debug("virt_chunk_num=%u", chain->virt_chunk_num);
|
||||
@@ -194,7 +194,7 @@ static void EFIAPI ventoy_dump_virt_chunk(ventoy_chain_head *chain)
|
||||
node = (ventoy_virt_chunk *)((char *)chain + chain->virt_chunk_offset);
|
||||
for (i = 0; i < chain->virt_chunk_num; i++, node++)
|
||||
{
|
||||
debug("%2u: mem:[ %u, %u, %u ] remap:[ %u, %u, %u ]", i,
|
||||
debug("%2u: mem:[ %u, %u, %u ] remap:[ %u, %u, %u ]", i,
|
||||
node->mem_sector_start,
|
||||
node->mem_sector_end,
|
||||
node->mem_sector_offset,
|
||||
@@ -202,7 +202,7 @@ static void EFIAPI ventoy_dump_virt_chunk(ventoy_chain_head *chain)
|
||||
node->remap_sector_end,
|
||||
node->org_sector_start);
|
||||
}
|
||||
|
||||
|
||||
ventoy_debug_pause();
|
||||
}
|
||||
|
||||
@@ -211,7 +211,7 @@ static void EFIAPI ventoy_dump_chain(ventoy_chain_head *chain)
|
||||
UINT32 i = 0;
|
||||
UINT8 chksum = 0;
|
||||
UINT8 *guid;
|
||||
|
||||
|
||||
guid = chain->os_param.vtoy_disk_guid;
|
||||
for (i = 0; i < sizeof(ventoy_os_param); i++)
|
||||
{
|
||||
@@ -229,10 +229,10 @@ static void EFIAPI ventoy_dump_chain(ventoy_chain_head *chain)
|
||||
debug("os_param->vtoy_img_size=<%llu>", chain->os_param.vtoy_img_size);
|
||||
debug("os_param->vtoy_img_location_addr=<0x%llx>", chain->os_param.vtoy_img_location_addr);
|
||||
debug("os_param->vtoy_img_location_len=<%u>", chain->os_param.vtoy_img_location_len);
|
||||
debug("os_param->vtoy_reserved=<%u %u %u %u %u %u %u>",
|
||||
g_os_param_reserved[0],
|
||||
g_os_param_reserved[1],
|
||||
g_os_param_reserved[2],
|
||||
debug("os_param->vtoy_reserved=<%u %u %u %u %u %u %u>",
|
||||
g_os_param_reserved[0],
|
||||
g_os_param_reserved[1],
|
||||
g_os_param_reserved[2],
|
||||
g_os_param_reserved[3],
|
||||
g_os_param_reserved[4],
|
||||
g_os_param_reserved[5],
|
||||
@@ -240,7 +240,7 @@ static void EFIAPI ventoy_dump_chain(ventoy_chain_head *chain)
|
||||
);
|
||||
|
||||
ventoy_debug_pause();
|
||||
|
||||
|
||||
debug("chain->disk_drive=0x%x", chain->disk_drive);
|
||||
debug("chain->disk_sector_size=%u", chain->disk_sector_size);
|
||||
debug("chain->real_img_size_in_bytes=%llu", chain->real_img_size_in_bytes);
|
||||
@@ -252,7 +252,7 @@ static void EFIAPI ventoy_dump_chain(ventoy_chain_head *chain)
|
||||
debug("chain->override_chunk_num=%u", chain->override_chunk_num);
|
||||
|
||||
ventoy_debug_pause();
|
||||
|
||||
|
||||
ventoy_dump_img_chunk(chain);
|
||||
ventoy_dump_override_chunk(chain);
|
||||
ventoy_dump_virt_chunk(chain);
|
||||
@@ -344,7 +344,7 @@ EFI_HANDLE EFIAPI ventoy_get_parent_handle(IN EFI_DEVICE_PATH_PROTOCOL *pDevPath
|
||||
EFI_DEVICE_PATH_PROTOCOL *pLastNode = NULL;
|
||||
EFI_DEVICE_PATH_PROTOCOL *pCurNode = NULL;
|
||||
EFI_DEVICE_PATH_PROTOCOL *pTmpDevPath = NULL;
|
||||
|
||||
|
||||
pTmpDevPath = DuplicateDevicePath(pDevPath);
|
||||
if (!pTmpDevPath)
|
||||
{
|
||||
@@ -387,8 +387,8 @@ EFI_STATUS EFIAPI ventoy_save_ramdisk_param(VOID)
|
||||
{
|
||||
debug("find previous ramdisk variable <%llu>", g_backup_ramdisk_param.DiskSize);
|
||||
}
|
||||
|
||||
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||
|
||||
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(g_ramdisk_param), &(g_ramdisk_param));
|
||||
debug("set ramdisk variable %r", Status);
|
||||
@@ -403,14 +403,14 @@ EFI_STATUS EFIAPI ventoy_delete_ramdisk_param(VOID)
|
||||
|
||||
if (g_backup_ramdisk_param.DiskSize > 0 && g_backup_ramdisk_param.PhyAddr > 0)
|
||||
{
|
||||
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(g_backup_ramdisk_param), &g_backup_ramdisk_param);
|
||||
debug("resotre ramdisk variable %r", Status);
|
||||
}
|
||||
else
|
||||
{
|
||||
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
0, NULL);
|
||||
debug("delete ramdisk variable %r", Status);
|
||||
@@ -432,7 +432,7 @@ EFI_STATUS EFIAPI ventoy_save_variable(VOID)
|
||||
debug("find previous efi variable <%a>", g_backup_os_param_var.vtoy_img_path);
|
||||
}
|
||||
|
||||
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(g_chain->os_param), &(g_chain->os_param));
|
||||
debug("set efi variable %r", Status);
|
||||
@@ -447,14 +447,14 @@ EFI_STATUS EFIAPI ventoy_delete_variable(VOID)
|
||||
|
||||
if (0 == CompareMem(&(g_backup_os_param_var.guid), &VarGuid, sizeof(EFI_GUID)))
|
||||
{
|
||||
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(g_backup_os_param_var), &(g_backup_os_param_var));
|
||||
debug("restore efi variable %r", Status);
|
||||
}
|
||||
else
|
||||
{
|
||||
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
0, NULL);
|
||||
debug("delete efi variable %r", Status);
|
||||
@@ -481,7 +481,7 @@ STATIC VOID ventoy_warn_invalid_device(VOID)
|
||||
|
||||
gST->ConOut->OutputString(gST->ConOut, L"This is NOT a standard Ventoy device and is NOT supported.\r\n\r\n");
|
||||
gST->ConOut->OutputString(gST->ConOut, L"You should follow the official instructions in https://www.ventoy.net\r\n");
|
||||
|
||||
|
||||
gST->ConOut->OutputString(gST->ConOut, L"\r\n\r\nWill exit after 10 seconds ...... ");
|
||||
|
||||
sleep(10);
|
||||
@@ -489,7 +489,7 @@ STATIC VOID ventoy_warn_invalid_device(VOID)
|
||||
#else
|
||||
STATIC VOID ventoy_warn_invalid_device(VOID)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -513,19 +513,19 @@ STATIC EFI_STATUS EFIAPI ventoy_load_image
|
||||
pFilePath->Header.Length[0] = FileNameLen + sizeof(EFI_DEVICE_PATH_PROTOCOL);
|
||||
pFilePath->Header.Length[1] = 0;
|
||||
CopyMem(pFilePath->PathName, FileName, FileNameLen);
|
||||
|
||||
|
||||
pImgPath = AppendDevicePathNode(pDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)pFilePath);
|
||||
if (!pImgPath)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
Status = gBS->LoadImage(FALSE, ImageHandle, pImgPath, NULL, 0, Image);
|
||||
|
||||
|
||||
debug("Load Image File %r DP: <%s>", Status, ConvertDevicePathToText(pImgPath, FALSE, FALSE));
|
||||
|
||||
FreePool(pImgPath);
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -547,7 +547,7 @@ STATIC EFI_STATUS EFIAPI ventoy_find_iso_disk(IN EFI_HANDLE ImageHandle)
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiBlockIoProtocolGuid,
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiBlockIoProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -591,16 +591,16 @@ STATIC EFI_STATUS EFIAPI ventoy_find_iso_disk(IN EFI_HANDLE ImageHandle)
|
||||
ventoy_warn_invalid_device();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
gBlockData.RawBlockIoHandle = Handles[i];
|
||||
gBlockData.pRawBlockIo = pBlockIo;
|
||||
gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid,
|
||||
gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid,
|
||||
(VOID **)&(gBlockData.pDiskDevPath),
|
||||
ImageHandle,
|
||||
Handles[i],
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||
|
||||
debug("Find Ventoy Disk Sig Handle:%p DP:%s", Handles[i],
|
||||
|
||||
debug("Find Ventoy Disk Sig Handle:%p DP:%s", Handles[i],
|
||||
ConvertDevicePathToText(gBlockData.pDiskDevPath, FALSE, FALSE));
|
||||
break;
|
||||
}
|
||||
@@ -629,7 +629,7 @@ STATIC EFI_STATUS EFIAPI ventoy_find_iso_disk_fs(IN EFI_HANDLE ImageHandle)
|
||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pFile = NULL;
|
||||
EFI_DEVICE_PATH_PROTOCOL *pDevPath = NULL;
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid,
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -646,7 +646,7 @@ STATIC EFI_STATUS EFIAPI ventoy_find_iso_disk_fs(IN EFI_HANDLE ImageHandle)
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid,
|
||||
Status = gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid,
|
||||
(VOID **)&pDevPath,
|
||||
ImageHandle,
|
||||
Handles[i],
|
||||
@@ -683,29 +683,29 @@ STATIC EFI_STATUS EFIAPI ventoy_load_isoefi_driver(IN EFI_HANDLE ImageHandle)
|
||||
|
||||
if (gIsoUdf)
|
||||
{
|
||||
Status = ventoy_load_image(ImageHandle, gBlockData.pDiskFsDevPath,
|
||||
gUdfEfiDriverPath,
|
||||
sizeof(gUdfEfiDriverPath),
|
||||
Status = ventoy_load_image(ImageHandle, gBlockData.pDiskFsDevPath,
|
||||
gUdfEfiDriverPath,
|
||||
sizeof(gUdfEfiDriverPath),
|
||||
&Image);
|
||||
debug("load iso UDF efi driver status:%r", Status);
|
||||
}
|
||||
else
|
||||
{
|
||||
Status = ventoy_load_image(ImageHandle, gBlockData.pDiskFsDevPath,
|
||||
gIso9660EfiDriverPath,
|
||||
sizeof(gIso9660EfiDriverPath),
|
||||
Status = ventoy_load_image(ImageHandle, gBlockData.pDiskFsDevPath,
|
||||
gIso9660EfiDriverPath,
|
||||
sizeof(gIso9660EfiDriverPath),
|
||||
&Image);
|
||||
debug("load iso 9660 efi driver status:%r", Status);
|
||||
debug("load iso 9660 efi driver status:%r", Status);
|
||||
}
|
||||
|
||||
if (gDebugPrint)
|
||||
{
|
||||
gRT->SetVariable(L"FS_LOGGING", &gShellVariableGuid,
|
||||
gRT->SetVariable(L"FS_LOGGING", &gShellVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(LogVar), LogVar);
|
||||
}
|
||||
|
||||
gRT->SetVariable(L"FS_NAME_NOCASE", &gShellVariableGuid,
|
||||
gRT->SetVariable(L"FS_NAME_NOCASE", &gShellVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(LogVar), LogVar);
|
||||
|
||||
@@ -732,7 +732,7 @@ STATIC EFI_STATUS ventoy_proc_img_replace_name(ventoy_grub_param_file_replace *r
|
||||
}
|
||||
|
||||
AsciiStrCpyS(tmp, sizeof(tmp), replace->old_file_name[0]);
|
||||
|
||||
|
||||
for (i = 0; i < 256 && tmp[i]; i++)
|
||||
{
|
||||
if (tmp[i] == '/')
|
||||
@@ -755,7 +755,7 @@ EFI_STATUS EFIAPI ventoy_get_variable_wrapper
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status = EFI_SUCCESS;
|
||||
|
||||
|
||||
Status = g_org_get_variable(VariableName, VendorGuid, Attributes, DataSize, Data);
|
||||
if (StrCmp(VariableName, L"SecureBoot") == 0)
|
||||
{
|
||||
@@ -779,7 +779,7 @@ EFI_STATUS EFIAPI ventoy_exit_boot_service_wrapper
|
||||
gRT->GetVariable = g_org_get_variable;
|
||||
g_org_get_variable = NULL;
|
||||
}
|
||||
|
||||
|
||||
return g_org_exit_boot_service(ImageHandle, MapKey);
|
||||
}
|
||||
|
||||
@@ -803,12 +803,12 @@ STATIC EFI_STATUS EFIAPI ventoy_disable_secure_boot(IN EFI_HANDLE ImageHandle)
|
||||
|
||||
/* step1: wrapper security protocol. */
|
||||
/* Do we still need it since we have been loaded ? */
|
||||
|
||||
|
||||
|
||||
|
||||
/* step2: fake SecureBoot variable */
|
||||
g_org_exit_boot_service = gBS->ExitBootServices;
|
||||
gBS->ExitBootServices = ventoy_exit_boot_service_wrapper;
|
||||
|
||||
|
||||
g_org_get_variable = gRT->GetVariable;
|
||||
gRT->GetVariable = ventoy_get_variable_wrapper;
|
||||
|
||||
@@ -817,7 +817,7 @@ STATIC EFI_STATUS EFIAPI ventoy_disable_secure_boot(IN EFI_HANDLE ImageHandle)
|
||||
|
||||
|
||||
STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
{
|
||||
{
|
||||
UINT32 i = 0;
|
||||
UINT32 old_cnt = 0;
|
||||
UINTN size = 0;
|
||||
@@ -846,12 +846,12 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
{
|
||||
gDebugPrint = TRUE;
|
||||
}
|
||||
|
||||
|
||||
if (StrStr(pCmdLine, L"fallback"))
|
||||
{
|
||||
gBootFallBack = TRUE;
|
||||
}
|
||||
|
||||
|
||||
if (StrStr(pCmdLine, L"dotefi"))
|
||||
{
|
||||
gDotEfiBoot = TRUE;
|
||||
@@ -861,7 +861,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
{
|
||||
gLoadIsoEfi = TRUE;
|
||||
}
|
||||
|
||||
|
||||
if (StrStr(pCmdLine, L"iso_udf"))
|
||||
{
|
||||
gIsoUdf = TRUE;
|
||||
@@ -899,7 +899,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
pGrubParam = (ventoy_grub_param *)StrHexToUintn(pPos + StrLen(L"env_param="));
|
||||
grub_env_set = pGrubParam->grub_env_set;
|
||||
grub_env_get = pGrubParam->grub_env_get;
|
||||
@@ -914,7 +914,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
ventoy_warn_invalid_device();
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
g_file_replace_list = &pGrubParam->file_replace;
|
||||
old_cnt = g_file_replace_list->old_file_cnt;
|
||||
debug("file replace: magic:0x%x virtid:%u name count:%u <%a> <%a> <%a> <%a>",
|
||||
@@ -927,7 +927,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
old_cnt > 3 ? g_file_replace_list->old_file_name[3] : ""
|
||||
);
|
||||
|
||||
|
||||
|
||||
for (i = 0; i < VTOY_MAX_CONF_REPLACE; i++)
|
||||
{
|
||||
replace = pGrubParam->img_replace + i;
|
||||
@@ -948,7 +948,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
pPos = StrStr(pCmdLine, L"mem:");
|
||||
chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
|
||||
|
||||
@@ -977,7 +977,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
debug("This is normal mode");
|
||||
g_chain = AllocatePool(size);
|
||||
CopyMem(g_chain, chain, size);
|
||||
|
||||
|
||||
g_chunk = (ventoy_img_chunk *)((char *)g_chain + g_chain->img_chunk_offset);
|
||||
g_img_chunk_num = g_chain->img_chunk_num;
|
||||
g_override_chunk = (ventoy_override_chunk *)((char *)g_chain + g_chain->override_chunk_offset);
|
||||
@@ -997,7 +997,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
{
|
||||
g_hook_keyboard = TRUE;
|
||||
}
|
||||
|
||||
|
||||
if (g_os_param_reserved[5] == 1 && g_os_param_reserved[2] == ventoy_chain_linux)
|
||||
{
|
||||
ventoy_disable_secure_boot(ImageHandle);
|
||||
@@ -1024,7 +1024,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||
}
|
||||
|
||||
g_fix_windows_1st_cdrom_issue = FALSE;
|
||||
if (ventoy_chain_windows == g_os_param_reserved[2] ||
|
||||
if (ventoy_chain_windows == g_os_param_reserved[2] ||
|
||||
ventoy_chain_wim == g_os_param_reserved[2])
|
||||
{
|
||||
if (ventoy_is_cdrom_dp_exist())
|
||||
@@ -1066,7 +1066,7 @@ EFI_STATUS EFIAPI ventoy_clean_env(VOID)
|
||||
|
||||
if (!gMemdiskMode)
|
||||
{
|
||||
FreePool(g_chain);
|
||||
FreePool(g_chain);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@@ -1126,7 +1126,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
||||
Count = 0;
|
||||
Handles = NULL;
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid,
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -1145,7 +1145,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
||||
|
||||
debug("FS:%u Protocol:%p OpenVolume:%p", i, pFile, pFile->OpenVolume);
|
||||
|
||||
Status = gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid,
|
||||
Status = gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid,
|
||||
(VOID **)&pDevPath,
|
||||
ImageHandle,
|
||||
Handles[i],
|
||||
@@ -1165,7 +1165,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
||||
|
||||
for (j = gBootFileStartIndex; j < ARRAY_SIZE(gEfiBootFileName); j++)
|
||||
{
|
||||
Status = ventoy_load_image(ImageHandle, pDevPath, gEfiBootFileName[j],
|
||||
Status = ventoy_load_image(ImageHandle, pDevPath, gEfiBootFileName[j],
|
||||
StrSize(gEfiBootFileName[j]), &Image);
|
||||
if (EFI_SUCCESS == Status)
|
||||
{
|
||||
@@ -1187,7 +1187,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
||||
{
|
||||
gST->ConIn->Reset(gST->ConIn, FALSE);
|
||||
}
|
||||
|
||||
|
||||
if ((g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC) || g_img_replace_list)
|
||||
{
|
||||
ventoy_wrapper_push_openvolume(pFile->OpenVolume);
|
||||
@@ -1199,7 +1199,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
||||
//ventoy_wrapper_system();
|
||||
Status = gBS->StartImage(Image, NULL, NULL);
|
||||
ventoy_hook_stop();
|
||||
|
||||
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
debug("Failed to start image %r", Status);
|
||||
@@ -1217,7 +1217,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
debug("Fs not found, now wait and retry...");
|
||||
sleep(1);
|
||||
}
|
||||
@@ -1239,7 +1239,7 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
||||
{
|
||||
EFI_STATUS Status = EFI_SUCCESS;
|
||||
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *Protocol;
|
||||
|
||||
|
||||
g_sector_flag_num = 512; /* initial value */
|
||||
|
||||
g_sector_flag = AllocatePool(g_sector_flag_num * sizeof(ventoy_sector_flag));
|
||||
@@ -1263,6 +1263,11 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (g_os_param_reserved[11])
|
||||
{
|
||||
ventoy_lock_res(g_os_param_reserved[11]);
|
||||
}
|
||||
|
||||
ventoy_disable_ex_filesystem();
|
||||
|
||||
if (gMemdiskMode)
|
||||
@@ -1278,12 +1283,12 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
||||
ventoy_find_iso_disk_fs(ImageHandle);
|
||||
ventoy_load_isoefi_driver(ImageHandle);
|
||||
}
|
||||
|
||||
|
||||
ventoy_install_blockio(ImageHandle, g_iso_buf_size);
|
||||
ventoy_debug_pause();
|
||||
|
||||
Status = ventoy_boot(ImageHandle);
|
||||
|
||||
|
||||
ventoy_delete_ramdisk_param();
|
||||
|
||||
if (gLoadIsoEfi && gBlockData.IsoDriverImage)
|
||||
@@ -1310,14 +1315,14 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
||||
}
|
||||
|
||||
ventoy_debug_pause();
|
||||
|
||||
|
||||
ventoy_install_blockio(ImageHandle, g_chain->virt_img_size_in_bytes);
|
||||
|
||||
ventoy_debug_pause();
|
||||
|
||||
Status = ventoy_boot(ImageHandle);
|
||||
}
|
||||
|
||||
|
||||
ventoy_clean_env();
|
||||
}
|
||||
|
||||
@@ -1330,17 +1335,22 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ventoy_clear_input();
|
||||
gST->ConOut->ClearScreen(gST->ConOut);
|
||||
|
||||
if (gDotEfiBoot && (EFI_NOT_FOUND == Status))
|
||||
{
|
||||
grub_env_set("vtoy_dotefi_retry", "YES");
|
||||
grub_env_set("vtoy_dotefi_retry", "YES");
|
||||
}
|
||||
|
||||
ventoy_enable_ex_filesystem();
|
||||
|
||||
if (g_os_param_reserved[11])
|
||||
{
|
||||
ventoy_unlock_res();
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,17 +7,17 @@
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __VENTOY_H__
|
||||
#define __VENTOY_H__
|
||||
|
||||
@@ -54,7 +54,7 @@ typedef struct ventoy_image_disk_region
|
||||
typedef struct ventoy_image_location
|
||||
{
|
||||
ventoy_guid guid;
|
||||
|
||||
|
||||
/* image sector size, currently this value is always 2048 */
|
||||
UINT32 image_sector_size;
|
||||
|
||||
@@ -62,10 +62,10 @@ typedef struct ventoy_image_location
|
||||
UINT32 disk_sector_size;
|
||||
|
||||
UINT32 region_count;
|
||||
|
||||
|
||||
/*
|
||||
* disk region data
|
||||
* If the image file has more than one fragments in disk,
|
||||
* If the image file has more than one fragments in disk,
|
||||
* there will be more than one region data here.
|
||||
*
|
||||
*/
|
||||
@@ -86,7 +86,7 @@ typedef struct ventoy_os_param
|
||||
char vtoy_img_path[384]; // It seems to be enough, utf-8 format
|
||||
UINT64 vtoy_img_size; // image file size in bytes
|
||||
|
||||
/*
|
||||
/*
|
||||
* Ventoy will write a copy of ventoy_image_location data into runtime memory
|
||||
* this is the physically address and length of that memory.
|
||||
* Address 0 means no such data exist.
|
||||
@@ -95,7 +95,7 @@ typedef struct ventoy_os_param
|
||||
*/
|
||||
UINT64 vtoy_img_location_addr;
|
||||
UINT32 vtoy_img_location_len;
|
||||
|
||||
|
||||
UINT64 vtoy_reserved[4]; // Internal use by ventoy
|
||||
|
||||
UINT8 vtoy_disk_signature[4];
|
||||
@@ -124,7 +124,7 @@ typedef struct ventoy_chain_head
|
||||
UINT64 virt_img_size_in_bytes;
|
||||
UINT32 boot_catalog;
|
||||
UINT8 boot_catalog_sector[2048];
|
||||
|
||||
|
||||
UINT32 img_chunk_offset;
|
||||
UINT32 img_chunk_num;
|
||||
|
||||
@@ -199,11 +199,11 @@ typedef struct ventoy_virt_chunk
|
||||
typedef struct ventoy_sector_flag
|
||||
{
|
||||
UINT8 flag; // 0:init 1:mem 2:remap
|
||||
UINT64 remap_lba;
|
||||
UINT64 remap_lba;
|
||||
}ventoy_sector_flag;
|
||||
|
||||
|
||||
typedef struct vtoy_block_data
|
||||
typedef struct vtoy_block_data
|
||||
{
|
||||
EFI_HANDLE Handle;
|
||||
EFI_BLOCK_IO_MEDIA Media; /* Media descriptor */
|
||||
@@ -272,7 +272,7 @@ typedef struct ventoy_grub_param
|
||||
grub_env_set_pf grub_env_set;
|
||||
ventoy_grub_param_file_replace file_replace;
|
||||
ventoy_grub_param_file_replace img_replace[VTOY_MAX_CONF_REPLACE];
|
||||
grub_env_printf_pf grub_env_printf;
|
||||
grub_env_printf_pf grub_env_printf;
|
||||
}ventoy_grub_param;
|
||||
|
||||
typedef struct ventoy_ram_disk
|
||||
@@ -318,7 +318,7 @@ typedef struct MBR_HEAD
|
||||
#pragma pack()
|
||||
|
||||
|
||||
typedef struct well_known_guid
|
||||
typedef struct well_known_guid
|
||||
{
|
||||
EFI_GUID *guid;
|
||||
const char *name;
|
||||
@@ -331,7 +331,7 @@ typedef struct ventoy_system_wrapper
|
||||
|
||||
EFI_HANDLE_PROTOCOL NewHandleProtocol;
|
||||
EFI_HANDLE_PROTOCOL OriHandleProtocol;
|
||||
|
||||
|
||||
EFI_OPEN_PROTOCOL NewOpenProtocol;
|
||||
EFI_OPEN_PROTOCOL OriOpenProtocol;
|
||||
|
||||
@@ -382,7 +382,7 @@ typedef struct DriverBindWrapper
|
||||
extern BOOLEAN gDebugPrint;
|
||||
VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...);
|
||||
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID);
|
||||
EFI_STATUS EFIAPI ventoy_block_io_read
|
||||
EFI_STATUS EFIAPI ventoy_block_io_read
|
||||
(
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
@@ -428,6 +428,8 @@ EFI_STATUS ventoy_hook_1st_cdrom_start(VOID);
|
||||
EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID);
|
||||
EFI_STATUS ventoy_disable_ex_filesystem(VOID);
|
||||
EFI_STATUS ventoy_enable_ex_filesystem(VOID);
|
||||
EFI_STATUS ventoy_lock_res(UINT8 LockType);
|
||||
EFI_STATUS ventoy_unlock_res(VOID);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
@@ -85,7 +85,7 @@ BOOLEAN ventoy_is_cdrom_dp_exist(VOID)
|
||||
EFI_STATUS Status = EFI_SUCCESS;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL;
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDevicePathProtocolGuid,
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDevicePathProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -107,24 +107,24 @@ BOOLEAN ventoy_is_cdrom_dp_exist(VOID)
|
||||
FreePool(Handles);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
DevicePath = NextDevicePathNode(DevicePath);
|
||||
}
|
||||
}
|
||||
|
||||
FreePool(Handles);
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Block IO procotol */
|
||||
#endif
|
||||
|
||||
EFI_STATUS EFIAPI ventoy_block_io_reset
|
||||
EFI_STATUS EFIAPI ventoy_block_io_reset
|
||||
(
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
)
|
||||
{
|
||||
(VOID)This;
|
||||
(VOID)ExtendedVerification;
|
||||
@@ -151,8 +151,8 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
||||
ventoy_img_chunk *pchunk = g_chunk;
|
||||
ventoy_override_chunk *pOverride = g_override_chunk;
|
||||
EFI_BLOCK_IO_PROTOCOL *pRawBlockIo = gBlockData.pRawBlockIo;
|
||||
|
||||
debug("read iso sector %lu count %u Buffer:%p Align:%u blk:%u",
|
||||
|
||||
debug("read iso sector %lu count %u Buffer:%p Align:%u blk:%u",
|
||||
Sector, Count, Buffer, pRawBlockIo->Media->IoAlign, pRawBlockIo->Media->BlockSize);
|
||||
|
||||
ReadStart = Sector * 2048;
|
||||
@@ -207,7 +207,7 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
||||
{
|
||||
OverrideStart = pOverride->img_offset;
|
||||
OverrideEnd = pOverride->img_offset + pOverride->override_size;
|
||||
|
||||
|
||||
if (OverrideStart >= ReadEnd || ReadStart >= OverrideEnd)
|
||||
{
|
||||
continue;
|
||||
@@ -217,7 +217,7 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
||||
{
|
||||
if (ReadEnd <= OverrideEnd)
|
||||
{
|
||||
CopyMem(pCurBuf + OverrideStart - ReadStart, pOverride->override_data, ReadEnd - OverrideStart);
|
||||
CopyMem(pCurBuf + OverrideStart - ReadStart, pOverride->override_data, ReadEnd - OverrideStart);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -228,7 +228,7 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
||||
{
|
||||
if (ReadEnd <= OverrideEnd)
|
||||
{
|
||||
CopyMem(pCurBuf, pOverride->override_data + ReadStart - OverrideStart, ReadEnd - ReadStart);
|
||||
CopyMem(pCurBuf, pOverride->override_data + ReadStart - OverrideStart, ReadEnd - ReadStart);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -236,7 +236,7 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
||||
}
|
||||
}
|
||||
|
||||
if (g_fixup_iso9660_secover_enable && (!g_fixup_iso9660_secover_start) &&
|
||||
if (g_fixup_iso9660_secover_enable && (!g_fixup_iso9660_secover_start) &&
|
||||
pOverride->override_size == sizeof(ventoy_iso9660_override))
|
||||
{
|
||||
ventoy_iso9660_override *dirent = (ventoy_iso9660_override *)pOverride->override_data;
|
||||
@@ -256,7 +256,7 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
STATIC EFI_STATUS EFIAPI ventoy_write_iso_sector
|
||||
@@ -276,7 +276,7 @@ STATIC EFI_STATUS EFIAPI ventoy_write_iso_sector
|
||||
UINT8 *pCurBuf = (UINT8 *)Buffer;
|
||||
ventoy_img_chunk *pchunk = g_chunk;
|
||||
EFI_BLOCK_IO_PROTOCOL *pRawBlockIo = gBlockData.pRawBlockIo;
|
||||
|
||||
|
||||
debug("write iso sector %lu count %u", Sector, Count);
|
||||
|
||||
ReadStart = Sector * 2048;
|
||||
@@ -321,17 +321,17 @@ STATIC EFI_STATUS EFIAPI ventoy_write_iso_sector
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS EFIAPI ventoy_block_io_ramdisk_write
|
||||
EFI_STATUS EFIAPI ventoy_block_io_ramdisk_write
|
||||
(
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
)
|
||||
{
|
||||
(VOID)This;
|
||||
(VOID)MediaId;
|
||||
@@ -349,14 +349,14 @@ EFI_STATUS EFIAPI ventoy_block_io_ramdisk_write
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS EFIAPI ventoy_block_io_ramdisk_read
|
||||
EFI_STATUS EFIAPI ventoy_block_io_ramdisk_read
|
||||
(
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
)
|
||||
{
|
||||
//debug("### ventoy_block_io_ramdisk_read sector:%u count:%u", (UINT32)Lba, (UINT32)BufferSize / 2048);
|
||||
|
||||
@@ -364,12 +364,12 @@ EFI_STATUS EFIAPI ventoy_block_io_ramdisk_read
|
||||
(VOID)MediaId;
|
||||
|
||||
CopyMem(Buffer, g_iso_data_buf + (Lba * 2048), BufferSize);
|
||||
|
||||
|
||||
if (g_blockio_start_record_bcd && FALSE == g_blockio_bcd_read_done)
|
||||
{
|
||||
if (*(UINT32 *)Buffer == 0x66676572)
|
||||
{
|
||||
g_blockio_bcd_read_done = TRUE;
|
||||
g_blockio_bcd_read_done = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -429,14 +429,14 @@ end:
|
||||
return Lba;
|
||||
}
|
||||
|
||||
EFI_STATUS EFIAPI ventoy_block_io_read_real
|
||||
EFI_STATUS EFIAPI ventoy_block_io_read_real
|
||||
(
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
)
|
||||
{
|
||||
UINT32 i = 0;
|
||||
UINT32 j = 0;
|
||||
@@ -450,7 +450,7 @@ EFI_STATUS EFIAPI ventoy_block_io_read_real
|
||||
UINT8 *lastbuffer;
|
||||
ventoy_sector_flag *cur_flag;
|
||||
ventoy_virt_chunk *node;
|
||||
|
||||
|
||||
debug("### block_io_read_real sector:%u count:%u Buffer:%p", (UINT32)Lba, (UINT32)BufferSize / 2048, Buffer);
|
||||
|
||||
secNum = BufferSize / 2048;
|
||||
@@ -510,7 +510,7 @@ EFI_STATUS EFIAPI ventoy_block_io_read_real
|
||||
{
|
||||
if (curlba >= node->mem_sector_start && curlba < node->mem_sector_end)
|
||||
{
|
||||
CopyMem((UINT8 *)Buffer + j * 2048,
|
||||
CopyMem((UINT8 *)Buffer + j * 2048,
|
||||
(char *)g_virt_chunk + node->mem_sector_offset + (curlba - node->mem_sector_start) * 2048,
|
||||
2048);
|
||||
cur_flag->flag = 1;
|
||||
@@ -564,7 +564,7 @@ EFI_STATUS EFIAPI ventoy_block_io_read
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
)
|
||||
{
|
||||
UINT32 IoAlign = 0;
|
||||
VOID *NewBuf = NULL;
|
||||
@@ -593,18 +593,18 @@ EFI_STATUS EFIAPI ventoy_block_io_read
|
||||
return Status;
|
||||
}
|
||||
|
||||
EFI_STATUS EFIAPI ventoy_block_io_write
|
||||
EFI_STATUS EFIAPI ventoy_block_io_write
|
||||
(
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
)
|
||||
{
|
||||
UINT32 secNum = 0;
|
||||
UINT64 offset = 0;
|
||||
|
||||
|
||||
(VOID)This;
|
||||
(VOID)MediaId;
|
||||
|
||||
@@ -636,8 +636,8 @@ STATIC UINTN ventoy_get_current_device_path_id(VOID)
|
||||
EFI_STATUS Status = EFI_SUCCESS;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL;
|
||||
VENDOR_DEVICE_PATH *venPath = NULL;
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDevicePathProtocolGuid,
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDevicePathProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -688,7 +688,7 @@ EFI_STATUS EFIAPI ventoy_fill_device_path(VOID)
|
||||
venPath->Header.Length[1] = 0;
|
||||
CopyMem(&venPath->Guid, &gVtoyBlockDevicePathGuid, sizeof(EFI_GUID));
|
||||
CopyMem(venPath + 1, VtoyDpName, NameLen);
|
||||
|
||||
|
||||
gBlockData.Path = AppendDevicePathNode(NULL, (EFI_DEVICE_PATH_PROTOCOL *)TmpBuf);
|
||||
gBlockData.DevicePathCompareLen = sizeof(VENDOR_DEVICE_PATH) + NameLen;
|
||||
|
||||
@@ -710,7 +710,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
|
||||
|
||||
debug("ventoy_connect_driver <%s>...", DrvName);
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid,
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -748,7 +748,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
|
||||
FreePool(Handles);
|
||||
Handles = NULL;
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid,
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -781,10 +781,10 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
|
||||
}
|
||||
|
||||
Status = EFI_NOT_FOUND;
|
||||
|
||||
|
||||
end:
|
||||
FreePool(Handles);
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -805,11 +805,11 @@ STATIC BOOLEAN ventoy_filesystem_need_wrapper(IN CONST CHAR16 *DrvName)
|
||||
}
|
||||
|
||||
/*
|
||||
* suppress some file system drivers
|
||||
* suppress some file system drivers
|
||||
* 1. rEFInd File System Driver
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
if (StrStr(UpperDrvName, L"REFIND") && StrStr(UpperDrvName, L"FILE SYSTEM"))
|
||||
{
|
||||
return TRUE;
|
||||
@@ -820,7 +820,7 @@ STATIC BOOLEAN ventoy_filesystem_need_wrapper(IN CONST CHAR16 *DrvName)
|
||||
|
||||
STATIC VOID ventoy_add_filesystem_wrapper
|
||||
(
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol,
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol,
|
||||
IN CONST CHAR16 *DriverName
|
||||
)
|
||||
{
|
||||
@@ -865,10 +865,10 @@ STATIC EFI_STATUS ventoy_find_filesystem_driverbind(VOID)
|
||||
EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL;
|
||||
EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol = NULL;
|
||||
|
||||
|
||||
debug("ventoy_find_filesystem_driverbind...");
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid,
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -899,7 +899,7 @@ STATIC EFI_STATUS ventoy_find_filesystem_driverbind(VOID)
|
||||
FreePool(Handles);
|
||||
Handles = NULL;
|
||||
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid,
|
||||
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid,
|
||||
NULL, &Count, &Handles);
|
||||
if (EFI_ERROR(Status))
|
||||
{
|
||||
@@ -927,7 +927,7 @@ STATIC EFI_STATUS ventoy_find_filesystem_driverbind(VOID)
|
||||
}
|
||||
|
||||
FreePool(Handles);
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -988,7 +988,7 @@ EFI_STATUS ventoy_disable_ex_filesystem(VOID)
|
||||
|
||||
debug("Wrapper Ex Driver Binding %lu", g_DriverBindWrapperCnt);
|
||||
ventoy_debug_pause();
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1046,10 +1046,10 @@ EFI_STATUS EFIAPI ventoy_block_io_read_512
|
||||
if (BufferSize >= 2048)
|
||||
{
|
||||
ReadSize = BufferSize / 2048 * 2048;
|
||||
|
||||
|
||||
Status |= g_sector_2048_read(This, MediaId, Lba / 4, ReadSize, CurBuf);
|
||||
CurBuf += ReadSize;
|
||||
|
||||
|
||||
Lba += ReadSize / 512;
|
||||
BufferSize -= ReadSize;
|
||||
}
|
||||
@@ -1096,7 +1096,7 @@ EFI_STATUS EFIAPI ventoy_block_io_write_512
|
||||
ReadSize = (4 - Mod) * 512;
|
||||
CopyMem(g_sector_buf + Mod * 512, CurBuf, ReadSize);
|
||||
g_sector_2048_write(This, MediaId, Lba / 4, 2048, g_sector_buf);
|
||||
|
||||
|
||||
CurBuf += ReadSize;
|
||||
Lba += (4 - Mod);
|
||||
BufferSize -= ReadSize;
|
||||
@@ -1106,10 +1106,10 @@ EFI_STATUS EFIAPI ventoy_block_io_write_512
|
||||
if (BufferSize >= 2048)
|
||||
{
|
||||
ReadSize = BufferSize / 2048 * 2048;
|
||||
|
||||
|
||||
Status |= g_sector_2048_write(This, MediaId, Lba / 4, ReadSize, CurBuf);
|
||||
CurBuf += ReadSize;
|
||||
|
||||
|
||||
Lba += ReadSize / 512;
|
||||
BufferSize -= ReadSize;
|
||||
}
|
||||
@@ -1117,7 +1117,7 @@ EFI_STATUS EFIAPI ventoy_block_io_write_512
|
||||
if (BufferSize > 0)
|
||||
{
|
||||
Status |= g_sector_2048_read(This, MediaId, Lba / 4, 2048, g_sector_buf);
|
||||
|
||||
|
||||
CopyMem(g_sector_buf, CurBuf, BufferSize);
|
||||
g_sector_2048_write(This, MediaId, Lba / 4, 2048, g_sector_buf);
|
||||
}
|
||||
@@ -1126,10 +1126,10 @@ EFI_STATUS EFIAPI ventoy_block_io_write_512
|
||||
}
|
||||
|
||||
EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 ImgSize)
|
||||
{
|
||||
{
|
||||
EFI_STATUS Status = EFI_SUCCESS;
|
||||
EFI_BLOCK_IO_PROTOCOL *pBlockIo = &(gBlockData.BlockIo);
|
||||
|
||||
|
||||
ventoy_fill_device_path();
|
||||
|
||||
debug("install block io protocol %p", ImageHandle);
|
||||
@@ -1144,10 +1144,10 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
|
||||
else
|
||||
{
|
||||
gBlockData.Media.BlockSize = 2048;
|
||||
gBlockData.Media.LastBlock = ImgSize / 2048 - 1;
|
||||
gBlockData.Media.LastBlock = ImgSize / 2048 - 1;
|
||||
gBlockData.Media.ReadOnly = TRUE;
|
||||
}
|
||||
|
||||
|
||||
gBlockData.Media.MediaPresent = 1;
|
||||
gBlockData.Media.LogicalBlocksPerPhysicalBlock = 1;
|
||||
|
||||
@@ -1164,10 +1164,10 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
|
||||
}
|
||||
else
|
||||
{
|
||||
pBlockIo->ReadBlocks = gMemdiskMode ? ventoy_block_io_ramdisk_read : ventoy_block_io_read;
|
||||
pBlockIo->ReadBlocks = gMemdiskMode ? ventoy_block_io_ramdisk_read : ventoy_block_io_read;
|
||||
pBlockIo->WriteBlocks = ventoy_block_io_write;
|
||||
}
|
||||
|
||||
|
||||
pBlockIo->FlushBlocks = ventoy_block_io_flush;
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces(&gBlockData.Handle,
|
||||
@@ -1295,7 +1295,7 @@ DEF_WRAP_FUNC(7);
|
||||
#error "VTOY_MAX_CONF_REPLACE overflow"
|
||||
#endif
|
||||
|
||||
static EFI_FILE_FLUSH_EX g_img_flush_func[VTOY_MAX_CONF_REPLACE] =
|
||||
static EFI_FILE_FLUSH_EX g_img_flush_func[VTOY_MAX_CONF_REPLACE] =
|
||||
{
|
||||
ventoy_wrapper_file_flush_ex_img0,
|
||||
ventoy_wrapper_file_flush_ex_img1,
|
||||
@@ -1335,7 +1335,7 @@ STATIC ventoy_efi_file_replace *ventoy_wrapper_get_replace(EFI_FILE_HANDLE This)
|
||||
return g_img_file_replace + i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1369,7 +1369,7 @@ ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
|
||||
ventoy_efi_file_replace *replace = NULL;
|
||||
|
||||
replace = ventoy_wrapper_get_replace(This);
|
||||
|
||||
|
||||
if (Position <= replace->FileSizeBytes)
|
||||
{
|
||||
replace->CurPos = Position;
|
||||
@@ -1378,7 +1378,7 @@ ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
|
||||
{
|
||||
replace->CurPos = replace->FileSizeBytes;
|
||||
}
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1425,7 +1425,7 @@ ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, V
|
||||
//Info->FileName = EFI_FILE_READ_ONLY;
|
||||
|
||||
*Len = Info->Size;
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1437,7 +1437,7 @@ ventoy_wrapper_file_read(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
|
||||
ventoy_efi_file_replace *replace = NULL;
|
||||
|
||||
replace = ventoy_wrapper_get_replace(This);
|
||||
|
||||
|
||||
debug("ventoy_wrapper_file_read ... %u", *Len);
|
||||
|
||||
if (replace->CurPos + ReadLen > replace->FileSizeBytes)
|
||||
@@ -1494,7 +1494,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, B
|
||||
STATIC BOOLEAN EFIAPI ventoy_replace_name_match(CHAR8 *pReplace, CHAR8 *pName)
|
||||
{
|
||||
UINTN Len1, Len2;
|
||||
|
||||
|
||||
Len1 = AsciiStrLen(pReplace);
|
||||
Len2 = AsciiStrLen(pName);
|
||||
|
||||
@@ -1521,10 +1521,10 @@ STATIC BOOLEAN EFIAPI ventoy_replace_name_match(CHAR8 *pReplace, CHAR8 *pName)
|
||||
|
||||
STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||
(
|
||||
EFI_FILE_HANDLE This,
|
||||
EFI_FILE_HANDLE This,
|
||||
EFI_FILE_HANDLE *New,
|
||||
CHAR16 *Name,
|
||||
UINT64 Mode,
|
||||
CHAR16 *Name,
|
||||
UINT64 Mode,
|
||||
UINT64 Attributes
|
||||
)
|
||||
{
|
||||
@@ -1571,7 +1571,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||
virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id;
|
||||
|
||||
Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start);
|
||||
|
||||
|
||||
g_efi_file_replace.BlockIoSectorStart = virt->mem_sector_start;
|
||||
g_efi_file_replace.FileSizeBytes = Sectors * 2048;
|
||||
|
||||
@@ -1581,7 +1581,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||
g_efi_file_replace.BlockIoSectorStart, Sectors, Sectors * 2048);
|
||||
sleep(3);
|
||||
}
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
@@ -1605,9 +1605,9 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||
{
|
||||
AsciiStrCpyS(OldName, sizeof(OldName), replace->old_file_name[j]);
|
||||
if ((0 == AsciiStrCmp(OldName, TmpName)) ||
|
||||
(AsciiStrnCmp(OldName, "\\loader\\entries\\", 16) == 0 &&
|
||||
(AsciiStrnCmp(OldName, "\\loader\\entries\\", 16) == 0 &&
|
||||
AsciiStrCmp(OldName + 16, TmpName) == 0
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
g_original_fclose(*New);
|
||||
@@ -1617,7 +1617,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||
virt = g_virt_chunk + replace->new_file_virtual_id;
|
||||
|
||||
Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start);
|
||||
|
||||
|
||||
g_img_file_replace[i].BlockIoSectorStart = virt->mem_sector_start;
|
||||
g_img_file_replace[i].FileSizeBytes = Sectors * 2048;
|
||||
|
||||
@@ -1627,7 +1627,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||
g_img_file_replace[i].BlockIoSectorStart, Sectors, Sectors * 2048);
|
||||
sleep(3);
|
||||
}
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
@@ -1648,7 +1648,7 @@ EFI_STATUS EFIAPI ventoy_wrapper_open_volume
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status = EFI_SUCCESS;
|
||||
|
||||
|
||||
Status = g_original_open_volume(This, Root);
|
||||
if (!EFI_ERROR(Status))
|
||||
{
|
||||
@@ -1685,10 +1685,10 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_read_key_ex
|
||||
KeyData->Key.UnicodeChar = 0;
|
||||
KeyData->KeyState.KeyShiftState = 0;
|
||||
KeyData->KeyState.KeyToggleState = 0;
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
return g_org_read_key_ex(This, KeyData);
|
||||
}
|
||||
|
||||
@@ -1725,7 +1725,7 @@ EFI_STATUS ventoy_hook_keyboard_start(VOID)
|
||||
|
||||
g_org_read_key = gST->ConIn->ReadKeyStroke;
|
||||
gST->ConIn->ReadKeyStroke = ventoy_wrapper_read_key;
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1763,7 +1763,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_locate_handle
|
||||
EFI_STATUS Status = EFI_SUCCESS;
|
||||
|
||||
Status = g_org_locate_handle(SearchType, Protocol, SearchKey, BufferSize, Buffer);
|
||||
|
||||
|
||||
if (EFI_SUCCESS == Status && Protocol && CompareGuid(&gEfiBlockIoProtocolGuid, Protocol))
|
||||
{
|
||||
for (i = 0; i < (*BufferSize) / sizeof(EFI_HANDLE); i++)
|
||||
@@ -1785,7 +1785,7 @@ EFI_STATUS ventoy_hook_1st_cdrom_start(VOID)
|
||||
{
|
||||
g_org_locate_handle = gBS->LocateHandle;
|
||||
gBS->LocateHandle = ventoy_wrapper_locate_handle;
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1793,7 +1793,180 @@ EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID)
|
||||
{
|
||||
gBS->LocateHandle = g_org_locate_handle;
|
||||
g_org_locate_handle = NULL;
|
||||
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
/* For force highest resolution for Windows/WinPE */
|
||||
#endif
|
||||
|
||||
|
||||
STATIC UINT32 g_org_mode_num = 0;
|
||||
STATIC EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE g_org_set_mode = NULL;
|
||||
|
||||
STATIC EFI_STATUS EFIAPI ventoy_set_mode
|
||||
(
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN UINT32 ModeNumber
|
||||
)
|
||||
{
|
||||
(void)This;
|
||||
(void)ModeNumber;
|
||||
|
||||
/* Force highest resolution */
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
STATIC EFI_STATUS EFIAPI ventoy_set_mode2
|
||||
(
|
||||
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
|
||||
IN UINT32 ModeNumber
|
||||
)
|
||||
{
|
||||
UINTN Size;
|
||||
EFI_STATUS rc;
|
||||
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info = NULL;
|
||||
|
||||
/* Force >= 1024x768 */
|
||||
rc = This->QueryMode(This, ModeNumber, &Size, &info);
|
||||
if (rc == EFI_SUCCESS)
|
||||
{
|
||||
if (info->HorizontalResolution < 1024 || info->VerticalResolution < 768)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return g_org_set_mode(This, ModeNumber);
|
||||
}
|
||||
|
||||
EFI_STATUS ventoy_lock_res(UINT8 LockType)
|
||||
{
|
||||
UINT32 i = 0;
|
||||
UINT32 x = 0;
|
||||
UINT32 y = 0;
|
||||
UINT32 SelMode = 0;
|
||||
UINT32 CurMode = 0;
|
||||
UINT32 Highest = 0;
|
||||
UINT32 M1024_768 = MAX_UINT32;
|
||||
UINTN Size;
|
||||
EFI_STATUS rc;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL;
|
||||
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info = NULL;
|
||||
|
||||
/* already hook */
|
||||
if (g_org_set_mode)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/* 1: Highest 2: 1024x768 3: >= 1024x768 */
|
||||
if (LockType == 0 || LockType > 3)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
rc = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (void **)&gop);
|
||||
if (rc != EFI_SUCCESS)
|
||||
{
|
||||
debug("Failed to locate GOP protocol");
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
if (LockType == 3)
|
||||
{
|
||||
g_org_mode_num = MAX_UINT32;
|
||||
g_org_set_mode = gop->SetMode;
|
||||
gop->SetMode = ventoy_set_mode2;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
CurMode = gop->Mode->Mode;
|
||||
|
||||
for (i = 0 ; i < gop->Mode->MaxMode ; i++)
|
||||
{
|
||||
/* Get mode information */
|
||||
if (gop->QueryMode(gop, i, &Size, &info) == EFI_SUCCESS)
|
||||
{
|
||||
if (info->HorizontalResolution == 1024 && info->VerticalResolution == 768)
|
||||
{
|
||||
M1024_768 = i;
|
||||
}
|
||||
|
||||
if (x < info->HorizontalResolution ||
|
||||
(x == info->HorizontalResolution && y < info->VerticalResolution))
|
||||
{
|
||||
Highest = i;
|
||||
x = info->HorizontalResolution;
|
||||
y = info->VerticalResolution;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (LockType == 1)
|
||||
{
|
||||
SelMode = Highest;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (M1024_768 == MAX_UINT32)
|
||||
{
|
||||
SelMode = Highest;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelMode = M1024_768;
|
||||
x = 1024;
|
||||
y = 768;
|
||||
}
|
||||
}
|
||||
|
||||
if (SelMode != CurMode)
|
||||
{
|
||||
gop->SetMode(gop, SelMode);
|
||||
}
|
||||
debug("Lock resolution to Mode:%d %d x %d", SelMode, x, y);
|
||||
|
||||
|
||||
g_org_mode_num = CurMode;
|
||||
g_org_set_mode = gop->SetMode;
|
||||
gop->SetMode = ventoy_set_mode;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS ventoy_unlock_res(VOID)
|
||||
{
|
||||
EFI_STATUS rc;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL;
|
||||
|
||||
/* not hooked yet */
|
||||
if (!g_org_set_mode)
|
||||
{
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
rc = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (void **)&gop);
|
||||
if (rc != EFI_SUCCESS)
|
||||
{
|
||||
debug("Failed to locate GOP protocol");
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (g_org_mode_num != MAX_UINT32)
|
||||
{
|
||||
g_org_set_mode(gop, g_org_mode_num);
|
||||
}
|
||||
|
||||
gop->SetMode = g_org_set_mode;
|
||||
g_org_set_mode = NULL;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
2282
GRUB2/MOD_SRC/grub-2.04/grub-core/fs/btrfs.c
Normal file
2282
GRUB2/MOD_SRC/grub-2.04/grub-core/fs/btrfs.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -23,11 +23,25 @@
|
||||
#include <grub/misc.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/time.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/fshelp.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
#define NSEC_PER_SEC ((grub_int64_t) 1000000000)
|
||||
|
||||
// GRUB 2.04 doesn't have safemath.h
|
||||
// #include <grub/safemath.h>
|
||||
|
||||
// gcc < 5.1 doesn't support __builtin_add_overflow and __builtin_mul_overflow
|
||||
// #define grub_add(a, b, res) __builtin_add_overflow(a, b, res)
|
||||
// #define grub_mul(a, b, res) __builtin_mul_overflow(a, b, res)
|
||||
// Warning: This is unsafe!
|
||||
#define grub_add(a, b, res) ({ *(res) = (a) + (b); 0; })
|
||||
|
||||
#define grub_mul(a, b, res) ({ *(res) = (a) * (b); 0; })
|
||||
|
||||
#define XFS_INODE_EXTENTS 9
|
||||
|
||||
#define XFS_INODE_FORMAT_INO 1
|
||||
@@ -74,10 +88,22 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
XFS_SB_VERSION2_PROJID32BIT | \
|
||||
XFS_SB_VERSION2_FTYPE)
|
||||
|
||||
/* Inode flags2 flags */
|
||||
#define XFS_DIFLAG2_BIGTIME_BIT 3
|
||||
#define XFS_DIFLAG2_BIGTIME (1 << XFS_DIFLAG2_BIGTIME_BIT)
|
||||
#define XFS_DIFLAG2_NREXT64_BIT 4
|
||||
#define XFS_DIFLAG2_NREXT64 (1 << XFS_DIFLAG2_NREXT64_BIT)
|
||||
|
||||
/* incompat feature flags */
|
||||
#define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */
|
||||
#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */
|
||||
#define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2) /* metadata UUID */
|
||||
#define XFS_SB_FEAT_INCOMPAT_BIGTIME (1 << 3) /* large timestamps */
|
||||
#define XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR (1 << 4) /* needs xfs_repair */
|
||||
#define XFS_SB_FEAT_INCOMPAT_NREXT64 (1 << 5) /* large extent counters */
|
||||
#define XFS_SB_FEAT_INCOMPAT_EXCHRANGE (1 << 6) /* exchangerange supported */
|
||||
#define XFS_SB_FEAT_INCOMPAT_PARENT (1 << 7) /* parent pointers */
|
||||
#define XFS_SB_FEAT_INCOMPAT_METADIR (1 << 8) /* metadata dir tree */
|
||||
|
||||
/*
|
||||
* Directory entries with ftype are explicitly handled by GRUB code.
|
||||
@@ -87,11 +113,26 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
*
|
||||
* We do not currently verify metadata UUID, so it is safe to read filesystems
|
||||
* with the XFS_SB_FEAT_INCOMPAT_META_UUID feature.
|
||||
*
|
||||
* We do not currently replay the log, so it is safe to read filesystems
|
||||
* with the XFS_SB_FEAT_INCOMPAT_EXCHRANGE feature.
|
||||
*
|
||||
* We do not currently read directory parent pointers, so it is safe to read
|
||||
* filesystems with the XFS_SB_FEAT_INCOMPAT_PARENT feature.
|
||||
*
|
||||
* We do not currently look at realtime or quota metadata, so it is safe to
|
||||
* read filesystems with the XFS_SB_FEAT_INCOMPAT_METADIR feature.
|
||||
*/
|
||||
#define XFS_SB_FEAT_INCOMPAT_SUPPORTED \
|
||||
(XFS_SB_FEAT_INCOMPAT_FTYPE | \
|
||||
XFS_SB_FEAT_INCOMPAT_SPINODES | \
|
||||
XFS_SB_FEAT_INCOMPAT_META_UUID)
|
||||
XFS_SB_FEAT_INCOMPAT_META_UUID | \
|
||||
XFS_SB_FEAT_INCOMPAT_BIGTIME | \
|
||||
XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR | \
|
||||
XFS_SB_FEAT_INCOMPAT_NREXT64 | \
|
||||
XFS_SB_FEAT_INCOMPAT_EXCHRANGE | \
|
||||
XFS_SB_FEAT_INCOMPAT_PARENT | \
|
||||
XFS_SB_FEAT_INCOMPAT_METADIR)
|
||||
|
||||
struct grub_xfs_sblock
|
||||
{
|
||||
@@ -176,33 +217,49 @@ struct grub_xfs_btree_root
|
||||
grub_uint64_t keys[1];
|
||||
} GRUB_PACKED;
|
||||
|
||||
struct grub_xfs_time
|
||||
struct grub_xfs_time_legacy
|
||||
{
|
||||
grub_uint32_t sec;
|
||||
grub_uint32_t nanosec;
|
||||
} GRUB_PACKED;
|
||||
|
||||
/*
|
||||
* The struct grub_xfs_inode layout was taken from the
|
||||
* struct xfs_dinode_core which is described here:
|
||||
* https://mirrors.edge.kernel.org/pub/linux/utils/fs/xfs/docs/xfs_filesystem_structure.pdf
|
||||
*/
|
||||
struct grub_xfs_inode
|
||||
{
|
||||
grub_uint8_t magic[2];
|
||||
grub_uint16_t mode;
|
||||
grub_uint8_t version;
|
||||
grub_uint8_t format;
|
||||
grub_uint8_t unused2[26];
|
||||
struct grub_xfs_time atime;
|
||||
struct grub_xfs_time mtime;
|
||||
struct grub_xfs_time ctime;
|
||||
grub_uint8_t unused2[18];
|
||||
grub_uint64_t nextents_big;
|
||||
grub_uint64_t atime;
|
||||
grub_uint64_t mtime;
|
||||
grub_uint64_t ctime;
|
||||
grub_uint64_t size;
|
||||
grub_uint64_t nblocks;
|
||||
grub_uint32_t extsize;
|
||||
grub_uint32_t nextents;
|
||||
grub_uint16_t unused3;
|
||||
grub_uint8_t fork_offset;
|
||||
grub_uint8_t unused4[17];
|
||||
grub_uint8_t unused4[17]; /* Last member of inode v2. */
|
||||
grub_uint8_t unused5[20]; /* First member of inode v3. */
|
||||
grub_uint64_t flags2;
|
||||
grub_uint8_t unused6[48]; /* Last member of inode v3. */
|
||||
} GRUB_PACKED;
|
||||
|
||||
#define XFS_V2_INODE_SIZE sizeof(struct grub_xfs_inode)
|
||||
#define XFS_V3_INODE_SIZE (XFS_V2_INODE_SIZE + 76)
|
||||
#define XFS_V3_INODE_SIZE sizeof(struct grub_xfs_inode)
|
||||
/* Size of struct grub_xfs_inode v2, up to unused4 member included. */
|
||||
#define XFS_V2_INODE_SIZE (XFS_V3_INODE_SIZE - 76)
|
||||
|
||||
struct grub_xfs_dir_leaf_entry
|
||||
{
|
||||
grub_uint32_t hashval;
|
||||
grub_uint32_t address;
|
||||
} GRUB_PACKED;
|
||||
|
||||
struct grub_xfs_dirblock_tail
|
||||
{
|
||||
@@ -220,6 +277,7 @@ struct grub_fshelp_node
|
||||
|
||||
struct grub_xfs_data
|
||||
{
|
||||
grub_size_t data_size;
|
||||
struct grub_xfs_sblock sblock;
|
||||
grub_disk_t disk;
|
||||
int pos;
|
||||
@@ -232,8 +290,6 @@ struct grub_xfs_data
|
||||
|
||||
static grub_dl_t my_mod;
|
||||
|
||||
|
||||
|
||||
static int grub_xfs_sb_hascrc(struct grub_xfs_data *data)
|
||||
{
|
||||
return (data->sblock.version & grub_cpu_to_be16_compile_time(XFS_SB_VERSION_NUMBITS)) ==
|
||||
@@ -296,9 +352,21 @@ static int grub_xfs_sb_valid(struct grub_xfs_data *data)
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_error (GRUB_ERR_BAD_FS, "unsupported XFS filesystem version");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
grub_xfs_sb_needs_repair (struct grub_xfs_data *data)
|
||||
{
|
||||
return ((data->sblock.version &
|
||||
grub_cpu_to_be16_compile_time (XFS_SB_VERSION_NUMBITS)) ==
|
||||
grub_cpu_to_be16_compile_time (XFS_SB_VERSION_5) &&
|
||||
(data->sblock.sb_features_incompat &
|
||||
grub_cpu_to_be32_compile_time (XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR)));
|
||||
}
|
||||
|
||||
/* Filetype information as used in inodes. */
|
||||
#define FILETYPE_INO_MASK 0170000
|
||||
#define FILETYPE_INO_REG 0100000
|
||||
@@ -354,7 +422,6 @@ GRUB_XFS_EXTENT_SIZE (struct grub_xfs_extent *exts, int ex)
|
||||
return (grub_be_to_cpu32 (exts[ex].raw[3]) & ((1 << 21) - 1));
|
||||
}
|
||||
|
||||
|
||||
static inline grub_uint64_t
|
||||
grub_xfs_inode_block (struct grub_xfs_data *data,
|
||||
grub_uint64_t ino)
|
||||
@@ -489,7 +556,7 @@ grub_xfs_read_inode (struct grub_xfs_data *data, grub_uint64_t ino,
|
||||
grub_uint64_t block = grub_xfs_inode_block (data, ino);
|
||||
int offset = grub_xfs_inode_offset (data, ino);
|
||||
|
||||
grub_dprintf("xfs", "Reading inode (%"PRIuGRUB_UINT64_T") - %"PRIuGRUB_UINT64_T", %d\n",
|
||||
grub_dprintf("xfs", "Reading inode (%" PRIuGRUB_UINT64_T ") - %" PRIuGRUB_UINT64_T ", %d\n",
|
||||
ino, block, offset);
|
||||
/* Read the inode. */
|
||||
if (grub_disk_read (data->disk, block, offset, grub_xfs_inode_size(data),
|
||||
@@ -509,11 +576,26 @@ get_fsb (const void *keys, int idx)
|
||||
return grub_be_to_cpu64 (grub_get_unaligned64 (p));
|
||||
}
|
||||
|
||||
static int
|
||||
grub_xfs_inode_has_large_extent_counts (const struct grub_xfs_inode *inode)
|
||||
{
|
||||
return inode->version >= 3 &&
|
||||
(inode->flags2 & grub_cpu_to_be64_compile_time (XFS_DIFLAG2_NREXT64));
|
||||
}
|
||||
|
||||
static grub_uint64_t
|
||||
grub_xfs_get_inode_nextents (struct grub_xfs_inode *inode)
|
||||
{
|
||||
return (grub_xfs_inode_has_large_extent_counts (inode)) ?
|
||||
grub_be_to_cpu64 (inode->nextents_big) :
|
||||
grub_be_to_cpu32 (inode->nextents);
|
||||
}
|
||||
|
||||
static grub_disk_addr_t
|
||||
grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
{
|
||||
struct grub_xfs_btree_node *leaf = 0;
|
||||
int ex, nrec;
|
||||
grub_uint64_t ex, nrec;
|
||||
struct grub_xfs_extent *exts;
|
||||
grub_uint64_t ret = 0;
|
||||
|
||||
@@ -538,7 +620,18 @@ grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
/ (2 * sizeof (grub_uint64_t));
|
||||
do
|
||||
{
|
||||
int i;
|
||||
grub_uint64_t i;
|
||||
grub_addr_t keys_end, data_end;
|
||||
|
||||
if (grub_mul (sizeof (grub_uint64_t), nrec, &keys_end) ||
|
||||
grub_add ((grub_addr_t) keys, keys_end, &keys_end) ||
|
||||
grub_add ((grub_addr_t) node->data, node->data->data_size, &data_end) ||
|
||||
keys_end > data_end)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "invalid number of XFS root keys");
|
||||
grub_free (leaf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < nrec; i++)
|
||||
{
|
||||
@@ -556,7 +649,10 @@ grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
if (grub_disk_read (node->data->disk,
|
||||
GRUB_XFS_FSB_TO_BLOCK (node->data, get_fsb (keys, i - 1 + recoffset)) << (node->data->sblock.log2_bsize - GRUB_DISK_SECTOR_BITS),
|
||||
0, node->data->bsize, leaf))
|
||||
return 0;
|
||||
{
|
||||
grub_free (leaf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((!node->data->hascrc &&
|
||||
grub_strncmp ((char *) leaf->magic, "BMAP", 4)) ||
|
||||
@@ -579,8 +675,20 @@ grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
}
|
||||
else if (node->inode.format == XFS_INODE_FORMAT_EXT)
|
||||
{
|
||||
nrec = grub_be_to_cpu32 (node->inode.nextents);
|
||||
grub_addr_t exts_end = 0;
|
||||
grub_addr_t data_end = 0;
|
||||
|
||||
nrec = grub_xfs_get_inode_nextents (&node->inode);
|
||||
exts = (struct grub_xfs_extent *) grub_xfs_inode_data(&node->inode);
|
||||
|
||||
if (grub_mul (sizeof (struct grub_xfs_extent), nrec, &exts_end) ||
|
||||
grub_add ((grub_addr_t) node->data, exts_end, &exts_end) ||
|
||||
grub_add ((grub_addr_t) node->data, node->data->data_size, &data_end) ||
|
||||
exts_end > data_end)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "invalid number of XFS extents");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -634,6 +742,7 @@ static char *
|
||||
grub_xfs_read_symlink (grub_fshelp_node_t node)
|
||||
{
|
||||
grub_ssize_t size = grub_be_to_cpu64 (node->inode.size);
|
||||
grub_size_t sz;
|
||||
|
||||
if (size < 0)
|
||||
{
|
||||
@@ -655,7 +764,12 @@ grub_xfs_read_symlink (grub_fshelp_node_t node)
|
||||
if (node->data->hascrc)
|
||||
off = 56;
|
||||
|
||||
symlink = grub_malloc (size + 1);
|
||||
if (grub_add (size, 1, &sz))
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_RANGE, N_("symlink size overflow"));
|
||||
return 0;
|
||||
}
|
||||
symlink = grub_malloc (sz);
|
||||
if (!symlink)
|
||||
return 0;
|
||||
|
||||
@@ -705,8 +819,15 @@ static int iterate_dir_call_hook (grub_uint64_t ino, const char *filename,
|
||||
{
|
||||
struct grub_fshelp_node *fdiro;
|
||||
grub_err_t err;
|
||||
grub_size_t sz;
|
||||
|
||||
fdiro = grub_malloc (grub_xfs_fshelp_size(ctx->diro->data) + 1);
|
||||
if (grub_add (grub_xfs_fshelp_size(ctx->diro->data), 1, &sz))
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_RANGE, N_("directory data size overflow"));
|
||||
grub_print_error ();
|
||||
return 0;
|
||||
}
|
||||
fdiro = grub_malloc (sz);
|
||||
if (!fdiro)
|
||||
{
|
||||
grub_print_error ();
|
||||
@@ -722,6 +843,7 @@ static int iterate_dir_call_hook (grub_uint64_t ino, const char *filename,
|
||||
if (err)
|
||||
{
|
||||
grub_print_error ();
|
||||
grub_free (fdiro);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -764,12 +886,20 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
||||
if (iterate_dir_call_hook (parent, "..", &ctx))
|
||||
return 1;
|
||||
|
||||
for (i = 0; i < head->count; i++)
|
||||
for (i = 0; i < head->count &&
|
||||
(grub_uint8_t *) de < ((grub_uint8_t *) dir + grub_xfs_fshelp_size (dir->data)); i++)
|
||||
{
|
||||
grub_uint64_t ino;
|
||||
grub_uint8_t *inopos = grub_xfs_inline_de_inopos(dir->data, de);
|
||||
grub_uint8_t c;
|
||||
|
||||
if ((inopos + (smallino ? 4 : 8)) > (grub_uint8_t *) dir + grub_xfs_fshelp_size (dir->data))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "invalid XFS inode");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* inopos might be unaligned. */
|
||||
if (smallino)
|
||||
ino = (((grub_uint32_t) inopos[0]) << 24)
|
||||
@@ -824,24 +954,49 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
||||
{
|
||||
struct grub_xfs_dir2_entry *direntry =
|
||||
grub_xfs_first_de(dir->data, dirblock);
|
||||
int entries;
|
||||
struct grub_xfs_dirblock_tail *tail =
|
||||
grub_xfs_dir_tail(dir->data, dirblock);
|
||||
int entries = -1;
|
||||
char *end = dirblock + dirblk_size;
|
||||
grub_uint32_t magic;
|
||||
|
||||
numread = grub_xfs_read_file (dir, 0, 0,
|
||||
blk << dirblk_log2,
|
||||
dirblk_size, dirblock, 0);
|
||||
if (numread != dirblk_size)
|
||||
return 0;
|
||||
{
|
||||
grub_free (dirblock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
entries = (grub_be_to_cpu32 (tail->leaf_count)
|
||||
- grub_be_to_cpu32 (tail->leaf_stale));
|
||||
|
||||
if (!entries)
|
||||
/*
|
||||
* If this data block isn't actually part of the extent list then
|
||||
* grub_xfs_read_file() returns a block of zeros. So, if the magic
|
||||
* number field is all zeros then this block should be skipped.
|
||||
*/
|
||||
magic = *(grub_uint32_t *)(void *) dirblock;
|
||||
if (!magic)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Leaf and tail information are only in the data block if the number
|
||||
* of extents is 1.
|
||||
*/
|
||||
if (grub_xfs_get_inode_nextents (&dir->inode) == 1)
|
||||
{
|
||||
struct grub_xfs_dirblock_tail *tail = grub_xfs_dir_tail (dir->data, dirblock);
|
||||
|
||||
end = (char *) tail;
|
||||
|
||||
/* Subtract the space used by leaf nodes. */
|
||||
end -= grub_be_to_cpu32 (tail->leaf_count) * sizeof (struct grub_xfs_dir_leaf_entry);
|
||||
|
||||
entries = grub_be_to_cpu32 (tail->leaf_count) - grub_be_to_cpu32 (tail->leaf_stale);
|
||||
|
||||
if (!entries)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Iterate over all entries within this block. */
|
||||
while ((char *)direntry < (char *)tail)
|
||||
while ((char *) direntry < (char *) end)
|
||||
{
|
||||
grub_uint8_t *freetag;
|
||||
char *filename;
|
||||
@@ -861,22 +1016,34 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
|
||||
}
|
||||
|
||||
filename = (char *)(direntry + 1);
|
||||
if (filename + direntry->len + 1 > (char *) end)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "invalid XFS directory entry");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The byte after the filename is for the filetype, padding, or
|
||||
tag, which is not used by GRUB. So it can be overwritten. */
|
||||
filename[direntry->len] = '\0';
|
||||
|
||||
if (iterate_dir_call_hook (grub_be_to_cpu64(direntry->inode),
|
||||
if (iterate_dir_call_hook (grub_be_to_cpu64(direntry->inode),
|
||||
filename, &ctx))
|
||||
{
|
||||
grub_free (dirblock);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Check if last direntry in this block is
|
||||
reached. */
|
||||
entries--;
|
||||
if (!entries)
|
||||
break;
|
||||
/*
|
||||
* The expected number of directory entries is only tracked for the
|
||||
* single extent case.
|
||||
*/
|
||||
if (grub_xfs_get_inode_nextents (&dir->inode) == 1)
|
||||
{
|
||||
/* Check if last direntry in this block is reached. */
|
||||
entries--;
|
||||
if (!entries)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Select the next directory entry. */
|
||||
direntry = grub_xfs_next_de(dir->data, direntry);
|
||||
@@ -899,11 +1066,14 @@ static struct grub_xfs_data *
|
||||
grub_xfs_mount (grub_disk_t disk)
|
||||
{
|
||||
struct grub_xfs_data *data = 0;
|
||||
grub_size_t sz;
|
||||
|
||||
data = grub_zalloc (sizeof (struct grub_xfs_data));
|
||||
if (!data)
|
||||
return 0;
|
||||
|
||||
data->data_size = sizeof (struct grub_xfs_data);
|
||||
|
||||
grub_dprintf("xfs", "Reading sb\n");
|
||||
/* Read the superblock. */
|
||||
if (grub_disk_read (disk, 0, 0,
|
||||
@@ -913,14 +1083,19 @@ grub_xfs_mount (grub_disk_t disk)
|
||||
if (!grub_xfs_sb_valid(data))
|
||||
goto fail;
|
||||
|
||||
data = grub_realloc (data,
|
||||
sizeof (struct grub_xfs_data)
|
||||
- sizeof (struct grub_xfs_inode)
|
||||
+ grub_xfs_inode_size(data) + 1);
|
||||
if (grub_xfs_sb_needs_repair (data))
|
||||
grub_dprintf ("xfs", "XFS filesystem needs repair, boot may fail\n");
|
||||
|
||||
if (grub_add (grub_xfs_inode_size (data),
|
||||
sizeof (struct grub_xfs_data) - sizeof (struct grub_xfs_inode) + 1, &sz))
|
||||
goto fail;
|
||||
|
||||
data = grub_realloc (data, sz);
|
||||
|
||||
if (! data)
|
||||
goto fail;
|
||||
|
||||
data->data_size = sz;
|
||||
data->diropen.data = data;
|
||||
data->diropen.ino = grub_be_to_cpu64(data->sblock.rootino);
|
||||
data->diropen.inode_read = 1;
|
||||
@@ -931,7 +1106,7 @@ grub_xfs_mount (grub_disk_t disk)
|
||||
|
||||
data->disk = disk;
|
||||
data->pos = 0;
|
||||
grub_dprintf("xfs", "Reading root ino %"PRIuGRUB_UINT64_T"\n",
|
||||
grub_dprintf("xfs", "Reading root ino %" PRIuGRUB_UINT64_T "\n",
|
||||
grub_cpu_to_be64(data->sblock.rootino));
|
||||
|
||||
grub_xfs_read_inode (data, data->diropen.ino, &data->diropen.inode);
|
||||
@@ -939,7 +1114,7 @@ grub_xfs_mount (grub_disk_t disk)
|
||||
return data;
|
||||
fail:
|
||||
|
||||
if (grub_errno == GRUB_ERR_OUT_OF_RANGE)
|
||||
if (grub_errno == GRUB_ERR_OUT_OF_RANGE || grub_errno == GRUB_ERR_NONE)
|
||||
grub_error (GRUB_ERR_BAD_FS, "not an XFS filesystem");
|
||||
|
||||
grub_free (data);
|
||||
@@ -947,7 +1122,6 @@ grub_xfs_mount (grub_disk_t disk)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Context for grub_xfs_dir. */
|
||||
struct grub_xfs_dir_ctx
|
||||
{
|
||||
@@ -955,6 +1129,27 @@ struct grub_xfs_dir_ctx
|
||||
void *hook_data;
|
||||
};
|
||||
|
||||
/* Bigtime inodes helpers. */
|
||||
#define XFS_BIGTIME_EPOCH_OFFSET (-(grub_int64_t) GRUB_INT32_MIN)
|
||||
|
||||
static int grub_xfs_inode_has_bigtime (const struct grub_xfs_inode *inode)
|
||||
{
|
||||
return inode->version >= 3 &&
|
||||
(inode->flags2 & grub_cpu_to_be64_compile_time (XFS_DIFLAG2_BIGTIME));
|
||||
}
|
||||
|
||||
static grub_int64_t
|
||||
grub_xfs_get_inode_time (struct grub_xfs_inode *inode)
|
||||
{
|
||||
struct grub_xfs_time_legacy *lts;
|
||||
|
||||
if (grub_xfs_inode_has_bigtime (inode))
|
||||
return grub_divmod64 (grub_be_to_cpu64 (inode->mtime), NSEC_PER_SEC, NULL) - XFS_BIGTIME_EPOCH_OFFSET;
|
||||
|
||||
lts = (struct grub_xfs_time_legacy *) &inode->mtime;
|
||||
return grub_be_to_cpu32 (lts->sec);
|
||||
}
|
||||
|
||||
/* Helper for grub_xfs_dir. */
|
||||
static int
|
||||
grub_xfs_dir_iter (const char *filename, enum grub_fshelp_filetype filetype,
|
||||
@@ -967,7 +1162,7 @@ grub_xfs_dir_iter (const char *filename, enum grub_fshelp_filetype filetype,
|
||||
if (node->inode_read)
|
||||
{
|
||||
info.mtimeset = 1;
|
||||
info.mtime = grub_be_to_cpu32 (node->inode.mtime.sec);
|
||||
info.mtime = grub_xfs_get_inode_time (&node->inode);
|
||||
}
|
||||
info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR);
|
||||
grub_free (node);
|
||||
@@ -1132,8 +1327,6 @@ grub_xfs_uuid (grub_device_t device, char **uuid)
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static struct grub_fs grub_xfs_fs =
|
||||
{
|
||||
.name = "xfs",
|
||||
@@ -1152,6 +1345,7 @@ static struct grub_fs grub_xfs_fs =
|
||||
|
||||
GRUB_MOD_INIT(xfs)
|
||||
{
|
||||
//grub_xfs_fs.mod = mod;
|
||||
grub_fs_register (&grub_xfs_fs);
|
||||
my_mod = mod;
|
||||
}
|
||||
|
||||
@@ -466,6 +466,37 @@ grub_err_t grub_disk_blocklist_read(void *chunklist, grub_uint64_t sector,
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t grub_disk_blocklist_read2(grub_disk_t disk, grub_uint64_t sector,
|
||||
grub_uint64_t size, char *buf)
|
||||
{
|
||||
ventoy_img_chunk_list *chunk_list = (ventoy_img_chunk_list *)(disk->read_hook_data);
|
||||
|
||||
if (buf < chunk_list->buf || buf >= chunk_list->buf + VTOY_CHUNK_BUF_SIZE)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
if ((chunk_list->buf + chunk_list->last_off) != buf)
|
||||
{
|
||||
chunk_list->err_code = VTOY_CHUNK_ERR_NOT_FLAT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (chunk_list->last_off + size > VTOY_CHUNK_BUF_SIZE)
|
||||
{
|
||||
chunk_list->err_code = VTOY_CHUNK_ERR_OVER_FLOW;
|
||||
return 0;
|
||||
}
|
||||
|
||||
chunk_list->last_off += (grub_uint32_t)size;
|
||||
if (chunk_list->last_off == VTOY_CHUNK_BUF_SIZE)
|
||||
{
|
||||
chunk_list->last_off = 0;
|
||||
}
|
||||
|
||||
return grub_disk_blocklist_read(chunk_list, sector, size, disk->log_sector_size);
|
||||
}
|
||||
|
||||
/* Read data from the disk. */
|
||||
grub_err_t
|
||||
grub_disk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
@@ -475,6 +506,14 @@ grub_disk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
{
|
||||
return grub_disk_blocklist_read((ventoy_img_chunk_list *)disk->read_hook_data, sector, size, disk->log_sector_size);
|
||||
}
|
||||
else if (disk->read_hook == (grub_disk_read_hook_t)(void *)grub_disk_blocklist_read2)
|
||||
{
|
||||
grub_err_t rv = grub_disk_blocklist_read2(disk, sector, size, (char *)buf);
|
||||
if (rv != 2)
|
||||
{
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
/* First of all, check if the region is within the disk. */
|
||||
if (grub_disk_adjust_range (disk, §or, &offset, size) != GRUB_ERR_NONE)
|
||||
|
||||
@@ -128,11 +128,22 @@ insert_dir (const char *name, struct dir **root,
|
||||
n->name = grub_strndup (cb, ce - cb);
|
||||
if (ptr)
|
||||
{
|
||||
/*
|
||||
* Create the substring with the trailing NUL byte
|
||||
* to be included in the cpio header.
|
||||
*/
|
||||
char *tmp_name = grub_strndup (name, ce - name);
|
||||
if (!tmp_name) {
|
||||
grub_free (n->name);
|
||||
grub_free (n);
|
||||
return grub_errno;
|
||||
}
|
||||
grub_dprintf ("linux", "Creating directory %s, %s\n", name, ce);
|
||||
ptr = make_header (ptr, name, ce - name,
|
||||
ptr = make_header (ptr, tmp_name, ce - name + 1,
|
||||
040777, 0);
|
||||
grub_free (tmp_name);
|
||||
}
|
||||
size += ALIGN_UP ((ce - (char *) name)
|
||||
size += ALIGN_UP ((ce - (char *) name + 1)
|
||||
+ sizeof (struct newc_head), 4);
|
||||
*head = n;
|
||||
cur = n;
|
||||
@@ -183,7 +194,7 @@ grub_initrd_init (int argc, char *argv[],
|
||||
}
|
||||
initrd_ctx->size
|
||||
+= ALIGN_UP (sizeof (struct newc_head)
|
||||
+ grub_strlen (initrd_ctx->components[i].newc_name),
|
||||
+ grub_strlen (initrd_ctx->components[i].newc_name) + 1,
|
||||
4);
|
||||
initrd_ctx->size += insert_dir (initrd_ctx->components[i].newc_name,
|
||||
&root, 0);
|
||||
@@ -194,7 +205,7 @@ grub_initrd_init (int argc, char *argv[],
|
||||
else if (newc)
|
||||
{
|
||||
initrd_ctx->size += ALIGN_UP (sizeof (struct newc_head)
|
||||
+ sizeof ("TRAILER!!!") - 1, 4);
|
||||
+ sizeof ("TRAILER!!!"), 4);
|
||||
free_dir (root);
|
||||
root = 0;
|
||||
newc = 0;
|
||||
@@ -217,7 +228,7 @@ grub_initrd_init (int argc, char *argv[],
|
||||
{
|
||||
initrd_ctx->size = ALIGN_UP (initrd_ctx->size, 4);
|
||||
initrd_ctx->size += ALIGN_UP (sizeof (struct newc_head)
|
||||
+ sizeof ("TRAILER!!!") - 1, 4);
|
||||
+ sizeof ("TRAILER!!!"), 4);
|
||||
free_dir (root);
|
||||
root = 0;
|
||||
}
|
||||
@@ -269,14 +280,14 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
||||
ptr += insert_dir (initrd_ctx->components[i].newc_name,
|
||||
&root, ptr);
|
||||
ptr = make_header (ptr, initrd_ctx->components[i].newc_name,
|
||||
grub_strlen (initrd_ctx->components[i].newc_name),
|
||||
grub_strlen (initrd_ctx->components[i].newc_name) + 1,
|
||||
0100777,
|
||||
initrd_ctx->components[i].size);
|
||||
newc = 1;
|
||||
}
|
||||
else if (newc)
|
||||
{
|
||||
ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1,
|
||||
ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!"),
|
||||
0, 0);
|
||||
free_dir (root);
|
||||
root = 0;
|
||||
@@ -308,7 +319,7 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
||||
{
|
||||
grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4));
|
||||
ptr += ALIGN_UP_OVERHEAD (cursize, 4);
|
||||
ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1, 0, 0);
|
||||
ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!"), 0, 0);
|
||||
}
|
||||
free_dir (root);
|
||||
root = 0;
|
||||
|
||||
@@ -438,11 +438,11 @@ static void menu_set_chosen_tip(grub_menu_t menu, int entry)
|
||||
|
||||
if (g_ventoy_theme_path[0])
|
||||
{
|
||||
grub_env_set("theme", g_ventoy_theme_path);
|
||||
grub_env_set("theme", g_ventoy_theme_path);
|
||||
}
|
||||
|
||||
g_ventoy_tip_msg1 = g_ventoy_tip_msg2 = NULL;
|
||||
if (e && e->id && grub_strncmp(e->id, "VID_", 4) == 0)
|
||||
if (e && e->id && grub_strncmp(e->id, "VID_", 4) == 0)
|
||||
{
|
||||
g_ventoy_theme_path[0] = 0;
|
||||
img = (img_info *)(void *)grub_strtoul(e->id + 4, NULL, 16);
|
||||
@@ -480,7 +480,7 @@ static void
|
||||
menu_set_chosen_entry (grub_menu_t menu, int entry)
|
||||
{
|
||||
struct grub_menu_viewer *cur;
|
||||
|
||||
|
||||
menu_set_chosen_tip(menu, entry);
|
||||
for (cur = viewers; cur; cur = cur->next)
|
||||
cur->set_chosen_entry (entry, cur->data);
|
||||
@@ -972,7 +972,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
||||
;
|
||||
menu_fini ();
|
||||
goto refresh;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'd'):
|
||||
@@ -981,7 +981,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
||||
{
|
||||
menu_fini ();
|
||||
g_ventoy_memdisk_mode = 1 - g_ventoy_memdisk_mode;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
}
|
||||
break;
|
||||
@@ -992,7 +992,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
||||
menu_fini ();
|
||||
g_ventoy_iso_raw = 1 - g_ventoy_iso_raw;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
goto refresh;
|
||||
}
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'r'):
|
||||
@@ -1001,10 +1001,10 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
||||
{
|
||||
menu_fini ();
|
||||
g_ventoy_grub2_mode = 1 - g_ventoy_grub2_mode;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'w'):
|
||||
case 'w':
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
@@ -1039,7 +1039,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
||||
case 'm':
|
||||
{
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
{
|
||||
{
|
||||
if (g_ventoy_cur_img_path)
|
||||
{
|
||||
grub_env_set("VTOY_CHKSUM_FILE_PATH", g_ventoy_cur_img_path);
|
||||
@@ -1128,16 +1128,17 @@ static struct grub_menu_execute_callback execution_callback =
|
||||
static grub_err_t
|
||||
show_menu (grub_menu_t menu, int nested, int autobooted)
|
||||
{
|
||||
const char *def;
|
||||
const char *def;
|
||||
def = grub_env_get("VTOY_DEFAULT_IMAGE");
|
||||
|
||||
|
||||
while (1)
|
||||
{
|
||||
int ndown;
|
||||
char *pos = NULL;
|
||||
int boot_entry;
|
||||
grub_menu_entry_t e;
|
||||
int auto_boot;
|
||||
|
||||
|
||||
boot_entry = run_menu (menu, nested, &auto_boot);
|
||||
if (boot_entry < 0)
|
||||
break;
|
||||
@@ -1149,7 +1150,7 @@ show_menu (grub_menu_t menu, int nested, int autobooted)
|
||||
if (autobooted == 0 && auto_boot == 0) {
|
||||
g_ventoy_last_entry = boot_entry;
|
||||
if (g_ventoy_menu_esc)
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
if (autobooted == 0 && g_ventoy_menu_esc && auto_boot) {
|
||||
@@ -1162,7 +1163,7 @@ show_menu (grub_menu_t menu, int nested, int autobooted)
|
||||
continue; /* Menu is empty. */
|
||||
|
||||
if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RET", 8) == 0)
|
||||
break;
|
||||
break;
|
||||
|
||||
grub_cls ();
|
||||
|
||||
@@ -1175,16 +1176,29 @@ show_menu (grub_menu_t menu, int nested, int autobooted)
|
||||
break;
|
||||
|
||||
if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_RET", 12) == 0)
|
||||
break;
|
||||
else if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_SET", 12) == 0) {
|
||||
ndown = (int)grub_strtol(e->args[1] + 12, NULL, 10);
|
||||
break;
|
||||
else if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_SET_", 13) == 0) {
|
||||
pos = NULL;
|
||||
ndown = (int)grub_strtol(e->args[1] + 13, &pos, 10);
|
||||
while (ndown > 0)
|
||||
{
|
||||
ventoy_menu_push_key(GRUB_TERM_KEY_DOWN);
|
||||
ndown--;
|
||||
}
|
||||
|
||||
ventoy_menu_push_key('\n');
|
||||
break;
|
||||
|
||||
if (pos && *pos == '_')
|
||||
{
|
||||
ndown = (int)grub_strtol(pos + 1, NULL, 10);
|
||||
while (ndown > 0)
|
||||
{
|
||||
ventoy_menu_push_key(GRUB_TERM_KEY_DOWN);
|
||||
ndown--;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/******************************************************************************
|
||||
* ventoy.c
|
||||
* ventoy.c
|
||||
*
|
||||
* Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||
*
|
||||
@@ -7,12 +7,12 @@
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
@@ -137,7 +137,7 @@ int ventoy_str_len_alnum(const char *str, int len)
|
||||
{
|
||||
int i;
|
||||
int slen;
|
||||
|
||||
|
||||
if (NULL == str || 0 == *str)
|
||||
{
|
||||
return 0;
|
||||
@@ -168,7 +168,7 @@ int ventoy_str_len_alnum(const char *str, int len)
|
||||
char * ventoy_str_basename(char *path)
|
||||
{
|
||||
char *pos = NULL;
|
||||
|
||||
|
||||
pos = grub_strrchr(path, '/');
|
||||
if (pos)
|
||||
{
|
||||
@@ -185,17 +185,17 @@ char * ventoy_str_basename(char *path)
|
||||
int ventoy_str_chrcnt(const char *str, char c)
|
||||
{
|
||||
int n = 0;
|
||||
|
||||
|
||||
if (str)
|
||||
{
|
||||
while (*str)
|
||||
{
|
||||
if (*str == c)
|
||||
{
|
||||
n++;
|
||||
n++;
|
||||
}
|
||||
str++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return n;
|
||||
@@ -235,7 +235,7 @@ int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n)
|
||||
grub_err_t ventoy_env_int_set(const char *name, int value)
|
||||
{
|
||||
char buf[16];
|
||||
|
||||
|
||||
grub_snprintf(buf, sizeof(buf), "%d", value);
|
||||
return grub_env_set(name, buf);
|
||||
}
|
||||
@@ -248,13 +248,13 @@ void ventoy_debug_dump_guid(const char *prefix, grub_uint8_t *guid)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
debug("%s", prefix);
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
grub_printf("%02x ", guid[i]);
|
||||
}
|
||||
grub_printf("\n");
|
||||
grub_printf("\n");
|
||||
}
|
||||
|
||||
int ventoy_is_efi_os(void)
|
||||
@@ -290,7 +290,7 @@ void ventoy_memfile_env_set(const char *prefix, const void *buf, unsigned long l
|
||||
grub_snprintf(name, sizeof(name), "%s_addr", prefix);
|
||||
grub_snprintf(val, sizeof(val), "0x%llx", (ulonglong)(ulong)buf);
|
||||
grub_env_set(name, val);
|
||||
|
||||
|
||||
grub_snprintf(name, sizeof(name), "%s_size", prefix);
|
||||
grub_snprintf(val, sizeof(val), "%llu", len);
|
||||
grub_env_set(name, val);
|
||||
@@ -374,7 +374,7 @@ static int ventoy_hwinfo_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static global_var_cfg g_global_vars[] =
|
||||
static global_var_cfg g_global_vars[] =
|
||||
{
|
||||
{ "gfxmode", "1024x768", NULL },
|
||||
{ ventoy_left_key, "5%", NULL },
|
||||
@@ -422,20 +422,21 @@ int ventoy_global_var_init(void)
|
||||
for (i = 0; g_global_vars[i].name; i++)
|
||||
{
|
||||
g_global_vars[i].value = grub_strdup(g_global_vars[i].defval);
|
||||
ventoy_env_export(g_global_vars[i].name, g_global_vars[i].defval);
|
||||
ventoy_env_export(g_global_vars[i].name, g_global_vars[i].defval);
|
||||
grub_register_variable_hook(g_global_vars[i].name, ventoy_global_var_read_hook, ventoy_global_var_write_hook);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ctrl_var_cfg g_ctrl_vars[] =
|
||||
static ctrl_var_cfg g_ctrl_vars[] =
|
||||
{
|
||||
{ "VTOY_WIN11_BYPASS_CHECK", 1 },
|
||||
{ "VTOY_WIN11_BYPASS_NRO", 1 },
|
||||
{ "VTOY_LINUX_REMOUNT", 0 },
|
||||
{ "VTOY_SECONDARY_BOOT_MENU", 1 },
|
||||
{ NULL, 0 }
|
||||
{ "VTOY_WIN11_BYPASS_CHECK", "1" },
|
||||
{ "VTOY_WIN11_BYPASS_NRO", "1" },
|
||||
{ "VTOY_LINUX_REMOUNT", "0" },
|
||||
{ "VTOY_SECONDARY_BOOT_MENU", "1" },
|
||||
{ "VTOY_WIN_UEFI_RES_LOCK", "3" },
|
||||
{ NULL, "" }
|
||||
};
|
||||
|
||||
static const char * ventoy_ctrl_var_read_hook(struct grub_env_var *var, const char *val)
|
||||
@@ -446,7 +447,7 @@ static const char * ventoy_ctrl_var_read_hook(struct grub_env_var *var, const ch
|
||||
{
|
||||
if (grub_strcmp(g_ctrl_vars[i].name, var->name) == 0)
|
||||
{
|
||||
return g_ctrl_vars[i].value ? "1" : "0";
|
||||
return g_ctrl_vars[i].szval;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -461,14 +462,14 @@ static char * ventoy_ctrl_var_write_hook(struct grub_env_var *var, const char *v
|
||||
{
|
||||
if (grub_strcmp(g_ctrl_vars[i].name, var->name) == 0)
|
||||
{
|
||||
if (val && val[0] == '1' && val[1] == 0)
|
||||
if (val && grub_isdigit(val[0]) && val[1] == 0)
|
||||
{
|
||||
g_ctrl_vars[i].value = 1;
|
||||
return grub_strdup("1");
|
||||
g_ctrl_vars[i].szval[0] = val[0];
|
||||
return grub_strdup(val);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_ctrl_vars[i].value = 0;
|
||||
g_ctrl_vars[i].szval[0] = '0';
|
||||
return grub_strdup("0");
|
||||
}
|
||||
}
|
||||
@@ -479,12 +480,13 @@ static char * ventoy_ctrl_var_write_hook(struct grub_env_var *var, const char *v
|
||||
|
||||
int ventoy_ctrl_var_init(void)
|
||||
{
|
||||
int i;
|
||||
ctrl_var_cfg *cfg = g_ctrl_vars;
|
||||
|
||||
for (i = 0; g_ctrl_vars[i].name; i++)
|
||||
while (cfg->name)
|
||||
{
|
||||
ventoy_env_export(g_ctrl_vars[i].name, g_ctrl_vars[i].value ? "1" : "0");
|
||||
grub_register_variable_hook(g_ctrl_vars[i].name, ventoy_ctrl_var_read_hook, ventoy_ctrl_var_write_hook);
|
||||
ventoy_env_export(cfg->name, cfg->szval);
|
||||
grub_register_variable_hook(cfg->name, ventoy_ctrl_var_read_hook, ventoy_ctrl_var_write_hook);
|
||||
cfg++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,12 +7,12 @@
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
@@ -37,6 +37,7 @@
|
||||
#define VTOY_SIZE_4MB (4 * 1024 * 1024)
|
||||
#define VTOY_SIZE_512KB (512 * 1024)
|
||||
#define VTOY_SIZE_1KB 1024
|
||||
#define VTOY_SIZE_4KB 4096
|
||||
#define VTOY_SIZE_32KB (32 * 1024)
|
||||
#define VTOY_SIZE_128KB (128 * 1024)
|
||||
|
||||
@@ -95,6 +96,12 @@
|
||||
return (err);\
|
||||
}
|
||||
|
||||
#define vtoy_tip(wait_seconds, fmt, ...) \
|
||||
grub_printf(fmt, __VA_ARGS__); \
|
||||
grub_refresh(); \
|
||||
grub_sleep(wait_seconds)
|
||||
|
||||
|
||||
#define VTOY_APPEND_NEWBUF(buf) \
|
||||
{\
|
||||
char *__c = buf;\
|
||||
@@ -135,7 +142,7 @@ typedef enum VTOY_FILE_FLT
|
||||
VTOY_FILE_FLT_IMG, /* .img */
|
||||
VTOY_FILE_FLT_VHD, /* .vhd(x) */
|
||||
VTOY_FILE_FLT_VTOY, /* .vtoy */
|
||||
|
||||
|
||||
VTOY_FILE_FLT_BUTT
|
||||
}VTOY_FILE_FLT;
|
||||
|
||||
@@ -153,7 +160,7 @@ typedef struct cmd_para
|
||||
grub_extcmd_func_t func;
|
||||
grub_command_flags_t flags;
|
||||
const struct grub_arg_option *parser;
|
||||
|
||||
|
||||
const char *summary;
|
||||
const char *description;
|
||||
|
||||
@@ -164,7 +171,7 @@ typedef struct cmd_para
|
||||
#define ventoy_align(value, align) (((value) + ((align) - 1)) & (~((align) - 1)))
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct cpio_newc_header
|
||||
typedef struct cpio_newc_header
|
||||
{
|
||||
char c_magic[6];
|
||||
char c_ino[8];
|
||||
@@ -199,7 +206,7 @@ typedef struct ventoy_patch_vhd
|
||||
grub_uint8_t part_offset_or_guid[16];
|
||||
grub_uint32_t reserved1;
|
||||
grub_uint32_t part_type;
|
||||
grub_uint8_t disk_signature_or_guid[16];
|
||||
grub_uint8_t disk_signature_or_guid[16];
|
||||
grub_uint8_t reserved2[16];
|
||||
grub_uint8_t vhd_file_path[1];
|
||||
}ventoy_patch_vhd;
|
||||
@@ -277,7 +284,7 @@ typedef struct img_info
|
||||
const char *tip2;
|
||||
const char *class;
|
||||
const char *menu_prefix;
|
||||
|
||||
|
||||
int id;
|
||||
int type;
|
||||
int plugin_list_index;
|
||||
@@ -306,8 +313,8 @@ typedef struct img_iterator_node
|
||||
|
||||
struct img_iterator_node *parent;
|
||||
struct img_iterator_node *firstchild;
|
||||
|
||||
void *firstiso;
|
||||
|
||||
void *firstiso;
|
||||
}img_iterator_node;
|
||||
|
||||
|
||||
@@ -321,7 +328,7 @@ typedef struct initrd_info
|
||||
|
||||
grub_uint8_t iso_type; // 0: iso9660 1:udf
|
||||
grub_uint32_t udf_start_block;
|
||||
|
||||
|
||||
grub_uint64_t override_offset;
|
||||
grub_uint32_t override_length;
|
||||
char override_data[32];
|
||||
@@ -390,7 +397,7 @@ void ventoy_debug(const char *fmt, ...);
|
||||
#pragma pack(1)
|
||||
|
||||
/* A WIM resource header */
|
||||
typedef struct wim_resource_header
|
||||
typedef struct wim_resource_header
|
||||
{
|
||||
grub_uint64_t size_in_wim:56; /* Compressed length */
|
||||
grub_uint64_t flags:8; /* flags */
|
||||
@@ -402,7 +409,7 @@ typedef struct wim_resource_header
|
||||
#define WIM_RESHDR_ZLEN_MASK 0x00ffffffffffffffULL
|
||||
|
||||
/* WIM resource header flags */
|
||||
typedef enum wim_resource_header_flags
|
||||
typedef enum wim_resource_header_flags
|
||||
{
|
||||
WIM_RESHDR_METADATA = ( 0x02ULL << 56 ), /* Resource contains metadata */
|
||||
WIM_RESHDR_COMPRESSED = ( 0x04ULL << 56 ), /* Resource is compressed */
|
||||
@@ -412,7 +419,7 @@ typedef enum wim_resource_header_flags
|
||||
#define WIM_HEAD_SIGNATURE "MSWIM\0\0"
|
||||
|
||||
/* WIM header */
|
||||
typedef struct wim_header
|
||||
typedef struct wim_header
|
||||
{
|
||||
grub_uint8_t signature[8]; /* Signature */
|
||||
grub_uint32_t header_len; /* Header length */
|
||||
@@ -432,21 +439,21 @@ typedef struct wim_header
|
||||
} wim_header;
|
||||
|
||||
/* WIM header flags */
|
||||
typedef enum wim_header_flags
|
||||
typedef enum wim_header_flags
|
||||
{
|
||||
WIM_HDR_XPRESS = 0x00020000, /* WIM uses Xpress compresson */
|
||||
WIM_HDR_LZX = 0x00040000, /* WIM uses LZX compression */
|
||||
}wim_header_flags;
|
||||
|
||||
/* A WIM file hash */
|
||||
typedef struct wim_hash
|
||||
typedef struct wim_hash
|
||||
{
|
||||
/* SHA-1 hash */
|
||||
grub_uint8_t sha1[20];
|
||||
}wim_hash;
|
||||
|
||||
/* A WIM lookup table entry */
|
||||
typedef struct wim_lookup_entry
|
||||
typedef struct wim_lookup_entry
|
||||
{
|
||||
wim_resource_header resource; /* Resource header */
|
||||
grub_uint16_t part; /* Part number */
|
||||
@@ -458,19 +465,19 @@ typedef struct wim_lookup_entry
|
||||
#define WIM_CHUNK_LEN 32768
|
||||
|
||||
/* A WIM chunk buffer */
|
||||
typedef struct wim_chunk_buffer
|
||||
typedef struct wim_chunk_buffer
|
||||
{
|
||||
grub_uint8_t data[WIM_CHUNK_LEN]; /*Data */
|
||||
}wim_chunk_buffer;
|
||||
|
||||
/* Security data */
|
||||
typedef struct wim_security_header
|
||||
typedef struct wim_security_header
|
||||
{
|
||||
grub_uint32_t len; /* Length */
|
||||
grub_uint32_t count; /* Number of entries */
|
||||
}wim_security_header;
|
||||
|
||||
typedef struct wim_stream_entry
|
||||
typedef struct wim_stream_entry
|
||||
{
|
||||
grub_uint64_t len;
|
||||
grub_uint64_t unused1;
|
||||
@@ -480,7 +487,7 @@ typedef struct wim_stream_entry
|
||||
}wim_stream_entry;
|
||||
|
||||
/* Directory entry */
|
||||
typedef struct wim_directory_entry
|
||||
typedef struct wim_directory_entry
|
||||
{
|
||||
grub_uint64_t len; /* Length */
|
||||
grub_uint32_t attributes; /* Attributes */
|
||||
@@ -583,7 +590,7 @@ typedef struct _VTOY_JSON
|
||||
struct _VTOY_JSON *pstChild;
|
||||
|
||||
JSON_TYPE enDataType;
|
||||
union
|
||||
union
|
||||
{
|
||||
char *pcStrVal;
|
||||
int iNumVal;
|
||||
@@ -656,6 +663,7 @@ grub_uint32_t ventoy_get_iso_boot_catlog(grub_file_t file);
|
||||
int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector);
|
||||
grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_linux_initrd(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_linux_limine_menu(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_linux_locate_initrd(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
@@ -694,7 +702,7 @@ int vtoy_json_parse_value
|
||||
(
|
||||
char *pcNewStart,
|
||||
char *pcRawStart,
|
||||
VTOY_JSON *pstJson,
|
||||
VTOY_JSON *pstJson,
|
||||
const char *pcData,
|
||||
const char **ppcEnd
|
||||
);
|
||||
@@ -710,51 +718,51 @@ int vtoy_json_scan_parse
|
||||
|
||||
int vtoy_json_scan_array
|
||||
(
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON **ppstArrayItem
|
||||
);
|
||||
|
||||
int vtoy_json_scan_array_ex
|
||||
(
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON **ppstArrayItem
|
||||
);
|
||||
int vtoy_json_scan_object
|
||||
(
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON **ppstObjectItem
|
||||
);
|
||||
int vtoy_json_get_int
|
||||
(
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
int *piValue
|
||||
);
|
||||
int vtoy_json_get_uint
|
||||
(
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
grub_uint32_t *puiValue
|
||||
);
|
||||
int vtoy_json_get_uint64
|
||||
(
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
grub_uint64_t *pui64Value
|
||||
);
|
||||
int vtoy_json_get_bool
|
||||
(
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
const char *szKey,
|
||||
grub_uint8_t *pbValue
|
||||
);
|
||||
int vtoy_json_get_string
|
||||
(
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
VTOY_JSON *pstJson,
|
||||
const char *szKey,
|
||||
grub_uint32_t uiBufLen,
|
||||
char *pcBuf
|
||||
);
|
||||
@@ -776,7 +784,7 @@ static inline int ventoy_isspace (int c)
|
||||
|
||||
static inline int ventoy_is_word_end(int c)
|
||||
{
|
||||
return (c == 0 || c == ',' || ventoy_isspace(c));
|
||||
return (c == 0 || c == ',' || ventoy_isspace(c));
|
||||
}
|
||||
|
||||
#pragma pack(1)
|
||||
@@ -861,7 +869,8 @@ typedef struct vhd_footer_t
|
||||
grub_uint8_t savedst; // Saved state
|
||||
}vhd_footer_t;
|
||||
|
||||
#define VDI_IMAGE_FILE_INFO "<<< Oracle VM VirtualBox Disk Image >>>\n"
|
||||
#define VDI_IMAGE_FILE_INFO "<<< Oracle VM VirtualBox Disk Image >>>\n"
|
||||
#define VDI_IMAGE_FILE_INFO2 "<<< Oracle VirtualBox Disk Image >>>\n"
|
||||
|
||||
/** Image signature. */
|
||||
#define VDI_IMAGE_SIGNATURE (0xbeda107f)
|
||||
@@ -947,7 +956,7 @@ typedef struct persistence_config
|
||||
int cursel;
|
||||
int backendnum;
|
||||
file_fullpath *backendpath;
|
||||
|
||||
|
||||
struct persistence_config *next;
|
||||
}persistence_config;
|
||||
|
||||
@@ -1149,7 +1158,7 @@ int ventoy_plugin_find_conf_replace(const char *iso, conf_replace *nodes[VTOY_MA
|
||||
dud * ventoy_plugin_find_dud(const char *iso);
|
||||
int ventoy_plugin_load_dud(dud *node, const char *isopart);
|
||||
int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||
int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||
int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start, char *err, grub_uint32_t len);
|
||||
void ventoy_plugin_dump_persistence(void);
|
||||
grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_set_theme_path(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
@@ -1272,6 +1281,7 @@ typedef struct systemd_menu_ctx
|
||||
{
|
||||
char *dev;
|
||||
char *buf;
|
||||
const char *initrd_cmd;
|
||||
int pos;
|
||||
int len;
|
||||
}systemd_menu_ctx;
|
||||
@@ -1286,7 +1296,7 @@ typedef struct global_var_cfg
|
||||
typedef struct ctrl_var_cfg
|
||||
{
|
||||
const char *name;
|
||||
int value;
|
||||
char szval[2];
|
||||
}ctrl_var_cfg;
|
||||
|
||||
#define vtoy_check_goto_out(p) if (!p) goto out
|
||||
|
||||
@@ -1867,7 +1867,7 @@ static int ventoy_systemd_conf_hook(const char *filename, const struct grub_dirh
|
||||
ctx->pos = oldpos;
|
||||
goto out;
|
||||
}
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Downloading kernel ...\"\n linux %s ", tag);
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Loading kernel ...\"\n linux %s ", tag);
|
||||
|
||||
/* kernel options */
|
||||
grub_memcpy(filebuf, bkbuf, file->size);
|
||||
@@ -1876,7 +1876,7 @@ static int ventoy_systemd_conf_hook(const char *filename, const struct grub_dirh
|
||||
|
||||
|
||||
/* initrd xxx xxx xxx */
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Downloading initrd ...\"\n initrd ");
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Loading initrd ...\"\n %s ", ctx->initrd_cmd);
|
||||
grub_memcpy(filebuf, bkbuf, file->size);
|
||||
tag = ventoy_systemd_conf_tag(filebuf, "initrd", 1);
|
||||
while (tag)
|
||||
@@ -1893,6 +1893,34 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_linux_initrd(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int i;
|
||||
int pos = 0;
|
||||
char *buf = NULL;
|
||||
|
||||
(void)ctxt;
|
||||
|
||||
buf = (char *)grub_malloc(VTOY_SIZE_4KB);
|
||||
if (!buf)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
pos += grub_snprintf(buf + pos, VTOY_SIZE_4KB - pos, "initrd mem:%s:size:%s",
|
||||
grub_env_get("ventoy_cpio_addr"), grub_env_get("ventoy_cpio_size"));
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
{
|
||||
pos += grub_snprintf(buf + pos, VTOY_SIZE_4KB - pos, " newc:initrd%03d:%s", i + 1, args[i]);
|
||||
}
|
||||
|
||||
grub_script_execute_sourcecode(buf);
|
||||
grub_free(buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
static char *buf = NULL;
|
||||
@@ -1936,6 +1964,7 @@ grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, c
|
||||
|
||||
ctx.dev = args[0];
|
||||
ctx.buf = buf;
|
||||
ctx.initrd_cmd = args[2] ? args[2] : "initrd";
|
||||
ctx.pos = 0;
|
||||
ctx.len = VTOY_LINUX_SYSTEMD_MENU_MAX_BUF;
|
||||
fs->fs_dir(dev, "/loader/entries", ventoy_systemd_conf_hook, &ctx);
|
||||
|
||||
@@ -2765,7 +2765,7 @@ int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, vento
|
||||
start = file->device->disk->partition->start;
|
||||
ventoy_get_block_list(file, chunk_list, start);
|
||||
|
||||
if (0 != ventoy_check_block_list(file, chunk_list, start))
|
||||
if (0 != ventoy_check_block_list(file, chunk_list, start, NULL, 0))
|
||||
{
|
||||
grub_free(chunk_list->chunk);
|
||||
chunk_list->chunk = NULL;
|
||||
|
||||
@@ -536,12 +536,25 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *
|
||||
{
|
||||
grub_file_seek(file, 0);
|
||||
grub_file_read(file, &vdihdr, sizeof(vdihdr));
|
||||
if (vdihdr.u32Signature == VDI_IMAGE_SIGNATURE &&
|
||||
grub_strncmp(vdihdr.szFileInfo, VDI_IMAGE_FILE_INFO, grub_strlen(VDI_IMAGE_FILE_INFO)) == 0)
|
||||
if (vdihdr.u32Signature == VDI_IMAGE_SIGNATURE)
|
||||
{
|
||||
offset = 2 * 1048576;
|
||||
g_img_trim_head_secnum = offset / 512;
|
||||
grub_snprintf(type, sizeof(type), "vdi");
|
||||
if (grub_strncmp(vdihdr.szFileInfo, VDI_IMAGE_FILE_INFO, grub_strlen(VDI_IMAGE_FILE_INFO)) == 0)
|
||||
{
|
||||
offset = 2 * 1048576;
|
||||
g_img_trim_head_secnum = offset / 512;
|
||||
debug("VDI V1\n");
|
||||
}
|
||||
else if (grub_strncmp(vdihdr.szFileInfo, VDI_IMAGE_FILE_INFO2, grub_strlen(VDI_IMAGE_FILE_INFO2)) == 0)
|
||||
{
|
||||
offset = 2 * 1048576;
|
||||
g_img_trim_head_secnum = offset / 512;
|
||||
debug("VDI V2\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("invalid file info <%s>\n", vdihdr.szFileInfo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -568,7 +581,7 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *
|
||||
if (gpt->MBR.Byte55 != 0x55 || gpt->MBR.ByteAA != 0xAA)
|
||||
{
|
||||
grub_env_set(args[1], "unknown");
|
||||
debug("invalid mbr signature: 0x%x 0x%x\n", gpt->MBR.Byte55, gpt->MBR.ByteAA);
|
||||
debug("invalid mbr signature: 0x%x 0x%x offset=%d\n", gpt->MBR.Byte55, gpt->MBR.ByteAA, offset);
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
||||
@@ -197,6 +197,8 @@ grub_disk_t EXPORT_FUNC(grub_disk_open) (const char *name);
|
||||
void EXPORT_FUNC(grub_disk_close) (grub_disk_t disk);
|
||||
grub_err_t EXPORT_FUNC(grub_disk_blocklist_read)(void *chunklist, grub_uint64_t sector,
|
||||
grub_uint64_t size, grub_uint32_t log_sector_size);
|
||||
grub_err_t EXPORT_FUNC(grub_disk_blocklist_read2)(grub_disk_t disk, grub_uint64_t sector,
|
||||
grub_uint64_t size, char *buf);
|
||||
|
||||
grub_err_t EXPORT_FUNC(grub_disk_read) (grub_disk_t disk,
|
||||
grub_disk_addr_t sector,
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
@@ -36,6 +36,7 @@ typedef enum ventoy_fs_type
|
||||
ventoy_fs_xfs, /* 3: XFS */
|
||||
ventoy_fs_udf, /* 4: UDF */
|
||||
ventoy_fs_fat, /* 5: FAT */
|
||||
ventoy_fs_btrfs, /* 6: BTRFS */
|
||||
|
||||
ventoy_fs_max
|
||||
}ventoy_fs_type;
|
||||
@@ -81,7 +82,7 @@ typedef struct ventoy_image_location
|
||||
|
||||
/*
|
||||
* disk region data (region_count)
|
||||
* If the image file has more than one fragments in disk,
|
||||
* If the image file has more than one fragments in disk,
|
||||
* there will be more than one region data here.
|
||||
*
|
||||
*/
|
||||
@@ -103,7 +104,7 @@ typedef struct ventoy_os_param
|
||||
char vtoy_img_path[384]; // It seems to be enough, utf-8 format
|
||||
grub_uint64_t vtoy_img_size; // image file size in bytes
|
||||
|
||||
/*
|
||||
/*
|
||||
* Ventoy will write a copy of ventoy_image_location data into runtime memory
|
||||
* this is the physically address and length of that memory.
|
||||
* Address 0 means no such data exist.
|
||||
@@ -113,7 +114,7 @@ typedef struct ventoy_os_param
|
||||
grub_uint64_t vtoy_img_location_addr;
|
||||
grub_uint32_t vtoy_img_location_len;
|
||||
|
||||
/*
|
||||
/*
|
||||
* These 32 bytes are reserved by ventoy.
|
||||
*
|
||||
* vtoy_reserved[0]: vtoy_break_level
|
||||
@@ -124,6 +125,7 @@ typedef struct ventoy_os_param
|
||||
* vtoy_reserved[5]: vtoy_linux_remount
|
||||
* vtoy_reserved[6]: vtoy_vlnk
|
||||
* vtoy_reserved[7~10]: vtoy_disk_sig[4] used for vlnk
|
||||
* vtoy_reserved[11]: vtoy_win_uefi_max_res
|
||||
*
|
||||
*/
|
||||
grub_uint8_t vtoy_reserved[32]; // Internal use by ventoy
|
||||
@@ -154,8 +156,8 @@ typedef struct ventoy_windows_data
|
||||
typedef struct ventoy_secure_data
|
||||
{
|
||||
grub_uint8_t magic1[16]; /* VENTOY_GUID */
|
||||
grub_uint8_t diskuuid[16];
|
||||
grub_uint8_t Checksum[16];
|
||||
grub_uint8_t diskuuid[16];
|
||||
grub_uint8_t Checksum[16];
|
||||
grub_uint8_t adminSHA256[32];
|
||||
grub_uint8_t reserved[4000];
|
||||
grub_uint8_t magic2[16]; /* VENTOY_GUID */
|
||||
@@ -199,7 +201,7 @@ typedef struct ventoy_chain_head
|
||||
grub_uint64_t virt_img_size_in_bytes;
|
||||
grub_uint32_t boot_catalog;
|
||||
grub_uint8_t boot_catalog_sector[2048];
|
||||
|
||||
|
||||
grub_uint32_t img_chunk_offset;
|
||||
grub_uint32_t img_chunk_num;
|
||||
|
||||
@@ -252,12 +254,15 @@ typedef struct ventoy_virt_chunk
|
||||
#define DEFAULT_CHUNK_NUM 1024
|
||||
typedef struct ventoy_img_chunk_list
|
||||
{
|
||||
char *buf;
|
||||
grub_uint32_t last_off;
|
||||
grub_uint32_t err_code;
|
||||
|
||||
grub_uint32_t max_chunk;
|
||||
grub_uint32_t cur_chunk;
|
||||
ventoy_img_chunk *chunk;
|
||||
}ventoy_img_chunk_list;
|
||||
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#define ventoy_filt_register grub_file_filter_register
|
||||
@@ -291,7 +296,21 @@ typedef struct ventoy_grub_param
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#define VTOY_CHUNK_BUF_SIZE (4 * 1024 * 1024)
|
||||
|
||||
typedef enum vtoy_chunk_err
|
||||
{
|
||||
VTOY_CHUNK_ERR_NONE = 0,
|
||||
VTOY_CHUNK_ERR_MULTI_DEV,
|
||||
VTOY_CHUNK_ERR_RAID,
|
||||
VTOY_CHUNK_ERR_COMPRESS,
|
||||
VTOY_CHUNK_ERR_NOT_FLAT,
|
||||
VTOY_CHUNK_ERR_OVER_FLOW,
|
||||
VTOY_CHUNK_ERR_MAX
|
||||
}vtoy_chunk_err;
|
||||
|
||||
int grub_ext_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
|
||||
int grub_btrfs_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
|
||||
int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
|
||||
void grub_iso9660_set_nojoliet(int nojoliet);
|
||||
int grub_iso9660_is_joliet(void);
|
||||
@@ -301,7 +320,7 @@ grub_uint64_t grub_udf_get_file_offset(grub_file_t file);
|
||||
grub_uint64_t grub_udf_get_last_pd_size_offset(void);
|
||||
grub_uint64_t grub_udf_get_last_file_attr_offset
|
||||
(
|
||||
grub_file_t file,
|
||||
grub_file_t file,
|
||||
grub_uint32_t *startBlock,
|
||||
grub_uint64_t *fe_entry_size_offset
|
||||
);
|
||||
|
||||
@@ -48,3 +48,6 @@ else
|
||||
fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -67,4 +67,5 @@ fi
|
||||
|
||||
if [ -f $VTOY_PATH/ventoy_persistent_map ]; then
|
||||
$SED "1 aexport cow_label=vtoycow" -i /init
|
||||
$SED "/parse.*cmdline/aecho cow_label=vtoycow>>/tmp/cmdline" -i /init
|
||||
fi
|
||||
|
||||
@@ -49,3 +49,6 @@ else
|
||||
fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -52,3 +52,6 @@ ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
||||
# fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
@@ -36,3 +36,6 @@ ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -30,3 +30,6 @@ for i in 0 1 2 3 4 5 6 7 8 9; do
|
||||
done
|
||||
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -47,3 +47,6 @@ else
|
||||
fi
|
||||
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -39,3 +39,6 @@ ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
$BUSYBOX_PATH/rm -f /dev/dm-*
|
||||
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -119,3 +119,6 @@ fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
43
IMG/cpio/ventoy/hook/debian/devuan-disk.sh
Normal file
43
IMG/cpio/ventoy/hook/debian/devuan-disk.sh
Normal file
@@ -0,0 +1,43 @@
|
||||
#!/ventoy/busybox/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
. /ventoy/hook/ventoy-hook-lib.sh
|
||||
|
||||
if is_ventoy_hook_finished; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
vtlog "####### $0 $* ########"
|
||||
|
||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||
|
||||
wait_for_usb_disk_ready
|
||||
|
||||
vtdiskname=$(get_ventoy_disk_name)
|
||||
if [ "$vtdiskname" = "unknown" ]; then
|
||||
vtlog "ventoy disk not found"
|
||||
PATH=$VTPATH_OLD
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
21
IMG/cpio/ventoy/hook/debian/devuan-hook.sh
Normal file
21
IMG/cpio/ventoy/hook/debian/devuan-hook.sh
Normal file
@@ -0,0 +1,21 @@
|
||||
#!/ventoy/busybox/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
$SED "/Mount.*cdrom/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/devuan-disk.sh" -i /init
|
||||
|
||||
@@ -41,3 +41,6 @@ fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -80,3 +80,6 @@ ventoy_os_install_dmsetup $vtdiskname
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -75,3 +75,6 @@ ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -33,11 +33,13 @@ echo "_vtRet1=$_vtRet1 _vtRet2=$_vtRet2 ..." >> $VTLOG
|
||||
|
||||
if [ $_vtRet1 -ne 0 -a $_vtRet2 -eq 0 ]; then
|
||||
vtFindFlag=0
|
||||
$GREP '`value from`' /usr/* -r | $AWK -F: '{print $1}' | while read vtline; do
|
||||
$GREP '`value from`' /usr/* -r | $AWK -F: '{print $1}' > $VTOY_PATH/.porteus
|
||||
while read vtline; do
|
||||
echo "hooking $vtline ..." >> $VTLOG
|
||||
$SED "s#\`value from\`#$vtPath#g" -i $vtline
|
||||
vtFindFlag=1
|
||||
done
|
||||
done < $VTOY_PATH/.porteus
|
||||
rm -f $VTOY_PATH/.porteus
|
||||
|
||||
if [ $vtFindFlag -eq 0 ]; then
|
||||
if $GREP -q '`value from`' /linuxrc; then
|
||||
|
||||
@@ -81,3 +81,6 @@ ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
25
IMG/cpio/ventoy/hook/debian/truenas-bottom.sh
Normal file
25
IMG/cpio/ventoy/hook/debian/truenas-bottom.sh
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/ventoy/busybox/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
. /ventoy/hook/ventoy-hook-lib.sh
|
||||
|
||||
vtlog "mount ventoy.iso"
|
||||
mkdir -p /root/cdrom >>$VTLOG 2>&1
|
||||
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso /root/cdrom >>$VTLOG 2>&1
|
||||
|
||||
52
IMG/cpio/ventoy/hook/debian/truenas-disk.sh
Normal file
52
IMG/cpio/ventoy/hook/debian/truenas-disk.sh
Normal file
@@ -0,0 +1,52 @@
|
||||
#!/ventoy/busybox/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
. /ventoy/hook/ventoy-hook-lib.sh
|
||||
|
||||
vtlog "####### $0 $* ########"
|
||||
|
||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||
|
||||
|
||||
ventoy_run_fuse() {
|
||||
vtlog "ventoy_run_fuse $*"
|
||||
|
||||
mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso
|
||||
|
||||
vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
|
||||
vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
|
||||
|
||||
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso
|
||||
}
|
||||
|
||||
|
||||
wait_for_usb_disk_ready
|
||||
|
||||
vtdiskname=$(get_ventoy_disk_name)
|
||||
if [ "$vtdiskname" = "unknown" ]; then
|
||||
vtlog "ventoy disk not found"
|
||||
PATH=$VTPATH_OLD
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ventoy_run_fuse $vtdiskname
|
||||
|
||||
if [ -f /ventoy/autoinstall ]; then
|
||||
sh /ventoy/hook/default/auto_install_varexp.sh /ventoy/autoinstall
|
||||
fi
|
||||
27
IMG/cpio/ventoy/hook/debian/truenas-hook.sh
Normal file
27
IMG/cpio/ventoy/hook/debian/truenas-hook.sh
Normal file
@@ -0,0 +1,27 @@
|
||||
#!/ventoy/busybox/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
if [ -e /init ] && $GREP -q '^mountroot$' /init; then
|
||||
echo "Here before mountroot ..." >> $VTLOG
|
||||
$SED "/^mountroot$/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/truenas-disk.sh" -i /init
|
||||
$SED "/^mountroot$/i\\export LIVEMEDIA=/dev/mapper/ventoy" -i /init
|
||||
$SED "/^mountroot$/i\\export LIVE_MEDIA=/dev/mapper/ventoy" -i /init
|
||||
$SED "/^mountroot$/i\\export FROMISO=$VTOY_PATH/mnt/fuse/ventoy.iso" -i /init
|
||||
$SED "/exec *run-init/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/truenas-bottom.sh" -i /init
|
||||
fi
|
||||
@@ -58,6 +58,9 @@ ventoy_get_debian_distro() {
|
||||
if $GREP -q 'Tails' /etc/os-release; then
|
||||
echo 'tails'; return
|
||||
fi
|
||||
if $GREP -q 'NAME="Kylin"' /etc/os-release; then
|
||||
echo 'kylin'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
if $GREP -q 'slax/' /proc/cmdline; then
|
||||
@@ -110,6 +113,14 @@ ventoy_get_debian_distro() {
|
||||
echo 'pyabr'; return
|
||||
fi
|
||||
|
||||
if [ -e /devuan-logo.txt ]; then
|
||||
echo 'devuan'; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'truenas' /proc/version; then
|
||||
echo 'truenas'; return
|
||||
fi
|
||||
|
||||
echo 'default'
|
||||
}
|
||||
|
||||
|
||||
@@ -39,3 +39,6 @@ $BUSYBOX_PATH/insmod $vtLoopExDir/dm-mod/$(uname -r)/64/dm-mod.ko
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -84,3 +84,6 @@ cp -a /dev/$vtDM /dev/ventoy
|
||||
ln -s /dev/$vtDM /dev/root
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
75
IMG/cpio/ventoy/hook/ewe/ventoy-disk.sh
Normal file
75
IMG/cpio/ventoy/hook/ewe/ventoy-disk.sh
Normal file
@@ -0,0 +1,75 @@
|
||||
#!/ventoy/busybox/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
. /ventoy/hook/ventoy-hook-lib.sh
|
||||
|
||||
vtlog "######### $0 $* ############"
|
||||
|
||||
if is_ventoy_hook_finished; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
wait_for_usb_disk_ready
|
||||
|
||||
vtdiskname=$(get_ventoy_disk_name)
|
||||
if [ "$vtdiskname" = "unknown" ]; then
|
||||
vtlog "ventoy disk not found"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
|
||||
vtDM=$(ventoy_find_dm_id ${blkdev_num})
|
||||
vtlog "blkdev_num=$blkdev_num vtDM=$vtDM ..."
|
||||
|
||||
while [ -n "Y" ]; do
|
||||
if [ -b /dev/$vtDM ]; then
|
||||
break
|
||||
else
|
||||
sleep 0.3
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$1" ]; then
|
||||
vtlog "ln -s /dev/$vtDM $1"
|
||||
|
||||
if [ -e "$1" ]; then
|
||||
vtlog "$1 already exist"
|
||||
else
|
||||
ln -s /dev/$vtDM "$1"
|
||||
fi
|
||||
else
|
||||
vtLABEL=$($BUSYBOX_PATH/blkid /dev/$vtDM | $SED 's/.*LABEL="\([^"]*\)".*/\1/')
|
||||
vtlog "vtLABEL is $vtLABEL"
|
||||
|
||||
if [ -z "$vtLABEL" ]; then
|
||||
vtLABEL=$($SED "s/.*label=\([^ ]*\)/\1/" /proc/cmdline)
|
||||
vtlog "vtLABEL is $vtLABEL from cmdline"
|
||||
fi
|
||||
|
||||
if [ -e "/dev/disk/by-label/$vtLABEL" ]; then
|
||||
vtlog "$1 already exist"
|
||||
else
|
||||
ln -s /dev/$vtDM "/dev/disk/by-label/$vtLABEL"
|
||||
fi
|
||||
fi
|
||||
|
||||
# OK finish
|
||||
set_ventoy_hook_finish
|
||||
25
IMG/cpio/ventoy/hook/ewe/ventoy-hook.sh
Normal file
25
IMG/cpio/ventoy/hook/ewe/ventoy-hook.sh
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/ventoy/busybox/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||
|
||||
echo "hook live.init" >> $VTLOG
|
||||
|
||||
$SED "1i $BUSYBOX_PATH/sh $VTOY_PATH/hook/ewe/ventoy-disk.sh" -i /lib/tinyramfs/hook.d/live/live.init
|
||||
|
||||
@@ -34,3 +34,6 @@ for i in 0 1 2 3 4 5 6 7 8 9; do
|
||||
done
|
||||
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -48,3 +48,6 @@ else
|
||||
fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -68,3 +68,6 @@ ventoy_os_install_dmsetup_by_unsquashfs $vtdiskname
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -72,3 +72,6 @@ ventoy_os_install_device_mapper $vtdiskname
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -36,3 +36,6 @@ blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\
|
||||
mknod -m 0660 /dev/ventoy b $blkdev_num
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -36,3 +36,6 @@ vtDM=$(ventoy_find_dm_id ${blkdev_num})
|
||||
echo -n "/dev/$vtDM" > /ventoy/rootdev
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -36,3 +36,6 @@ blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\
|
||||
mknod -m 0660 /dev/ventoy b $blkdev_num
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -72,6 +72,12 @@ ventoy_udev_disk_common_hook $* "noreplace"
|
||||
|
||||
$BUSYBOX_PATH/mount $VTOY_DM_PATH /mnt/ventoy
|
||||
|
||||
#fix Oracle Linux 6.9 install issue
|
||||
if $GREP -q -i 'Oracle Linux' /mnt/ventoy/.discinfo; then
|
||||
ln -s /mnt/ventoy /mnt/source
|
||||
fi
|
||||
|
||||
|
||||
#
|
||||
# We do a trick for rhel6 series here.
|
||||
# Use /dev/$vtCheatLoop and wapper it as a removable cdrom with bind mount.
|
||||
|
||||
@@ -33,3 +33,6 @@ fi
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -40,3 +40,6 @@ mknod -m 660 /dev/ventoy b $blkdev_num
|
||||
echo "/dev/ventoy" > cdrom.hint
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -50,3 +50,6 @@ if [ "$1" = "fakecdrom" ]; then
|
||||
fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -63,3 +63,6 @@ blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\
|
||||
mknod -m 0660 /dev/ventoy b $blkdev_num
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -26,6 +26,12 @@ if [ -f $VTOY_PATH/autoinstall ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if $GREP -q 'rdinit=/vtoy/vtoy' /proc/cmdline; then
|
||||
echo "remove rdinit param" >> $VTLOG
|
||||
echo "ptoptions=+rdinit" >> /linuxrc.config
|
||||
fi
|
||||
|
||||
|
||||
if $BUSYBOX_PATH/ls $VTOY_PATH | $GREP -q 'ventoy_dud[0-9]'; then
|
||||
if [ -f /linuxrc.config ]; then
|
||||
vtKerVer=$($BUSYBOX_PATH/uname -r)
|
||||
|
||||
@@ -25,7 +25,19 @@ fi
|
||||
|
||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||
|
||||
modprobe dm-mod
|
||||
vtlog "Loading dax and dm-mod module ..."
|
||||
$BUSYBOX_PATH/modprobe dax > /dev/null 2>&1
|
||||
$BUSYBOX_PATH/modprobe dm-mod > /dev/null 2>&1
|
||||
|
||||
if $GREP -q 'device-mapper' /proc/devices; then
|
||||
vtlog "dm-mod module check success ..."
|
||||
else
|
||||
vtlog "Need to extract dax and dm-mod module ..."
|
||||
$VTOY_PATH/tool/zstdcat /lib/modules/$(uname -r)/drivers/dax/dax.ko.zst > $VTOY_PATH/extract_dax.ko
|
||||
$BUSYBOX_PATH/insmod $VTOY_PATH/extract_dax.ko
|
||||
$VTOY_PATH/tool/zstdcat /lib/modules/$(uname -r)/drivers/md/dm-mod.ko.zst > $VTOY_PATH/extract_dm_mod.ko
|
||||
$BUSYBOX_PATH/insmod $VTOY_PATH/extract_dm_mod.ko
|
||||
fi
|
||||
|
||||
wait_for_usb_disk_ready
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
|
||||
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||
|
||||
$SED "/Searching/i $BUSYBOX_PATH/sh $VTOY_PATH/hook/t2/disk_hook.sh" -i /init
|
||||
$SED "/disktype/i x=/dev/ventoy" -i /init
|
||||
$SED "/getdevice *devicefile/i $BUSYBOX_PATH/sh $VTOY_PATH/hook/t2/disk_hook.sh" -i /init
|
||||
$SED "/getdevice *devicefile/a devicefile=/dev/ventoy" -i /init
|
||||
|
||||
|
||||
@@ -45,8 +45,15 @@ fi
|
||||
# TinyCore linux distro doesn't contain dmsetup, we use aoe here
|
||||
sudo modprobe aoe aoe_iflist=lo
|
||||
if [ -e /sys/module/aoe ]; then
|
||||
VBLADE_BIN=$(ventoy_get_vblade_bin)
|
||||
|
||||
if ! [ -d /lib64 ]; then
|
||||
vtlog "link lib64"
|
||||
NEED_UNLIB64=1
|
||||
ln -s /lib /lib64
|
||||
fi
|
||||
|
||||
VBLADE_BIN=$(ventoy_get_vblade_bin)
|
||||
|
||||
sudo nohup $VBLADE_BIN -r -f $VTOY_PATH/ventoy_image_map 9 0 lo "$vtdiskname" > /dev/null &
|
||||
sleep 2
|
||||
|
||||
@@ -54,9 +61,14 @@ if [ -e /sys/module/aoe ]; then
|
||||
vtlog 'Wait for /dev/etherd/e9.0 ....'
|
||||
sleep 2
|
||||
done
|
||||
|
||||
|
||||
sudo cp -a /dev/etherd/e9.0 "$vPart"
|
||||
|
||||
if [ -n "$NEED_UNLIB64" ]; then
|
||||
vtlog "unlink lib64"
|
||||
unlink /lib64
|
||||
fi
|
||||
|
||||
ventoy_find_bin_run rebuildfstab
|
||||
else
|
||||
vterr "aoe driver module load failed..."
|
||||
|
||||
@@ -64,6 +64,15 @@ is_ventoy_hook_finished() {
|
||||
|
||||
set_ventoy_hook_finish() {
|
||||
echo 'Y' > $VTOY_PATH/hook_finish
|
||||
|
||||
if [ -f /ventoy/ventoy_iso_part_dm_cmd ]; then
|
||||
echo "### create iso part raw dm" >> $VTLOG
|
||||
$CAT $VTOY_PATH/ventoy_raw_table >> $VTLOG
|
||||
echo "### iso part dm cmd" >> $VTLOG
|
||||
$CAT /ventoy/ventoy_iso_part_dm_cmd >> $VTLOG
|
||||
$BUSYBOX_PATH/sh /ventoy/ventoy_iso_part_dm_cmd >>$VTLOG 2>&1
|
||||
#$BUSYBOX_PATH/rm -f /ventoy/ventoy_iso_part_dm_cmd
|
||||
fi
|
||||
}
|
||||
|
||||
get_ventoy_disk_name() {
|
||||
@@ -153,17 +162,17 @@ ventoy_get_vblade_bin() {
|
||||
fi
|
||||
}
|
||||
|
||||
ventoy_find_bin_path() {
|
||||
ventoy_find_bin_path() {
|
||||
#must use built-in dmsetup, so first try ventoy path. Otherwise ubuntu installer unhappy. #3567
|
||||
if $BUSYBOX_PATH/which "$1" > /dev/null; then
|
||||
$BUSYBOX_PATH/which "$1"; return
|
||||
fi
|
||||
|
||||
for vt_path in '/bin' '/sbin' '/usr/bin' '/usr/sbin' '/usr/local/bin' '/usr/local/sbin' '/root/bin'; do
|
||||
if [ -e "$vt_path/$1" ]; then
|
||||
echo "$vt_path/$1"; return
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
echo ""
|
||||
}
|
||||
|
||||
@@ -232,257 +241,6 @@ ventoy_check_dm_module() {
|
||||
fi
|
||||
}
|
||||
|
||||
ventoy_need_proc_ibt() {
|
||||
vtKv=$($BUSYBOX_PATH/uname -r)
|
||||
vtMajor=$(echo $vtKv | $AWK -F. '{print $1}')
|
||||
vtMinor=$(echo $vtKv | $AWK -F. '{print $2}')
|
||||
|
||||
#ibt was supported since linux kernel 5.18
|
||||
if [ $vtMajor -lt 5 ]; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
elif [ $vtMajor -eq 5 ]; then
|
||||
if [ $vtMajor -lt 18 ]; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
fi
|
||||
|
||||
if $GREP -q ' ibt=off' /proc/cmdline; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
#hardware CPU doesn't support IBT
|
||||
if $VTOY_PATH/tool/vtoykmod -I; then
|
||||
:
|
||||
else
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
#dot.CONFIG not enabled
|
||||
if $GREP -q ' ibt_restore$' /proc/kallsyms; then
|
||||
:
|
||||
else
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
$BUSYBOX_PATH/true
|
||||
}
|
||||
|
||||
|
||||
ventoy_need_dm_patch() {
|
||||
if [ "$VTOY_LINUX_REMOUNT" != "01" ]; then
|
||||
if $GREP -q 'VTOY_LINUX_REMOUNT=1' /proc/cmdline; then
|
||||
:
|
||||
else
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
fi
|
||||
|
||||
if $GREP -q 'device-mapper' /proc/devices; then
|
||||
:
|
||||
else
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'dm_patch' /proc/modules; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
vtMajorVer=$($BUSYBOX_PATH/uname -r | $AWK -F. '{print $1}')
|
||||
vtMinorVer=$($BUSYBOX_PATH/uname -r | $AWK -F. '{print $2}')
|
||||
|
||||
if [ $vtMajorVer -lt 3 ]; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
elif [ $vtMajorVer -eq 3 -a $vtMinorVer -lt 10 ]; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
|
||||
$BUSYBOX_PATH/true
|
||||
}
|
||||
|
||||
ventoy_dm_patch() {
|
||||
vtDmPatchDebug=0
|
||||
vtMType=$($BUSYBOX_PATH/uname -m)
|
||||
|
||||
vtlog "######### ventoy_dm_patch ############"
|
||||
|
||||
if echo $vtMType | $EGREP -i -q "x86.64|amd64"; then
|
||||
vtKoName=dm_patch_64.ko
|
||||
elif echo $vtMType | $EGREP -i -q "i[3-6]86"; then
|
||||
vtKoName=dm_patch_32.ko
|
||||
else
|
||||
vtlog "unsupported machine type $vtMType"
|
||||
return
|
||||
fi
|
||||
|
||||
if ventoy_need_proc_ibt; then
|
||||
vtlog "need to proc IBT"
|
||||
vtKoName=dm_patch_ibt_64.ko
|
||||
vtIBT='0x8888'
|
||||
else
|
||||
vtlog "NO need to proc IBT"
|
||||
vtIBT='0'
|
||||
fi
|
||||
|
||||
|
||||
if [ -f $VTOY_PATH/tool/$vtKoName ]; then
|
||||
vtlog "/ventoy/tool/$vtKoName exist OK"
|
||||
else
|
||||
vtlog "/ventoy/tool/$vtKoName NOT exist"
|
||||
return
|
||||
fi
|
||||
|
||||
$CAT /proc/kallsyms | $BUSYBOX_PATH/sort > $VTOY_PATH/kallsyms
|
||||
|
||||
if $GREP -m1 -q 'open_table_device.isra' $VTOY_PATH/kallsyms; then
|
||||
vtISRA=$($GREP -m1 'open_table_device.isra' $VTOY_PATH/kallsyms | $AWK '{print $3}')
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym $vtISRA $VTOY_PATH/kallsyms)
|
||||
vtlog "get $vtISRA address $vtLine"
|
||||
else
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym dm_get_table_device $VTOY_PATH/kallsyms)
|
||||
vtlog "get dm_get_table_device address $vtLine"
|
||||
fi
|
||||
get_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
get_size=$(echo $vtLine | $AWK '{print $2}')
|
||||
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym blkdev_get_by_dev $VTOY_PATH/kallsyms)
|
||||
vtlog "get blkdev_get_by_dev address $vtLine"
|
||||
blkdev_get_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym blkdev_put $VTOY_PATH/kallsyms)
|
||||
vtlog "get blkdev_put address $vtLine"
|
||||
blkdev_put_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym bdev_open_by_dev $VTOY_PATH/kallsyms)
|
||||
vtlog "get bdev_open_by_dev address $vtLine"
|
||||
bdev_open_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym bdev_file_open_by_dev $VTOY_PATH/kallsyms)
|
||||
vtlog "get bdev_file_open_by_dev address $vtLine"
|
||||
bdev_file_open_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
|
||||
|
||||
if $GREP -m1 -q 'close_table_device.isra' $VTOY_PATH/kallsyms; then
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym close_table_device.isra $VTOY_PATH/kallsyms)
|
||||
vtlog "get close_table_device.isra address $vtLine"
|
||||
else
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym dm_put_table_device $VTOY_PATH/kallsyms)
|
||||
vtlog "get dm_put_table_device address $vtLine"
|
||||
fi
|
||||
put_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
put_size=$(echo $vtLine | $AWK '{print $2}')
|
||||
|
||||
ro_addr=$($GREP ' set_memory_ro$' /proc/kallsyms | $AWK '{print $1}')
|
||||
rw_addr=$($GREP ' set_memory_rw$' /proc/kallsyms | $AWK '{print $1}')
|
||||
kprobe_reg_addr=$($GREP ' register_kprobe$' /proc/kallsyms | $AWK '{print $1}')
|
||||
kprobe_unreg_addr=$($GREP ' unregister_kprobe$' /proc/kallsyms | $AWK '{print $1}')
|
||||
|
||||
if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
|
||||
vtDmPatchDebug=1
|
||||
fi
|
||||
|
||||
if $GREP -q 'dmpatch_debug' /proc/cmdline; then
|
||||
vtDmPatchDebug=1
|
||||
fi
|
||||
|
||||
|
||||
if [ $vtDmPatchDebug -eq 1 ]; then
|
||||
printk_addr=$($GREP ' printk$' /proc/kallsyms | $AWK '{print $1}')
|
||||
if [ -z "$printk_addr" ]; then
|
||||
printk_addr=$($GREP ' _printk$' /proc/kallsyms | $AWK '{print $1}')
|
||||
fi
|
||||
vtDebug="-v"
|
||||
else
|
||||
printk_addr=0
|
||||
fi
|
||||
|
||||
#printk_addr=$($GREP ' printk$' /proc/kallsyms | $AWK '{print $1}')
|
||||
#vtDebug="-v"
|
||||
|
||||
vtlog get_addr=$get_addr get_size=$get_size
|
||||
vtlog put_addr=$put_addr put_size=$put_size
|
||||
vtlog blkdev_get_addr=$blkdev_get_addr blkdev_put_addr=$blkdev_put_addr
|
||||
vtlog kprobe_reg_addr=$kprobe_reg_addr kprobe_unreg_addr=$kprobe_unreg_addr
|
||||
vtlog ro_addr=$ro_addr rw_addr=$rw_addr printk_addr=$printk_addr bdev_open_addr=$bdev_open_addr bdev_file_open_addr=$bdev_file_open_addr
|
||||
|
||||
if [ "$get_addr" = "0" -o "$put_addr" = "0" ]; then
|
||||
vtlog "Invalid symbol address"
|
||||
return
|
||||
fi
|
||||
if [ "$ro_addr" = "0" -o "$rw_addr" = "0" ]; then
|
||||
vtlog "Invalid symbol address"
|
||||
return
|
||||
fi
|
||||
|
||||
|
||||
vtKv=$($BUSYBOX_PATH/uname -r)
|
||||
vtKVMajor=$(echo $vtKv | $AWK -F. '{print $1}')
|
||||
vtKVMinor=$(echo $vtKv | $AWK -F. '{print $2}')
|
||||
vtKVSubMinor=$(echo $vtKv | $AWK -F. '{print $3}')
|
||||
|
||||
if [ ! -d /lib/modules/$vtKv ]; then
|
||||
vtlog "No modules directory found"
|
||||
return
|
||||
elif [ -d /lib/modules/$vtKv/kernel/fs ]; then
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/kernel/fs/ -name "*.ko*" | $HEAD -n1)
|
||||
elif [ -d /lib/modules/$vtKv/kernel ]; then
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/kernel/ -name "xfs.ko*" | $HEAD -n1)
|
||||
elif [ -d /lib/modules/$vtKv/initrd ]; then
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/initrd/ -name "xfs.ko*" | $HEAD -n1)
|
||||
fi
|
||||
|
||||
|
||||
if [ -z "$vtModPath" ]; then
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/ -name "*.ko*" | $HEAD -n1)
|
||||
fi
|
||||
|
||||
vtModName=$($BUSYBOX_PATH/basename $vtModPath)
|
||||
|
||||
vtlog "template module is $vtModPath $vtModName"
|
||||
|
||||
if [ -z "$vtModPath" ]; then
|
||||
vtlog "No template module found"
|
||||
return
|
||||
elif echo $vtModPath | $GREP -q "[.]ko$"; then
|
||||
$BUSYBOX_PATH/cp -a $vtModPath $VTOY_PATH/$vtModName
|
||||
elif echo $vtModPath | $GREP -q "[.]ko[.]xz$"; then
|
||||
$BUSYBOX_PATH/xzcat $vtModPath > $VTOY_PATH/$vtModName
|
||||
elif echo $vtModPath | $GREP -q "[.]ko[.]gz$"; then
|
||||
$BUSYBOX_PATH/zcat $vtModPath > $VTOY_PATH/$vtModName
|
||||
elif echo $vtModPath | $GREP -q "[.]ko[.]zst$"; then
|
||||
$VTOY_PATH/tool/zstdcat $vtModPath > $VTOY_PATH/$vtModName
|
||||
else
|
||||
vtlog "unsupport module type"
|
||||
return
|
||||
fi
|
||||
|
||||
|
||||
|
||||
#step1: modify vermagic/mod crc/relocation
|
||||
vtlog "$VTOY_PATH/tool/vtoykmod -u $vtKVMajor $vtKVMinor $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug"
|
||||
$VTOY_PATH/tool/vtoykmod -u $vtKVMajor $vtKVMinor $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug >>$VTLOG 2>&1
|
||||
|
||||
#step2: fill parameters
|
||||
vtPgsize=$($VTOY_PATH/tool/vtoyksym -p)
|
||||
|
||||
vtPrams="$VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtKVMajor $vtIBT $vtKVMinor $blkdev_get_addr $blkdev_put_addr $vtKVSubMinor $bdev_open_addr $bdev_file_open_addr $vtDebug"
|
||||
|
||||
|
||||
vtlog "$VTOY_PATH/tool/vtoykmod -f $vtPrams"
|
||||
$VTOY_PATH/tool/vtoykmod -f $vtPrams >>$VTLOG 2>&1
|
||||
|
||||
|
||||
vtlog "insmod $VTOY_PATH/tool/$vtKoName"
|
||||
$BUSYBOX_PATH/insmod $VTOY_PATH/tool/$vtKoName >>$VTLOG 2>&1
|
||||
|
||||
if $GREP -q 'dm_patch' /proc/modules; then
|
||||
vtlog "dm_patch module OK"
|
||||
echo "done" > $VTOY_PATH/dm_patch_done
|
||||
else
|
||||
vtlog "dm_patch module FAILED"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
create_ventoy_device_mapper() {
|
||||
vtlog "create_ventoy_device_mapper $*"
|
||||
@@ -502,28 +260,18 @@ create_ventoy_device_mapper() {
|
||||
fi
|
||||
|
||||
$VTOY_PATH/tool/vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
|
||||
|
||||
|
||||
vtLevel1=$($CAT /proc/sys/kernel/printk | $AWK '{print $1}')
|
||||
vtLevel2=$($CAT /proc/sys/kernel/printk | $AWK '{print $2}')
|
||||
vtLevel3=$($CAT /proc/sys/kernel/printk | $AWK '{print $3}')
|
||||
vtLevel4=$($CAT /proc/sys/kernel/printk | $AWK '{print $4}')
|
||||
if ventoy_need_dm_patch; then
|
||||
ventoy_dm_patch
|
||||
#suppress printk message
|
||||
echo 0 $vtLevel2 0 $vtLevel4 > /proc/sys/kernel/printk
|
||||
fi
|
||||
$VTOY_PATH/tool/vtoydm -r -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_raw_table
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
$VT_DM_BIN create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
|
||||
else
|
||||
$VT_DM_BIN "$2" create ventoy $VTOY_PATH/ventoy_dm_table >>$VTLOG 2>&1
|
||||
fi
|
||||
|
||||
if ventoy_need_dm_patch; then
|
||||
#recover printk level
|
||||
echo $vtLevel1 $vtLevel2 $vtLevel3 $vtLevel4 > /proc/sys/kernel/printk
|
||||
fi
|
||||
|
||||
RAWDISKNAME=$($HEAD -n1 $VTOY_PATH/ventoy_raw_table | $AWK '{print $4}')
|
||||
echo "$VT_DM_BIN create ${RAWDISKNAME#/dev/} $VTOY_PATH/ventoy_raw_table" > /ventoy/ventoy_iso_part_dm_cmd
|
||||
#echo "$VT_DM_BIN mknodes ${RAWDISKNAME#/dev/}" >> /ventoy/ventoy_iso_part_dm_cmd
|
||||
#echo "$VT_DM_BIN ls" >> /ventoy/ventoy_iso_part_dm_cmd
|
||||
}
|
||||
|
||||
create_persistent_device_mapper() {
|
||||
@@ -543,24 +291,8 @@ create_persistent_device_mapper() {
|
||||
vterr "Error: no dm module avaliable"
|
||||
fi
|
||||
|
||||
$VTOY_PATH/tool/vtoydm -p -f $VTOY_PATH/ventoy_persistent_map -d $1 > $VTOY_PATH/persistent_dm_table
|
||||
|
||||
|
||||
vtLevel1=$($CAT /proc/sys/kernel/printk | $AWK '{print $1}')
|
||||
vtLevel2=$($CAT /proc/sys/kernel/printk | $AWK '{print $2}')
|
||||
vtLevel3=$($CAT /proc/sys/kernel/printk | $AWK '{print $3}')
|
||||
vtLevel4=$($CAT /proc/sys/kernel/printk | $AWK '{print $4}')
|
||||
if [ -f $VTOY_PATH/dm_patch_done ]; then
|
||||
#suppress printk message
|
||||
echo 0 $vtLevel2 0 $vtLevel4 > /proc/sys/kernel/printk
|
||||
fi
|
||||
|
||||
$VT_DM_BIN create vtoy_persistent $VTOY_PATH/persistent_dm_table >>$VTLOG 2>&1
|
||||
|
||||
if [ -f $VTOY_PATH/dm_patch_done ]; then
|
||||
#recover printk level
|
||||
echo $vtLevel1 $vtLevel2 $vtLevel3 $vtLevel4 > /proc/sys/kernel/printk
|
||||
fi
|
||||
$VTOY_PATH/tool/vtoydm -p -f $VTOY_PATH/ventoy_persistent_map -d $1 > $VTOY_PATH/persistent_dm_table
|
||||
$VT_DM_BIN create vtoy_persistent $VTOY_PATH/persistent_dm_table >>$VTLOG 2>&1
|
||||
}
|
||||
|
||||
|
||||
@@ -853,12 +585,7 @@ ventoy_udev_disk_common_hook() {
|
||||
if [ -f $VTOY_PATH/ventoy_persistent_map ]; then
|
||||
create_persistent_device_mapper "/dev/$VTDISK"
|
||||
ventoy_create_persistent_link
|
||||
fi
|
||||
|
||||
if $GREP -q 'dm_patch' /proc/modules; then
|
||||
vtlog "remove dm_patch module."
|
||||
$BUSYBOX_PATH/rmmod dm_patch
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
ventoy_create_dev_ventoy_part() {
|
||||
@@ -866,17 +593,7 @@ ventoy_create_dev_ventoy_part() {
|
||||
$BUSYBOX_PATH/mknod -m 0666 /dev/ventoy b $blkdev_num
|
||||
|
||||
if [ -e /vtoy_dm_table ]; then
|
||||
vtPartid=1
|
||||
|
||||
vtLevel1=$($CAT /proc/sys/kernel/printk | $AWK '{print $1}')
|
||||
vtLevel2=$($CAT /proc/sys/kernel/printk | $AWK '{print $2}')
|
||||
vtLevel3=$($CAT /proc/sys/kernel/printk | $AWK '{print $3}')
|
||||
vtLevel4=$($CAT /proc/sys/kernel/printk | $AWK '{print $4}')
|
||||
if [ -f $VTOY_PATH/dm_patch_done ]; then
|
||||
#suppress printk message
|
||||
echo 0 $vtLevel2 0 $vtLevel4 > /proc/sys/kernel/printk
|
||||
fi
|
||||
|
||||
vtPartid=1
|
||||
$CAT /vtoy_dm_table | while read vtline; do
|
||||
echo $vtline > /ventoy/dm_table_part${vtPartid}
|
||||
$VTOY_PATH/tool/dmsetup create ventoy${vtPartid} /ventoy/dm_table_part${vtPartid}
|
||||
@@ -886,11 +603,6 @@ ventoy_create_dev_ventoy_part() {
|
||||
|
||||
vtPartid=$(expr $vtPartid + 1)
|
||||
done
|
||||
|
||||
if [ -f $VTOY_PATH/dm_patch_done ]; then
|
||||
#recover printk level
|
||||
echo $vtLevel1 $vtLevel2 $vtLevel3 $vtLevel4 > /proc/sys/kernel/printk
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -46,3 +46,6 @@ done
|
||||
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -40,3 +40,6 @@ if ! [ -e $VTOY_DM_PATH ]; then
|
||||
fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
||||
|
||||
@@ -72,27 +72,29 @@ ventoy_unpack_initramfs() {
|
||||
|
||||
for vtx in '1F8B zcat' '1F9E zcat' '425A bzcat' '5D00 lzcat' 'FD37 xzcat' '894C lzopcat' '0221 lz4cat' '28B5 zstdcat' '3037 cat' '4C5A lunzip -c'; do
|
||||
if [ "${vtx:0:4}" = "${vtmagic:0:4}" ]; then
|
||||
echo "vtx=$vtx" >> $VTLOG
|
||||
if [ $vtskip -eq 0 ]; then
|
||||
if [ "${vtx:5}" = "xzcat" ]; then
|
||||
rm -f $VTOY_PATH/xzlog
|
||||
${vtx:5} $vtfile 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
if grep -q 'corrupted data' $VTOY_PATH/xzlog; then
|
||||
echo 'xzcat failed, now try xzminidec...' >> $VTLOG
|
||||
rm -f $VTOY_PATH/xzlog
|
||||
cat $vtfile | xzminidec 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
echo "vtx=$vtx" >> $VTLOG
|
||||
if [ $vtskip -ne 0 ]; then
|
||||
dd if=$vtfile skip=$vtskip iflag=skip_bytes status=none > ${vtfile}.skip
|
||||
rm -f $vtfile
|
||||
mv ${vtfile}.skip $vtfile
|
||||
fi
|
||||
|
||||
if grep -q 'limit' $VTOY_PATH/xzlog; then
|
||||
echo 'xzminidec failed, now try xzcat_musl ...' >> $VTLOG
|
||||
xzcat_musl $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
fi
|
||||
if [ "${vtx:5}" = "xzcat" ]; then
|
||||
rm -f $VTOY_PATH/xzlog
|
||||
${vtx:5} $vtfile 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
if grep -q 'corrupted data' $VTOY_PATH/xzlog; then
|
||||
echo 'xzcat failed, now try xzminidec...' >> $VTLOG
|
||||
rm -f $VTOY_PATH/xzlog
|
||||
cat $vtfile | xzminidec 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
|
||||
if grep -q 'limit' $VTOY_PATH/xzlog; then
|
||||
echo 'xzminidec failed, now try xzcat_musl ...' >> $VTLOG
|
||||
xzcat_musl $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
fi
|
||||
else
|
||||
${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
fi
|
||||
else
|
||||
dd if=$vtfile skip=$vtskip iflag=skip_bytes status=none | ${vtx:5} | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
fi
|
||||
${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -39,35 +39,6 @@ fi
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
ventoy_create_dev_ventoy_part
|
||||
|
||||
if ventoy_need_dm_patch; then
|
||||
vtlog "extract a ko file"
|
||||
|
||||
mkdir -p /ventoy/tmpmnt1 /ventoy/tmpmnt2
|
||||
mount /dev/ventoy1 /ventoy/tmpmnt1
|
||||
mount /ventoy/tmpmnt1/boot/batocera /ventoy/tmpmnt2
|
||||
vtKV=$(uname -r)
|
||||
|
||||
mkdir -p /lib/modules/$vtKV/kernel/
|
||||
vtKO=$(find "/ventoy/tmpmnt2/lib/modules/$vtKV/kernel/fs/" -name "*.ko*" | head -n1)
|
||||
cp -a $vtKO /lib/modules/$vtKV/kernel/
|
||||
|
||||
vtlog "vtKV=$vtKV vtKO=$vtKO"
|
||||
|
||||
umount /ventoy/tmpmnt2
|
||||
umount /ventoy/tmpmnt1
|
||||
|
||||
vtPartid=1
|
||||
cat /vtoy_dm_table | while read vtline; do
|
||||
dmsetup remove ventoy$vtPartid
|
||||
vtPartid=$(expr $vtPartid + 1)
|
||||
done
|
||||
dmsetup remove ventoy
|
||||
|
||||
vtlog "Recreate device-mapper"
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
ventoy_create_dev_ventoy_part
|
||||
fi
|
||||
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
|
||||
@@ -52,6 +52,11 @@ ventoy_get_os_type() {
|
||||
fi
|
||||
fi
|
||||
|
||||
# Parted Magic
|
||||
if [ -d /pmagic ]; then
|
||||
echo 'pmagic'; return
|
||||
fi
|
||||
|
||||
# PrimeOS :
|
||||
if $GREP -q 'PrimeOS' /proc/version; then
|
||||
echo 'primeos'; return
|
||||
@@ -164,7 +169,7 @@ ventoy_get_os_type() {
|
||||
echo 'debian'; return
|
||||
elif $GREP -q 'Solus' /etc/os-release; then
|
||||
echo 'rhel7'; return
|
||||
elif $GREP -q 'openEuler' /etc/os-release; then
|
||||
elif $GREP -q -i 'openEuler' /etc/os-release; then
|
||||
echo 'openEuler'; return
|
||||
elif $GREP -q 'fuyu' /etc/os-release; then
|
||||
echo 'openEuler'; return
|
||||
@@ -172,6 +177,10 @@ ventoy_get_os_type() {
|
||||
echo 'deepin'; return
|
||||
elif $GREP -q 'chinauos' /etc/os-release; then
|
||||
echo 'deepin'; return
|
||||
elif $GREP -qi 'aerynos' /etc/os-release; then
|
||||
echo 'rhel7'; return
|
||||
elif $GREP -qi 'ID_LIKE=debian' /etc/os-release; then
|
||||
echo 'debian'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -237,10 +246,6 @@ ventoy_get_os_type() {
|
||||
echo 'adelie'; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'pmagic' /proc/version; then
|
||||
echo 'pmagic'; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'CDlinux' /proc/cmdline; then
|
||||
echo 'cdlinux'; return
|
||||
fi
|
||||
@@ -311,8 +316,8 @@ ventoy_get_os_type() {
|
||||
fi
|
||||
|
||||
|
||||
if [ -e /init ]; then
|
||||
if $GREP -q -m1 'T2 SDE' /init; then
|
||||
if [ -e /etc/initrd-release ]; then
|
||||
if $GREP -q -m1 't2sde' /etc/initrd-release; then
|
||||
echo 't2'; return
|
||||
fi
|
||||
fi
|
||||
@@ -372,6 +377,13 @@ ventoy_get_os_type() {
|
||||
echo 'openEuler'; return
|
||||
fi
|
||||
fi
|
||||
if [ -f /etc/kylin-release ]; then
|
||||
if $GREP -i -q -m1 'Kylin.*Server.* V1[1-9] ' /etc/kylin-release; then
|
||||
echo 'openEuler'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if $GREP -q 'chimera' /proc/version; then
|
||||
echo 'chimera'; return
|
||||
@@ -384,6 +396,12 @@ ventoy_get_os_type() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -f /etc/tinyramfs/config ]; then
|
||||
if $GREP -q 'EWE_ISO' /etc/tinyramfs/config; then
|
||||
echo "ewe"; return
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
echo "default"
|
||||
}
|
||||
|
||||
@@ -101,6 +101,11 @@ ventoy_get_os_type() {
|
||||
fi
|
||||
fi
|
||||
|
||||
# Parted Magic
|
||||
if [ -d /pmagic ]; then
|
||||
echo 'pmagic'; return
|
||||
fi
|
||||
|
||||
# rhel5/CentOS5 and all other distributions based on them
|
||||
if $GREP -q 'el5' /proc/version; then
|
||||
echo 'rhel5'; return
|
||||
@@ -200,7 +205,7 @@ ventoy_get_os_type() {
|
||||
echo 'debian'; return
|
||||
elif $GREP -q 'Solus' /etc/os-release; then
|
||||
echo 'rhel7'; return
|
||||
elif $GREP -q 'openEuler' /etc/os-release; then
|
||||
elif $GREP -q -i 'openEuler' /etc/os-release; then
|
||||
echo 'openEuler'; return
|
||||
elif $GREP -q 'fuyu' /etc/os-release; then
|
||||
echo 'openEuler'; return
|
||||
@@ -269,10 +274,6 @@ ventoy_get_os_type() {
|
||||
echo 'adelie'; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'pmagic' /proc/version; then
|
||||
echo 'pmagic'; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'CDlinux' /proc/cmdline; then
|
||||
echo 'cdlinux'; return
|
||||
fi
|
||||
@@ -343,8 +344,8 @@ ventoy_get_os_type() {
|
||||
fi
|
||||
|
||||
|
||||
if [ -e /init ]; then
|
||||
if $GREP -q -m1 'T2 SDE' /init; then
|
||||
if [ -e /etc/initrd-release ]; then
|
||||
if $GREP -q -m1 't2sde' /etc/initrd-release; then
|
||||
echo 't2'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -11,7 +11,8 @@ Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX
|
||||
|
||||
OPTION: (optional)
|
||||
-r SIZE_MB preserve some space at the bottom of the disk (only for install)
|
||||
-s enable secure boot support (default is disabled)
|
||||
-s enable secure boot support (default is enabled)
|
||||
-S disable secure boot support (default is enabled)
|
||||
-g use GPT partition style, default is MBR style (only for install)
|
||||
|
||||
Please refer https://www.ventoy.net/en/doc_start.html for details.
|
||||
|
||||
Binary file not shown.
@@ -21,7 +21,7 @@ elif uname -m | grep -E -q 'mips64'; then
|
||||
else
|
||||
export TOOLDIR=i386
|
||||
fi
|
||||
export PATH="./tool/$TOOLDIR:$PATH"
|
||||
export PATH="$OLDDIR/tool/$TOOLDIR:$PATH"
|
||||
|
||||
|
||||
echo ''
|
||||
@@ -61,6 +61,24 @@ if [ $? -eq 0 ]; then
|
||||
done
|
||||
fi
|
||||
|
||||
#use static linked mkexfatfs for musl-libc environment
|
||||
if [ -f mkexfatfs_static ]; then
|
||||
if ldd --version 2>&1 | grep -qi musl; then
|
||||
mv mkexfatfs mkexfatfs_shared
|
||||
mv mkexfatfs_static mkexfatfs
|
||||
else
|
||||
if ./mkexfatfs -V > /dev/null 2>&1; then
|
||||
echo "mkexfatfs can not run, check static version" >> ./log.txt
|
||||
else
|
||||
if ./mkexfatfs_static -V > /dev/null 2>&1; then
|
||||
echo "Use static version of mkexfatfs" >> ./log.txt
|
||||
mv mkexfatfs mkexfatfs_shared
|
||||
mv mkexfatfs_static mkexfatfs
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
cd ../../
|
||||
chmod +x -R ./tool/$TOOLDIR
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -4,7 +4,7 @@
|
||||
#
|
||||
submenu "$VTLANG_CTRL_TEMP_SET" --class=debug_temp_set --class=F5tool {
|
||||
menuentry "[ $VTOY_WIN11_BYPASS_CHECK ] $VTLANG_WIN11_BYPASS_CHECK" --class=debug_temp_win11_bypass --class=debug_temp_set --class=F5tool \
|
||||
VTOY_RUN_SET0 {
|
||||
VTOY_RUN_SET_0_0 {
|
||||
if [ "$VTOY_WIN11_BYPASS_CHECK" = "0" ]; then
|
||||
set VTOY_WIN11_BYPASS_CHECK=1
|
||||
else
|
||||
@@ -13,31 +13,22 @@ submenu "$VTLANG_CTRL_TEMP_SET" --class=debug_temp_set --class=F5tool {
|
||||
}
|
||||
|
||||
menuentry "[ $VTOY_WIN11_BYPASS_NRO ] $VTLANG_WIN11_BYPASS_NRO" --class=debug_temp_win11_nro --class=debug_temp_set --class=F5tool \
|
||||
VTOY_RUN_SET1 {
|
||||
VTOY_RUN_SET_1_0 {
|
||||
if [ "$VTOY_WIN11_BYPASS_NRO" = "0" ]; then
|
||||
set VTOY_WIN11_BYPASS_NRO=1
|
||||
else
|
||||
set VTOY_WIN11_BYPASS_NRO=0
|
||||
fi
|
||||
}
|
||||
|
||||
menuentry "[ $VTOY_LINUX_REMOUNT ] $VTLANG_LINUX_REMOUNT" --class=debug_temp_linux_remount --class=debug_temp_set --class=F5tool \
|
||||
VTOY_RUN_SET2 {
|
||||
if [ "$VTOY_LINUX_REMOUNT" = "0" ]; then
|
||||
set VTOY_LINUX_REMOUNT=1
|
||||
else
|
||||
set VTOY_LINUX_REMOUNT=0
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
menuentry "[ $VTOY_SECONDARY_BOOT_MENU ] $VTLANG_SECONDARY_BOOT_MENU" --class=debug_temp_second_menu --class=debug_temp_set --class=F5tool \
|
||||
VTOY_RUN_SET3 {
|
||||
VTOY_RUN_SET_2_0 {
|
||||
if [ "$VTOY_SECONDARY_BOOT_MENU" = "0" ]; then
|
||||
set VTOY_SECONDARY_BOOT_MENU=1
|
||||
else
|
||||
set VTOY_SECONDARY_BOOT_MENU=0
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
menuentry "$VTLANG_RETURN_PREVIOUS" --class=vtoyret VTOY_RET {
|
||||
echo "Return ..."
|
||||
@@ -45,6 +36,42 @@ submenu "$VTLANG_CTRL_TEMP_SET" --class=debug_temp_set --class=F5tool {
|
||||
}
|
||||
|
||||
|
||||
if [ "$grub_platform" != "pc" ]; then
|
||||
submenu "$VTLANG_WIN_UEFI_RES_LOCK" --class=debug_uefi_res_lock --class=F5tool {
|
||||
set vtActive0="[ ]"
|
||||
set vtActive1="[ ]"
|
||||
set vtActive2="[ ]"
|
||||
set vtActive3="[ ]"
|
||||
if [ "$VTOY_WIN_UEFI_RES_LOCK" = "0" ]; then
|
||||
set vtActive0="[*]"
|
||||
elif [ "$VTOY_WIN_UEFI_RES_LOCK" = "1" ]; then
|
||||
set vtActive1="[*]"
|
||||
elif [ "$VTOY_WIN_UEFI_RES_LOCK" = "2" ]; then
|
||||
set vtActive2="[*]"
|
||||
elif [ "$VTOY_WIN_UEFI_RES_LOCK" = "3" ]; then
|
||||
set vtActive3="[*]"
|
||||
fi
|
||||
|
||||
menuentry "$vtActive0 $VTLANG_UEFI_RES_LOCK_NONE" --class=debug_uefi_res_lock0 --class=F5tool VTOY_RUN_SET_0_1 {
|
||||
set VTOY_WIN_UEFI_RES_LOCK=0
|
||||
}
|
||||
menuentry "$vtActive1 $VTLANG_UEFI_RES_LOCK_MAX" --class=debug_uefi_res_lock1 --class=F5tool VTOY_RUN_SET_1_1 {
|
||||
set VTOY_WIN_UEFI_RES_LOCK=1
|
||||
}
|
||||
menuentry "$vtActive2 $VTLANG_UEFI_RES_LOCK_1024_768" --class=debug_uefi_res_lock2 --class=F5tool VTOY_RUN_SET_2_1 {
|
||||
set VTOY_WIN_UEFI_RES_LOCK=2
|
||||
}
|
||||
menuentry "$vtActive3 $VTLANG_UEFI_RES_LOCK_BE1024_768" --class=debug_uefi_res_lock3 --class=F5tool VTOY_RUN_SET_3_1 {
|
||||
set VTOY_WIN_UEFI_RES_LOCK=3
|
||||
}
|
||||
|
||||
menuentry "$VTLANG_RETURN_PREVIOUS" --class=vtoyret VTOY_RET {
|
||||
echo "Return ..."
|
||||
}
|
||||
}
|
||||
fi
|
||||
|
||||
|
||||
submenu "$VTLANG_MENU_LANG" --class=debug_menu_lang --class=F5tool {
|
||||
source $prefix/menulang.cfg
|
||||
}
|
||||
|
||||
@@ -33,6 +33,21 @@ function ventoy_debug_pause {
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function ventoy_max_resolution {
|
||||
#Skip this for VirtualBox
|
||||
smbios -t 1 -s 0x05 --set=system_product;
|
||||
if vt_str_casebegin "$system_product" "VirtualBox"; then
|
||||
return
|
||||
fi
|
||||
|
||||
vt_enum_video_mode
|
||||
vt_get_video_mode 0 vtCurMode
|
||||
terminal_output console
|
||||
set gfxmode=$vtCurMode
|
||||
terminal_output gfxterm
|
||||
}
|
||||
|
||||
function ventoy_cli_console {
|
||||
if [ -z "$vtoy_display_mode" ]; then
|
||||
terminal_output console
|
||||
@@ -55,6 +70,12 @@ function ventoy_acpi_param {
|
||||
fi
|
||||
}
|
||||
|
||||
function vt_vcfg_pre_proc {
|
||||
vt_img_sector "${vtoy_iso_part}${vt_chosen_path}"
|
||||
vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio $vtoy_iso_part "$vt_chosen_path"
|
||||
}
|
||||
|
||||
function ventoy_vcfg_proc {
|
||||
if vt_check_custom_boot "${1}" vt_vcfg; then
|
||||
set vtoy_chosen_path="${1}"
|
||||
@@ -403,10 +424,24 @@ function distro_specify_initrd_file_phase2 {
|
||||
vt_linux_specify_initrd_file /images/pxeboot/initrd.img
|
||||
elif [ -f (loop)/live/initrd ]; then
|
||||
vt_linux_specify_initrd_file /live/initrd
|
||||
elif [ -f (loop)/initramfs-linux.img ]; then
|
||||
vt_linux_specify_initrd_file /initramfs-linux.img
|
||||
elif [ -f (loop)/boot/isolinux/initrd.gz ]; then
|
||||
vt_linux_specify_initrd_file /boot/isolinux/initrd.gz
|
||||
elif vt_str_begin "$vt_volume_id" "AERYNOS"; then
|
||||
vt_vcfg_pre_proc
|
||||
|
||||
loopback va "${vtoy_iso_part}${vt_chosen_path}"
|
||||
loopback vb (va)/EFI/Boot/efiboot.img
|
||||
|
||||
set root=(vb)
|
||||
vt_systemd_menu (vb) vt_sys_menu_mem vt_linux_initrd
|
||||
configfile "mem:${vt_sys_menu_mem_addr}:size:${vt_sys_menu_mem_size}"
|
||||
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function ventoy_get_ghostbsd_ver {
|
||||
# fallback to parse version from elf /boot/kernel/kernel
|
||||
set vt_freebsd_ver=xx
|
||||
@@ -468,19 +503,19 @@ function ventoy_freebsd_proc {
|
||||
ventoy_get_truenas_ver "$1" "${chosen_path}"
|
||||
elif vt_strstr "$vt_volume_id" "FURYBSD"; then
|
||||
ventoy_get_furybsd_ver "$1" "${chosen_path}"
|
||||
elif regexp --set 1:vtBsdVerNum "^(14|13|12|11|10|9)_[0-9]" "$vt_volume_id"; then
|
||||
elif regexp --set 1:vtBsdVerNum "^(15|14|13|12|11|10|9)_[0-9]" "$vt_volume_id"; then
|
||||
set vt_freebsd_ver=${vtBsdVerNum}.x
|
||||
elif [ -d (loop)/usr/midnightbsd-dist ]; then
|
||||
ventoy_get_midnightbsd_ver "$1" "${chosen_path}"
|
||||
set vtFreeBsdDistro=MidnightBSD
|
||||
elif [ -e (loop)/bin/freebsd-version ]; then
|
||||
vt_unix_parse_freebsd_ver (loop)/bin/freebsd-version vt_userland_ver
|
||||
if regexp --set 1:vtBsdVerNum "\"(14|13|12|11|10|9)\.[0-9]-" "$vt_userland_ver"; then
|
||||
if regexp --set 1:vtBsdVerNum "\"(15|14|13|12|11|10|9)\.[0-9]-" "$vt_userland_ver"; then
|
||||
set vt_freebsd_ver=${vtBsdVerNum}.x
|
||||
fi
|
||||
elif [ -e (loop)/README.TXT ]; then
|
||||
vt_1st_line (loop)/README.TXT vt_freebsd_line1
|
||||
if regexp --set 1:vtBsdVerNum "FreeBSD (14|13|12|11|10|9)\.[0-9]-" "$vt_freebsd_line1"; then
|
||||
if regexp --set 1:vtBsdVerNum "FreeBSD (15|14|13|12|11|10|9)\.[0-9]-" "$vt_freebsd_line1"; then
|
||||
set vt_freebsd_ver=${vtBsdVerNum}.x
|
||||
fi
|
||||
elif vt_strstr "${chosen_path}" "MidnightBSD"; then
|
||||
@@ -514,6 +549,13 @@ function ventoy_freebsd_proc {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$vt_freebsd_ver" = "14.x" ]; then
|
||||
if [ -e (loop)/boot/lua/brand-pfSense.lua ]; then
|
||||
set vtFreeBsdDistro=pfSense
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ -n "${vtdebug_flag}" ]; then
|
||||
echo "This is $vtFreeBsdDistro $vt_freebsd_ver ${vt_freebsd_bit}bit"
|
||||
fi
|
||||
@@ -620,7 +662,7 @@ function uefi_windows_menu_func {
|
||||
|
||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||
ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
|
||||
ventoy_cli_console
|
||||
ventoy_max_resolution
|
||||
chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} iso_${ventoy_fs_probe} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||
boot
|
||||
else
|
||||
@@ -662,7 +704,7 @@ function uefi_linux_menu_func {
|
||||
if [ -d (loop)/pmagic ]; then
|
||||
vt_linux_specify_initrd_file /pmagic/initrd.img
|
||||
else
|
||||
for file in "boot/grub/grub.cfg" "EFI/BOOT/grub.cfg" "EFI/boot/grub.cfg" "efi/boot/grub.cfg" "EFI/BOOT/BOOTX64.conf" "/grub/grub.cfg"; do
|
||||
for file in "boot/grub/grub.cfg" "EFI/BOOT/grub.cfg" "EFI/boot/grub.cfg" "efi/boot/grub.cfg" "EFI/BOOT/BOOTX64.conf" "/grub/grub.cfg" "EFI/BOOT/grub/grub.cfg"; do
|
||||
if [ -e (loop)/$file ]; then
|
||||
vt_linux_parse_initrd_grub file (loop)/$file
|
||||
fi
|
||||
@@ -1402,7 +1444,7 @@ function ventoy_iso_busybox_ver {
|
||||
|
||||
#special process for deepin-live iso
|
||||
if [ "$vt_chosen_size" = "403701760" ]; then
|
||||
if vt_str_str "$vt_chosen_path" "/deepin-live"; then
|
||||
if vt_strstr "$vt_chosen_path" "/deepin-live"; then
|
||||
set ventoy_busybox_ver=64
|
||||
fi
|
||||
elif vt_str_begin "$vt_volume_id" "PHOTON_"; then
|
||||
@@ -1413,6 +1455,8 @@ function ventoy_iso_busybox_ver {
|
||||
set ventoy_busybox_ver=64
|
||||
elif vt_str_begin "$vt_volume_id" "KAOS_"; then
|
||||
set ventoy_busybox_ver=64
|
||||
elif vt_strstr "$vt_volume_id" "x86_64"; then
|
||||
set ventoy_busybox_ver=64
|
||||
|
||||
fi
|
||||
fi
|
||||
@@ -1891,6 +1935,12 @@ function ventoy_img_volumio {
|
||||
function ventoy_img_openelec {
|
||||
elec_ver=$1
|
||||
|
||||
if [ "$elec_ver" = "LibreELEC" ]; then
|
||||
if vt_strstr "$vt_chosen_name" "x86_64"; then
|
||||
set ventoy_busybox_ver=64
|
||||
fi
|
||||
fi
|
||||
|
||||
vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
@@ -2399,7 +2449,7 @@ function mimg_common_menuentry {
|
||||
#############################################################
|
||||
#############################################################
|
||||
|
||||
set VENTOY_VERSION="1.0.99"
|
||||
set VENTOY_VERSION="1.1.12"
|
||||
|
||||
#ACPI not compatible with Window7/8, so disable by default
|
||||
set VTOY_PARAM_NO_ACPI=1
|
||||
|
||||
19
INSTALL/grub/help/fa_IR.txt
Normal file
19
INSTALL/grub/help/fa_IR.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
L - انتخاب زبان
|
||||
F1 - نمایش راهنما
|
||||
F2 - مرور و بوت کردن فایلها در دیسک محلی
|
||||
F3 - تغییر حالت منو بین درختی <-> لیستی
|
||||
F4 - بوت کردن ویندوز/لینوکس روی دیسک محلی
|
||||
F5 - ابزار های کمکی
|
||||
F6 - بارگیری منوی سفارشی Grub2
|
||||
F7 - تغییر حالت بین حالت GUI <-> حالت TEXT
|
||||
|
||||
m/Ctrl+m - اعتبارسنجی فایل ایمیج (md5/sha1/sha256/sha512)
|
||||
d/Ctrl+d - حالت Memdisk (فقط برای ایمیج های کوچک WinPE/LiveCD ISO/IMG)
|
||||
w/Ctrl+w - حالت WIMBOOT (فقط برای فایل های ایزو Windows/WinPE)
|
||||
r/Ctrl+r - حالت Grub2 (فقط برای برخی از توزیع های لینوکس)
|
||||
i/Ctrl+i - حالت سازگار (فقط برای مشکل زدایی)
|
||||
u/Ctrl+u - بارگیری درایور ISO EFI (تنها برای مشکل زدایی، نمیتوان به صورت رسمی استفاده کرد)
|
||||
|
||||
|
||||
|
||||
جهت بازگشت دکمه ESC را کلیک کنید ......
|
||||
@@ -7,10 +7,10 @@ F5 - 유틸리티
|
||||
F6 - 사용자 지정 Grub2 메뉴 불러오기
|
||||
F7 - 그래픽 모드 <-> 텍스트 모드 간에 전환
|
||||
|
||||
m/Ctrl+m - 체크섬 이미지 파일 (md5/sha1/sha256/sha512)
|
||||
d/Ctrl+d - Memdisk 모드 (작은 WinPE/LiveCD ISO/IMG 전용)
|
||||
w/Ctrl+w - WIMBOOT 모드 (표준 Windows/WinPE ISO 전용)
|
||||
r/Ctrl+r - Grub2 모드 (일부 Linux 배포판에만 해당)
|
||||
m/Ctrl+m - 이미지 파일 체크섬 (md5/sha1/sha256/sha512)
|
||||
d/Ctrl+d - Memdisk 모드 (작은 WinPE/LiveCD ISO/IMG에만 해당)
|
||||
w/Ctrl+w - WIMBOOT 모드 (표준 Windows/WinPE ISO에만 해당)
|
||||
r/Ctrl+r - Grub2 모드 (일반 Linux 배포판에만 해당)
|
||||
i/Ctrl+i - 호환 모드 (디버그 전용, 공식적으로 사용할 수 없음)
|
||||
u/Ctrl+u - ISO EFI 드라이버 불러오기 (디버그 전용, 공식적으로 사용할 수 없음)
|
||||
|
||||
|
||||
19
INSTALL/grub/help/lg_UG.txt
Normal file
19
INSTALL/grub/help/lg_UG.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
L - Londako Olulimi
|
||||
F1 - Laga obuyambi
|
||||
F2 - Nnoonya era kozesa Fayiro eziri ku Disk
|
||||
F3 - Kyusa endabika ya Menu wakati wa Masaasana (Treeview) ne y'olukalala (ListView)
|
||||
F4 - Ttandika Windows/Linux ku disk erimu
|
||||
F5 - Ebikozesebwa ebirala
|
||||
F6 - Kozesa Grub2 menu gyewerobozza
|
||||
F7 - Okukyuusa okuva mu Bifaananyi (GUI Mode) <-> Bigambo (TEXT Mode)
|
||||
|
||||
m/Ctrl+m - Okukebera Checksum image files (md5/sha1/sha256/sha512)
|
||||
d/Ctrl+d - Memdisk Mode (Ya WinPE/LiveCD ISO/IMG entono zokka)
|
||||
w/Ctrl+w - WIMBOOT Mode (Ya Windows/WinPE ISO zokka)
|
||||
r/Ctrl+r - Grub2 Mode (Ya nkola za Linux ezimu)
|
||||
i/Ctrl+i - Compatible Mode (Ya kutereeza kwokka (debugging))
|
||||
u/Ctrl+u - Kozesa ISO EFI driver (Ya kutereeza kwokka (debugging), tesobola kukozesebwa mu butongole)
|
||||
|
||||
|
||||
|
||||
nyiga ESC to okudda emabega ......
|
||||
@@ -1,18 +1,18 @@
|
||||
L - Sele<EFBFBD><EFBFBD>o de Idiomas
|
||||
F1 - Exibir informa<EFBFBD><EFBFBD>es de ajuda
|
||||
L - Seleção de Idiomas
|
||||
F1 - Exibir informações de ajuda
|
||||
F2 - Explorar e inicializar os arquivos no disco local
|
||||
F3 - Trocar o modo do menu entre Visualiza<EFBFBD><EFBFBD>o em <EFBFBD>rvore <-> Visualiza<EFBFBD><EFBFBD>o em Lista
|
||||
F3 - Trocar o modo do menu entre Visualização em Árvore <-> Visualização em Lista
|
||||
F4 - Inicializar o Windows/Linux no disco local
|
||||
F5 - Utilit<EFBFBD>rios
|
||||
F5 - Utilitários
|
||||
F6 - Carregar o Menu Personalizado do Grub2
|
||||
F7 - Trocar entre o Modo GUI <-> Modo TEXTO
|
||||
|
||||
m/Ctrl+m - Checksum dos arquivos de imagem (md5/sha1/sha256/sha512)
|
||||
d/Ctrl+d - Modo Memdisk (S<EFBFBD> pros pequenos WinPE/LiveCD ISO/IMG)
|
||||
w/Ctrl+w - Modo WIMBOOT (S<EFBFBD> pra arquivos ISO do Windows/WinPE)
|
||||
r/Ctrl+r - Modo Grub2 (S<EFBFBD> pra algumas distros do Linux)
|
||||
i/Ctrl+i - Modo Compat<EFBFBD>vel (S<EFBFBD> pra debugging)
|
||||
u/Ctrl+u - Carregar o driver EFI da ISO (S<EFBFBD> pra debugging, n<EFBFBD>o pode ser usado oficialmente)
|
||||
d/Ctrl+d - Modo Memdisk (Só pros pequenos WinPE/LiveCD ISO/IMG)
|
||||
w/Ctrl+w - Modo WIMBOOT (Só pra arquivos ISO do Windows/WinPE)
|
||||
r/Ctrl+r - Modo Grub2 (Só pra algumas distros do Linux)
|
||||
i/Ctrl+i - Modo Compatível (Só pra debugging)
|
||||
u/Ctrl+u - Carregar o driver EFI da ISO (Só pra debugging, não pode ser usado oficialmente)
|
||||
|
||||
|
||||
|
||||
|
||||
19
INSTALL/grub/help/sl_SI.txt
Normal file
19
INSTALL/grub/help/sl_SI.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
L - Izbira jezika
|
||||
F1 - Prikaz informacij o pomoči
|
||||
F2 - Brskanje in zagon datotek na lokalnem disku
|
||||
F3 - Preklop med načinom menija Treeview <-> ListView
|
||||
F4 - Zagon Windows/Linux na lokalnem disku
|
||||
F5 - Pripomočki
|
||||
F6 - Naložitev prilagojenega menija Grub2
|
||||
F7 - Preklop med načinom GUI <-> načinom TEXT
|
||||
|
||||
m/Ctrl+m - Preveri kontrolno vsoto slikovnih datotek (md5/sha1/sha256/sha512)
|
||||
d/Ctrl+d - Način Memdisk (samo za majhne WinPE/LiveCD ISO/IMG)
|
||||
w/Ctrl+w - Način WIMBOOT (samo za datoteke Windows/WinPE ISO)
|
||||
r/Ctrl+r – Način Grub2 (samo za nekatere distribucije Linux)
|
||||
i/Ctrl+i – Združljiv način (samo za odpravljanje napak)
|
||||
u/Ctrl+u – Naloži ISO EFI gonilnik (samo za odpravljanje napak, uradno se ne more uporabljati)
|
||||
|
||||
|
||||
|
||||
Pritisnite ESC za vrnitev ......
|
||||
@@ -40,17 +40,17 @@ menuentry "$VTLANG_HWINFO" --class=debug_hwinfo --class=F5tool {
|
||||
echo "Physical RAM $grub_total_ram MB"
|
||||
|
||||
echo ""
|
||||
echo "Manufacture $system_vendor"
|
||||
echo "Manufacturer $system_vendor"
|
||||
echo "Product Name $system_product"
|
||||
echo "Version $system_version"
|
||||
|
||||
echo ""
|
||||
echo "Board Manufacture $board_vendor"
|
||||
echo "Board Manufacturer $board_vendor"
|
||||
echo "Board Name $board_product"
|
||||
echo "Board Version $board_version"
|
||||
|
||||
echo ""
|
||||
echo "BIOS Manufacture $bios_vendor"
|
||||
echo "BIOS Manufacturer $bios_vendor"
|
||||
echo "BIOS Version $bios_ver"
|
||||
echo "BIOS Date $bios_date"
|
||||
echo "BIOS ROM Size $bios_size"
|
||||
|
||||
@@ -88,6 +88,11 @@
|
||||
"VTLANG_WIN11_BYPASS_NRO": "تجاوز متطلبات الحساب عبر الإنترنت عند تثبيت Windows 11",
|
||||
"VTLANG_LINUX_REMOUNT": "ضم قسم Ventoy بعد إقلاع Linux",
|
||||
"VTLANG_SECONDARY_BOOT_MENU": "اظهر قائمة الإقلاع الثانوية",
|
||||
|
||||
"VTLANG_WIN_UEFI_RES_LOCK": "Lock the resolution when UEFI boot Windows/WinPE",
|
||||
"VTLANG_UEFI_RES_LOCK_NONE": "None",
|
||||
"VTLANG_UEFI_RES_LOCK_MAX": "Highest",
|
||||
"VTLANG_UEFI_RES_LOCK_1024_768": "Fixed 1024 x 768",
|
||||
"VTLANG_UEFI_RES_LOCK_BE1024_768": "At least 1024 x 768",
|
||||
|
||||
"MENU_STR_XXX": ""
|
||||
}
|
||||
|
||||
@@ -88,6 +88,12 @@
|
||||
"VTLANG_WIN11_BYPASS_NRO": "Windows 11 ইনস্টল করার সময় অনলাইন অ্যাকাউন্টের প্রয়োজন বাইপাস করুন",
|
||||
"VTLANG_LINUX_REMOUNT": "লিনাক্স বুটের পরে ভেন্টয় পার্টিশনটি মাউন্ট করুন",
|
||||
"VTLANG_SECONDARY_BOOT_MENU": "গৌণ বুট মেনু দেখান",
|
||||
|
||||
"VTLANG_WIN_UEFI_RES_LOCK": "Lock the resolution when UEFI boot Windows/WinPE",
|
||||
"VTLANG_UEFI_RES_LOCK_NONE": "None",
|
||||
"VTLANG_UEFI_RES_LOCK_MAX": "Highest",
|
||||
"VTLANG_UEFI_RES_LOCK_1024_768": "Fixed 1024 x 768",
|
||||
"VTLANG_UEFI_RES_LOCK_BE1024_768": "At least 1024 x 768",
|
||||
|
||||
|
||||
"MENU_STR_XXX": ""
|
||||
}
|
||||
|
||||
@@ -88,6 +88,12 @@
|
||||
"VTLANG_WIN11_BYPASS_NRO": "Obejít požadování online účtu při instalaci Windows 11",
|
||||
"VTLANG_LINUX_REMOUNT": "Připojit Ventoy oddíl po spuštění Linuxu",
|
||||
"VTLANG_SECONDARY_BOOT_MENU": "Zobrazit druhou spouštěcí nabídku",
|
||||
"VTLANG_WIN_UEFI_RES_LOCK": "Lock the resolution when UEFI boot Windows/WinPE",
|
||||
"VTLANG_UEFI_RES_LOCK_NONE": "None",
|
||||
"VTLANG_UEFI_RES_LOCK_MAX": "Highest",
|
||||
"VTLANG_UEFI_RES_LOCK_1024_768": "Fixed 1024 x 768",
|
||||
"VTLANG_UEFI_RES_LOCK_BE1024_768": "At least 1024 x 768",
|
||||
|
||||
|
||||
"MENU_STR_XXX": ""
|
||||
}
|
||||
|
||||
@@ -88,6 +88,12 @@
|
||||
"VTLANG_WIN11_BYPASS_NRO": "Umgehen Sie die Online-Kontoanforderung bei der Installation von Windows 11",
|
||||
"VTLANG_LINUX_REMOUNT": "Mounten Sie die Ventoy-Partition nach dem Booten von Linux",
|
||||
"VTLANG_SECONDARY_BOOT_MENU": "Sekundäres Bootmenü anzeigen",
|
||||
|
||||
"VTLANG_WIN_UEFI_RES_LOCK": "Lock the resolution when UEFI boot Windows/WinPE",
|
||||
"VTLANG_UEFI_RES_LOCK_NONE": "None",
|
||||
"VTLANG_UEFI_RES_LOCK_MAX": "Highest",
|
||||
"VTLANG_UEFI_RES_LOCK_1024_768": "Fixed 1024 x 768",
|
||||
"VTLANG_UEFI_RES_LOCK_BE1024_768": "At least 1024 x 768",
|
||||
|
||||
|
||||
"MENU_STR_XXX": ""
|
||||
}
|
||||
|
||||
@@ -88,6 +88,12 @@
|
||||
"VTLANG_WIN11_BYPASS_NRO": "Παράκαμψη της απαίτησης online λογαριασμού κατά την εγκατάσταση των Windows 11",
|
||||
"VTLANG_LINUX_REMOUNT": "Προσάρτηση διαμερίσματος Ventoy μετά την εκκίνηση του Linux",
|
||||
"VTLANG_SECONDARY_BOOT_MENU": "Εμφάνιση δευτερεύοντος μενού εκκίνησης",
|
||||
|
||||
"VTLANG_WIN_UEFI_RES_LOCK": "Lock the resolution when UEFI boot Windows/WinPE",
|
||||
"VTLANG_UEFI_RES_LOCK_NONE": "None",
|
||||
"VTLANG_UEFI_RES_LOCK_MAX": "Highest",
|
||||
"VTLANG_UEFI_RES_LOCK_1024_768": "Fixed 1024 x 768",
|
||||
"VTLANG_UEFI_RES_LOCK_BE1024_768": "At least 1024 x 768",
|
||||
|
||||
|
||||
"MENU_STR_XXX": ""
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user