22 Commits
Author SHA1 Message Date
ValdikSS 68de91778e Check whether Win 7 bootmgfw.efi exists at all 2022-12-08 23:29:28 +03:00
ValdikSS 8cd1b02b9d Make sure to extract Win 7 bootloader from regular and multi-volume WIM file 2022-12-08 23:28:57 +03:00
ValdikSS 8dd14fc452 Use -e for file check in other places as well, just to be sure 2022-12-08 22:38:17 +03:00
ValdikSS 4abb52133f Fix install.wim existance check and extraction for Windows 7
Three bugs:
* Bash [ -a ] and [ ! -a ] are two different operations: the first checks for file existance, the second is a binary AND operation. Replace it with -e, which is consistent.
* Mount ISO before checking its contents
* Ensure that we extract the latest version of the wim/esd file (7z always replace)

Fixes #35
2022-12-08 22:36:35 +03:00
ValdikSS 964443265f Update Secure Boot status of uefi-ntfs 2022-12-07 01:57:02 +03:00
ValdikSS 6249a7fc98 Filter prohibited characters of ISO label for FAT32 partition label
Fixes #34
2022-12-07 01:44:11 +03:00
ValdikSS 1de605529a Header code style fix 2022-12-07 01:43:44 +03:00
ValdikSS 2a8287455e Merge pull request #31 from hashemim66110/patch-1
Little Appearance Changes: logo and blinking warning
2022-12-07 01:04:52 +03:00
hashemim66110 5aab680e8f Little Appearance Changes
variable Header added to script .
Simple Text Logo Made using figlet tool .
text "WARNING: this program will delete all existing data on your drive!" is changed
so it makes more Attention now (color changed to Red and get Blinking now)

thanks for develop it ValdikSS :) 👍
2022-06-24 17:32:19 +04:30
ValdikSS 9f855faabd Merge branch 'master' of https://github.com/recolic/windows2usb 2022-01-09 18:11:44 +03:00
ValdikSS 905f95ae7b Final fix for wim file size detection 2022-01-09 18:11:34 +03:00
Recolic K 2af0bed0df Document improvement: add feature matrix #23
Squashed commit of the following:

commit c279195a08
Author: Recolic K <bensl@microsoft.com>
Date:   Thu Nov 25 17:50:06 2021 +0800

    doc improvement: add feature matrix

commit 7b0f5d9912
Author: Recolic K <bensl@microsoft.com>
Date:   Thu Nov 25 17:43:26 2021 +0800

    doc improvement: add feature matrix

commit 60d1f7d758
Author: Recolic K <bensl@microsoft.com>
Date:   Thu Nov 25 17:41:52 2021 +0800

    doc improvement: add feature matrix

commit f8d27f725d
Author: Recolic K <bensl@microsoft.com>
Date:   Thu Nov 25 17:39:57 2021 +0800

    doc improvement: add feature matrix

Signed-off-by: ValdikSS <iam@valdikss.org.ru>
2022-01-09 17:36:45 +03:00
ValdikSS bcc7f08832 Fix for 1786bd582d 2022-01-09 17:28:03 +03:00
ValdikSS 0ad90c7ef7 Do not try to split WIM if install.wim is missing 2022-01-09 17:27:55 +03:00
ValdikSS 9361a3cd4b Extract bootmgfw.efi from both .wim and .esd (customized Win7 ISO) 2022-01-09 16:15:38 +03:00
ValdikSS 6fc6f0ad94 Mount FAT32 partitions in UTF-8 mode
Fixes #21
2022-01-09 16:14:46 +03:00
ValdikSS 8354ffdc14 Use C.utf8 locale for customized ISO with non-latin filenames
Fixes #21
2022-01-09 16:14:18 +03:00
ValdikSS 68b616a916 Fix bootmgfw.efi extraction with split wim activated
Fixes #25
2022-01-08 14:15:26 +03:00
ValdikSS fd26a51536 Wait 3 seconds inside format_drive function, not in the caller 2022-01-07 04:14:57 +03:00
ValdikSS 00d4a7ea5a Make mode optional and assume MBR by default 2022-01-07 04:13:55 +03:00
ValdikSS 1786bd582d Wait 1 second for new patition table to apply.
Hopefully fix #24
2022-01-07 04:05:34 +03:00
Recolic ed82962bae Bug fix: MBF-FAT32 mode not working on /dev/loop0
```
 == Writing bootloader ==
/dev/loop0 seems to be a disk partition device,
use the switch -f to force writing of a master boot record
```
2021-11-25 17:25:40 +08:00
2 changed files with 79 additions and 37 deletions
+20 -5
View File
@@ -17,9 +17,9 @@ Features:
Windows 7/8/8.1/10/11 ISO to Flash Drive burning utility
WARNING: this program will delete all existing data on your drive!
windows2usb <device> <windows iso> <mbr/gpt/gptntfs/gpt+uefintfs>
windows2usb <device> <windows iso> [mbr/gpt/gptntfs/gpt+uefintfs]
mbr mode: the most universal, RECOMMENDED method.
mbr mode: the most universal, RECOMMENDED and DEFAULT method.
This mode creates MBR partition table with FAT32 partition,
installs BIOS and UEFI bootloaders, supports Secure Boot.
install.wim file larger than 4 GiB will be split.
@@ -36,7 +36,8 @@ gptntfs mode: all the same as 'gpt' but NTFS is used.
gpt+uefintfs mode: alternative hacky installation method, not recommended.
This mode uses NTFS partition and third-party 'uefintfs' bootloader.
GPT+NTFS(data)+FAT32(efi), UEFI only, NO Secure Boot support.
GPT+NTFS(data)+FAT32(efi), UEFI only, supports Secure Boot
(since uefintfs Oct 23, 2021 release).
Large install.wim file will not be split.
```
@@ -44,12 +45,25 @@ gpt+uefintfs mode: alternative hacky installation method, not recommended.
Download latest [portable AppImage version](https://github.com/ValdikSS/windows2usb/releases) from the **Releases** page, set *execution bit* (`chmod +x windows2usb-*.AppImage`) and run it from the terminal.
`windows2usb <device> <windows iso> <mbr/gpt/gptntfs/gpt+uefintfs>"`
`windows2usb <device> <windows iso>`
For example:
`./windows2usb.AppImage /dev/sdz /home/valdikss/windows10.iso`
The program prints removable storage list if no arguments are supplied.
If you don't want to use AppImage, you'll need to install all dependencies and download [uefi-ntfs.img](https://github.com/pbatard/rufus/tree/master/res/uefi) from Rufus project.
### Feature Matrix
|Modes |Legacy/UEFI-CSM Boot|UEFI Boot|Large ISO (>4GB)|Secure Boot|File System|Part Table|
|:----------:|:------------------:|:-------:|:--------------:|:---------:|:---------:|:--------:|
|mbr(hybrid) |Supported |Supported|Supported |Supported |FAT32 |MBR |
|gpt |No |Supported|Supported |Supported |FAT32 |GPT |
|gptntfs |No |Partial |Supported |Supported |NTFS |GPT |
|gpt+uefintfs|No |Supported|Supported |Supported |NTFS |GPT |
### BIOS Boot
BIOS Boot (Legacy Boot/UEFI-CSM) uses stock Windows 7 MBR and FAT32 bootloader, courtesy of [ms-sys](http://ms-sys.sourceforge.net/) project.
@@ -76,7 +90,7 @@ A special 'gpt+uefintfs' mode uses [uefi-ntfs](https://github.com/pbatard/uefi-n
This mode was included earlier to work with installation disks where install.wim file is greater than 4 GiB, but since then split WIM file functionality was introduced, and now this mode may be considered obsolete.
This mode does not support Secure Boot (uefi-ntfs bootloader is not signed by Microsoft or other trusted party).
uefi-ntfs bootloader is signed by Microsoft since Oct 23, 2021 release and supports Secure Boot.
## Alternatives
@@ -93,3 +107,4 @@ This script uses:
* [**p7zip**](https://www.7-zip.org/) for ISO extraction
* [**autofsync**](https://github.com/i-rinat/autofsync/) to prevent filesystem bufferbloat and properly show copying progress (AppImage only)
* [**wimlib**](https://wimlib.net/) to split large install.wim files to fit FAT32 partition
* [**uefi-ntfs**](https://github.com/pbatard/uefi-ntfs/)
+57 -30
View File
@@ -4,16 +4,29 @@ set -f # noglob
set +o braceexpand # disable braceexpand
shopt -s nocasematch # for "if labeltype"
export LANG=C
export LANG=C.utf8
header='
| __ _____ _ _ ____ _ _ ____ ____ |
| \ \ / /_ _| \ | | |___ \ | | | / ___|| __ ) |
| \ \ /\ / / | || \| | __) | | | | \___ \| _ \ |
| \ V V / | || |\ | / __/ | |_| |___) | |_) | |
| \_/\_/ |___|_| \_(_) |_____| \___/|____/|____/ |
========================================================
. Windows 7+ ISO to Flash Drive burning utility .'
bold="$(tput bold)"
normal="$(tput sgr0)"
blink="$(tput blink)"
red="$(tput setaf 1)"
smso="$(tput smso)"
rmso="$(tput rmso)"
scriptpath="$(readlink -f -- "$0")"
dirpath="$(dirname "$scriptpath")"
function check_requirements() {
local reqs=(awk lsblk 7z mkfs.vfat mkfs.ntfs sfdisk ms-sys mktemp wimsplit)
local reqs=(awk lsblk 7z mkfs.vfat mkfs.ntfs sfdisk ms-sys mktemp wimsplit tr)
for req in ${reqs[*]}; do
if ! command -v "$req" > /dev/null;
@@ -52,6 +65,7 @@ function format_drive() {
if [[ "$1" == "dos" ]] || [[ "$1" == "gpt" ]];
then
echo "label: $1" | sfdisk "$2"
sleep 3
else
echo "${bold} == format_drive: INTERNAL ERROR ==${normal}"
exit 101
@@ -62,8 +76,14 @@ function get_iso_name() {
7z l "$1" | awk '/Comment = / {print $3; exit 0}'
}
function sanitize_iso_name() {
# FAT32 does not allow certain characters in names, see
# https://github.com/dosfstools/dosfstools/blob/1da41f0e70dcbfb874e8191c639b91fa58205ea4/src/fatlabel.c#L96
echo "$1" | tr -d '*?.,;:/\\|+=<>[]"'
}
function check_installwim_gt4gib() {
7z l "$1" | awk '($6 ~ /install.wim/) {if ($4 > 4294967296) {exit 0}; exit 1}'
7z l "$1" | awk 'BEGIN {doend=1} ($6 ~ /install.wim/) {if ($4 > 4294967296) {doend=0; exit 0}; doend=0; exit 1} END {if (doend) {exit 1}}'
}
function create_partitions() {
@@ -94,6 +114,9 @@ function create_partitions() {
echo "${bold} == create_partitions: INTERNAL ERROR ==${normal}"
exit 102
fi
# Wait 1 second to settle new partition table
# See bug #24
sleep 1
}
function get_dev_partition_num() {
@@ -117,9 +140,9 @@ function get_dev_partition_num() {
}
function write_uefintfs() {
if [ -a "$dirpath/uefi-ntfs.img" ]; then
if [ -e "$dirpath/uefi-ntfs.img" ]; then
cat "$dirpath/uefi-ntfs.img" > "$1"
elif [ -a "/usr/share/windows2usb/uefi-ntfs.img" ]; then
elif [ -e "/usr/share/windows2usb/uefi-ntfs.img" ]; then
cat "/usr/share/windows2usb/uefi-ntfs.img" > "$1"
fi
}
@@ -147,10 +170,16 @@ function split_wim() {
}
function extract_bootmgfw_from_installwim() {
# $1 - install.wim path
# $2 - destdir
# $1 - isopath
# $2 - isomountpath
# $3 - destdir
7z e "$1" -o"$2" 1/Windows/Boot/EFI/bootmgfw.efi
mount -o ro "$1" "$2"
local fpath="$2/sources/install.wim"
[ ! -e "$fpath" ] && fpath="$2/sources/install.esd"
7z e "$fpath" -aoa -o"$3/efi/boot/" 'Windows/Boot/EFI/bootmgfw.efi' '?/Windows/Boot/EFI/bootmgfw.efi'
umount "$2"
}
function umount_rm_path() {
@@ -169,14 +198,14 @@ function sigint_handler() {
umount_rm_path "$partpath" "$isomountpath"
}
if [[ ! "$3" ]];
if [[ ! "$2" ]];
then
echo "${bold}Windows 7/8/8.1/10/11 ISO to Flash Drive burning utility"
echo "WARNING: this program will delete all existing data on your drive!${normal}"
echo "${bold}${smso}${header}${rmso}"
echo "${blink}${red}WARNING: this program will delete all existing data on your drive!${normal}"
echo
echo "$(basename "$0")" "<device> <windows iso> <mbr/gpt/gptntfs/gpt+uefintfs>"
echo "$(basename "$0")" "<device> <windows iso> [mbr/gpt/gptntfs/gpt+uefintfs]"
echo
echo "mbr mode: the most universal, RECOMMENDED method."
echo "mbr mode: the most universal, RECOMMENDED and DEFAULT method."
echo " This mode creates MBR partition table with FAT32 partition,"
echo " installs BIOS and UEFI bootloaders, supports Secure Boot."
echo " install.wim file larger than 4 GiB will be split."
@@ -193,7 +222,8 @@ then
echo
echo "gpt+uefintfs mode: alternative hacky installation method, not recommended."
echo " This mode uses NTFS partition and third-party 'uefintfs' bootloader."
echo " GPT+NTFS(data)+FAT32(efi), UEFI only, NO Secure Boot support."
echo " GPT+NTFS(data)+FAT32(efi), UEFI only, supports Secure Boot"
echo " (since uefintfs Oct 23, 2021 release)."
echo " Large install.wim file will not be split."
echo
echo "${bold} == Removable storage list ==${normal}"
@@ -208,6 +238,7 @@ then
isopath="$2"
isolabel=""
labeltype="$3"
[[ ! "$labeltype" ]] && labeltype="mbr"
mountntfs_cmd="mount.ntfs-3g"
if ! command -v "$mountntfs_cmd" > /dev/null;
then
@@ -233,38 +264,36 @@ then
# MBR FAT32
if [[ "$labeltype" == "mbr" ]];
then
isolabel="$(sanitize_iso_name "$isolabel")"
echo "${bold} == Creating new MBR-formatted partition table ==${normal}"
format_drive "dos" "$dev"
echo "${bold} == Waiting 3 seconds to settle new partition layout ==${normal}"
sleep 3
echo "${bold} == Creating FAT partition ==${normal}"
create_partitions "dos" "$dev"
mkfs.vfat -n "${isolabel:0:11}" "$(get_dev_partition_num "${dev}" "1")"
echo "${bold} == Writing bootloader ==${normal}"
ms-sys -7 "${dev}"
ms-sys -7 -f "${dev}"
ms-sys -e "$(get_dev_partition_num "${dev}" "1")"
echo "${bold} == Mounting data partition ==${normal}"
mount "$(get_dev_partition_num "${dev}" "1")" "$partpath"
mount -o utf8=true "$(get_dev_partition_num "${dev}" "1")" "$partpath"
# GPT FAT32
elif [[ "$labeltype" == "gpt" ]];
then
isolabel="$(sanitize_iso_name "$isolabel")"
echo "${bold} == Creating new GPT-formatted partition table ==${normal}"
format_drive "gpt" "$dev"
echo "${bold} == Waiting 3 seconds to settle new partition layout ==${normal}"
sleep 3
echo "${bold} == Creating FAT partition ==${normal}"
create_partitions "gpt" "$dev"
mkfs.vfat -n "${isolabel:0:11}" "$(get_dev_partition_num "${dev}" "1")"
echo "${bold} == Mounting data partition ==${normal}"
mount "$(get_dev_partition_num "${dev}" "1")" "$partpath"
mount -o utf8=true "$(get_dev_partition_num "${dev}" "1")" "$partpath"
# GPT NTFS
elif [[ "$labeltype" == "gptntfs" ]];
@@ -274,9 +303,6 @@ then
echo "${bold} == Creating new GPT-formatted partition table ==${normal}"
format_drive "gpt" "$dev"
echo "${bold} == Waiting 3 seconds to settle new partition layout ==${normal}"
sleep 3
echo "${bold} == Creating Microsoft NTFS partition ==${normal}"
create_partitions "gptntfs" "$dev"
mkfs.ntfs -L "$isolabel" -f "$(get_dev_partition_num "${dev}" "1")"
@@ -292,9 +318,6 @@ then
echo "${bold} == Creating new GPT-formatted partition table ==${normal}"
format_drive "gpt" "$dev"
echo "${bold} == Waiting 3 seconds to settle new partition layout ==${normal}"
sleep 3
echo "${bold} == Creating UEFI FAT and Microsoft NTFS partitions ==${normal}"
create_partitions "gpt+uefintfs" "$dev"
write_uefintfs "$(get_dev_partition_num "${dev}" "1")"
@@ -325,9 +348,13 @@ then
then
echo "${bold} == Extracting UEFI bootloader from install.wim ==${normal}"
mkdir -p "$partpath/efi/boot/" || true
extract_bootmgfw_from_installwim "$partpath/sources/install.wim" "$partpath/efi/boot/"
extract_bootmgfw_from_installwim "$isopath" "$isomountpath" "$partpath"
if [ -e "$partpath/efi/boot/bootmgfw.efi" ]; then
mv "$partpath/efi/boot/bootmgfw.efi" "$partpath/efi/boot/bootx64.efi"
cp "$partpath/efi/boot/bootx64.efi" "$partpath/efi/boot/bootia32.efi"
else
echo "NOTE: your ISO file does not have UEFI bootloader, UEFI boot would be unavailable!"
fi
fi
echo "${bold} == Unmounting partition ==${normal}"