From d7c5d1683566d472db05d3c56c5a6418f961fbb5 Mon Sep 17 00:00:00 2001 From: mkuba50 Date: Sun, 23 Dec 2018 22:26:44 +0100 Subject: [PATCH] Initial commit --- LICENSE | 21 +++ convert.sh | 450 +++++++++++++++++++++++++++++++++++++++++++++++++++++ readme.md | 40 +++++ 3 files changed, 511 insertions(+) create mode 100644 LICENSE create mode 100644 convert.sh create mode 100644 readme.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..be5edd5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 UUP dump authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/convert.sh b/convert.sh new file mode 100644 index 0000000..ede0c15 --- /dev/null +++ b/convert.sh @@ -0,0 +1,450 @@ +#!/bin/bash +scriptName="UUP Converter v0.1.0" + +editions="analogonecore +andromeda +cloude +clouden +core +corecountryspecific +coren +coresinglelanguage +coresystemserver +education +educationn +enterprise +enterpriseeval +enterpriseg +enterprisegn +enterprisen +enterpriseneval +enterprises +enterpriseseval +enterprisesn +enterprisesneval +iotuap +onecoreupdateos +professional +professionalcountryspecific +professionaleducation +professionaleducationn +professionaln +professionalsinglelanguage +professionalworkstation +professionalworkstationn +serverarm64 +serverarm64core +serverazurecor +serverazurecorcore +serverazurenano +serverazurenanocore +servercloudstorage +servercloudstoragecore +serverdatacenter +serverdatacenteracor +serverdatacenteracorcore +serverdatacentercor +serverdatacentercorcore +serverdatacentercore +serverdatacentereval +serverdatacenterevalcor +serverdatacenterevalcorcore +serverdatacenterevalcore +serverdatacenternano +serverdatacenternanocore +serverhypercore +serverrdsh +serverrdshcore +serversolution +serversolutioncore +serverstandard +serverstandardacor +serverstandardacorcore +serverstandardcor +serverstandardcorcore +serverstandardcore +serverstandardeval +serverstandardevalcor +serverstandardevalcorcore +serverstandardevalcore +serverstandardnano +serverstandardnanocore +serverstoragestandard +serverstoragestandardcore +serverstoragestandardeval +serverstoragestandardevalcore +serverstorageworkgroup +serverstorageworkgroupcore +serverstorageworkgroupeval +serverstorageworkgroupevalcore +serverweb +serverwebcore +starter +startern" + +bootSourcesList="sources/alert.gif +sources/api-ms-win-core-apiquery-l1-1-0.dll +sources/api-ms-win-downlevel-advapi32-l1-1-0.dll +sources/api-ms-win-downlevel-advapi32-l1-1-1.dll +sources/api-ms-win-downlevel-advapi32-l2-1-0.dll +sources/api-ms-win-downlevel-advapi32-l2-1-1.dll +sources/api-ms-win-downlevel-advapi32-l3-1-0.dll +sources/api-ms-win-downlevel-advapi32-l4-1-0.dll +sources/api-ms-win-downlevel-kernel32-l1-1-0.dll +sources/api-ms-win-downlevel-kernel32-l2-1-0.dll +sources/api-ms-win-downlevel-ole32-l1-1-0.dll +sources/api-ms-win-downlevel-ole32-l1-1-1.dll +sources/api-ms-win-downlevel-shlwapi-l1-1-0.dll +sources/api-ms-win-downlevel-shlwapi-l1-1-1.dll +sources/api-ms-win-downlevel-user32-l1-1-0.dll +sources/api-ms-win-downlevel-user32-l1-1-1.dll +sources/api-ms-win-downlevel-version-l1-1-0.dll +sources/appcompat.xsl +sources/appcompat_bidi.xsl +sources/appcompat_detailed_bidi_txt.xsl +sources/appcompat_detailed_txt.xsl +sources/appraiser.dll +sources/ARUNIMG.dll +sources/arunres.dll +sources/autorun.dll +sources/cmisetup.dll +sources/compatctrl.dll +sources/compatprovider.dll +sources/cryptosetup.dll +sources/diager.dll +sources/diagnostic.dll +sources/diagtrack.dll +sources/diagtrackrunner.exe +sources/dism.exe +sources/dismapi.dll +sources/dismcore.dll +sources/dismcoreps.dll +sources/dismprov.dll +sources/ext-ms-win-advapi32-encryptedfile-l1-1-0.dll +sources/folderprovider.dll +sources/hwcompat.dll +sources/hwcompat.txt +sources/hwexclude.txt +sources/idwbinfo.txt +sources/imagingprovider.dll +sources/inf/setup.cfg +sources/input.dll +sources/lang.ini +sources/locale.nls +sources/logprovider.dll +sources/MediaSetupUIMgr.dll +sources/ndiscompl.dll +sources/nlsbres.dll +sources/ntdsupg.dll +sources/offline.xml +sources/pnpibs.dll +sources/reagent.admx +sources/reagent.dll +sources/reagent.xml +sources/rollback.exe +sources/schema.dat +sources/segoeui.ttf +sources/setup.exe +sources/setupcompat.dll +sources/SetupCore.dll +sources/SetupHost.exe +sources/SetupMgr.dll +sources/SetupPlatform.cfg +sources/SetupPlatform.dll +sources/SetupPlatform.exe +sources/SetupPrep.exe +sources/SmiEngine.dll +sources/spflvrnt.dll +sources/spprgrss.dll +sources/spwizeng.dll +sources/spwizimg.dll +sources/spwizres.dll +sources/sqmapi.dll +sources/testplugin.dll +sources/unattend.dll +sources/unbcl.dll +sources/upgloader.dll +sources/upgrade_frmwrk.xml +sources/uxlib.dll +sources/uxlibres.dll +sources/vhdprovider.dll +sources/w32uiimg.dll +sources/w32uires.dll +sources/warning.gif +sources/wdsclient.dll +sources/wdsclientapi.dll +sources/wdscore.dll +sources/wdscsl.dll +sources/wdsimage.dll +sources/wdstptc.dll +sources/wdsutil.dll +sources/wimprovider.dll +sources/win32ui.dll +sources/WinDlp.dll +sources/winsetup.dll +sources/wpx.dll +sources/xmllite.dll +sources/..-.*/appraiser.dll.mui +sources/..-.*/arunres.dll.mui +sources/..-.*/cmisetup.dll.mui +sources/..-.*/compatctrl.dll.mui +sources/..-.*/compatprovider.dll.mui +sources/..-.*/dism.exe.mui +sources/..-.*/dismapi.dll.mui +sources/..-.*/dismcore.dll.mui +sources/..-.*/dismprov.dll.mui +sources/..-.*/folderprovider.dll.mui +sources/..-.*/imagingprovider.dll.mui +sources/..-.*/input.dll.mui +sources/..-.*/logprovider.dll.mui +sources/..-.*/MediaSetupUIMgr.dll.mui +sources/..-.*/nlsbres.dll.mui +sources/..-.*/pnpibs.dll.mui +sources/..-.*/reagent.adml +sources/..-.*/reagent.dll.mui +sources/..-.*/rollback.exe.mui +sources/..-.*/setup.exe.mui +sources/..-.*/setupcompat.dll.mui +sources/..-.*/SetupCore.dll.mui +sources/..-.*/setupplatform.exe.mui +sources/..-.*/SetupPrep.exe.mui +sources/..-.*/setup_help_upgrade_or_custom.rtf +sources/..-.*/smiengine.dll.mui +sources/..-.*/spwizres.dll.mui +sources/..-.*/upgloader.dll.mui +sources/..-.*/uxlibres.dll.mui +sources/..-.*/vhdprovider.dll.mui +sources/..-.*/vofflps.rtf +sources/..-.*/vofflps_server.rtf +sources/..-.*/w32uires.dll.mui +sources/..-.*/wdsclient.dll.mui +sources/..-.*/wdsimage.dll.mui +sources/..-.*/wimprovider.dll.mui +sources/..-.*/WinDlp.dll.mui +sources/..-.*/winsetup.dll.mui" + +infoColor="\033[1;94m" +errorColor="\033[1;91m" +resetColor="\033[0m" + +if [ "$1" == "-?" -o "$1" == "--help" -o "$1" == "-h" ]; then + echo "Usage:" + echo "$0 [compression] [uups_directory]" + echo "" + echo "Compression options:" + echo "wim - standard compression" + echo "esd - solid compression" + exit +fi + +if ! which cabextract >/dev/null \ +|| ! which wimlib-imagex >/dev/null \ +|| ! which chntpw >/dev/null \ +|| ! which genisoimage >/dev/null; then + echo "One of required applications is not installed." + echo "The following applications need to be installed to use this script:" + echo " - cabextract" + echo " - wimlib-imagex" + echo " - chntpw" + echo " - genisoimage" + echo "" + echo "If you use Debian or Ubuntu you can install these using:" + echo "sudo apt-get install cabextract wimtools chntpw genisoimage" + exit 1 +fi + +if ! [ -z $1 ]; then + type="$1" +else + type="wim" +fi + +if ! [ "$type" == "wim" -o "$type" == "esd" ]; then + echo -e "$errorColor""Incorrect compression type.""$resetColor" + echo "Possible options: wim, esd" + exit 1 +fi + +if ! [ -z $2 ]; then + uupDir="$2" +else + uupDir="UUPs" +fi + +if ! [ -d "$uupDir" ]; then + echo -e "$errorColor""Specified directory containing UUP files does not exist!""$resetColor" + exit 1 +fi + +if [ "$type" == "esd" ]; then + compressParam="--solid" +else + compressParam="--compress=maximum" + type="wim" +fi + +function cleanup() { + rm -rf ISODIR + rm -rf "$tempDir" +} + +if [ -e ISODIR ]; then + rm -rf ISODIR +fi + +list= +for i in $editions; do + list="$list -ie \"$i""_..-.*.esd\"" +done + +metadataFiles=$(find "$uupDir" 2>/dev/null | eval grep $list) +if [ $? != 0 ]; then + echo -e "$errorColor""No metadata ESDs found.""$resetColor" + exit 1 +fi + +list= + +lang=$(echo "$metadataFiles" | grep _..-.*.esd | head -1 | sed 's/.*_//g;s/.esd//g') +metadataFiles=$(echo "$metadataFiles" | grep "$lang" | sort | uniq) +firstMetadata=$(echo "$metadataFiles" | head -1) + +tempDir=`mktemp -d` +extractDir="$tempDir/extract" + +echo -e "\033[1m$scriptName\033[0m" + +for file in `find "$uupDir" -type f -name "*.cab"`; do + fileName=`basename $file .cab` + echo -e "$infoColor""CAB -> ESD:""$resetColor"" $fileName" + + mkdir "$extractDir" + cabextract -d "$extractDir" "$file" >/dev/null 2>/dev/null + if [ $? != 0 ]; then + echo -e -e "$errorColor""Failed to extract $fileName.cab""$resetColor" + cleanup + exit 1 + fi + + wimlib-imagex capture "$extractDir" "$tempDir/$fileName.esd" >/dev/null + if [ $? != 0 ]; then + echo -e "$errorColor""Failed to create $fileName.esd""$resetColor" + cleanup + exit 1 + fi + + rm -rf "$extractDir" +done + +fileName= +file= +extractDir= + +export WIMLIB_IMAGEX_IGNORE_CASE=1 +mkdir ISODIR + +echo "" +echo -e "$infoColor""Creating ISO structure...""$resetColor" +wimlib-imagex apply "$firstMetadata" 1 ISODIR --no-acls 2>/dev/null +if [ $? != 0 ]; then + echo -e "$errorColor""Failed to create ISODIR structure""$resetColor" + cleanup + exit 1 +fi + +echo "" +echo -e "$infoColor""Exporting winre.wim...""$resetColor" +wimlib-imagex export "$firstMetadata" 2 "$tempDir/winre.wim" --compress=maximum --boot +if [ $? != 0 ]; then + echo -e "$errorColor""Failed to export winre.wim""$resetColor" + cleanup + exit 1 +fi + +echo "" +echo -e "$infoColor""Creating boot.wim...""$resetColor" +cp "$tempDir/winre.wim" ISODIR/sources/boot.wim +wimlib-imagex info ISODIR/sources/boot.wim 1 "Microsoft Windows PE" --image-property FLAGS=9 >/dev/null + +wimlib-imagex extract ISODIR/sources/boot.wim 1 --dest-dir="$tempDir" "/Windows/System32/config/SOFTWARE" --no-acls >/dev/null +if [ $? != 0 ]; then + echo -e "$errorColor""Failed to extract registry""$resetColor" + cleanup + exit 1 +fi + +echo -e "cd Microsoft\\Windows NT\\CurrentVersion\nnv 1 SystemRoot\ned SystemRoot\nX:\\\$Windows.~bt\\Windows\ncd WinPE\nnv 1 InstRoot\ned InstRoot\nX:\\\$Windows.~bt\nq\ny\n" | chntpw -e "$tempDir/SOFTWARE" >/dev/null +wimlib-imagex update ISODIR/sources/boot.wim 1 --command "add $tempDir/SOFTWARE /Windows/System32/config/SOFTWARE" >/dev/null +wimlib-imagex update ISODIR/sources/boot.wim 1 --command "delete /Windows/System32/winpeshl.ini" >/dev/null + +wimlib-imagex export "$tempDir/winre.wim" 1 ISODIR/sources/boot.wim "Microsoft Windows Setup" +if [ $? != 0 ]; then + echo -e "$errorColor""Failed to create second index of boot.wim""$resetColor" + cleanup + exit 1 +fi + +wimlib-imagex extract "$firstMetadata" 3 "/Windows/System32/xmllite.dll" --no-acls --dest-dir="ISODIR/sources" >/dev/null +wimlib-imagex info ISODIR/sources/boot.wim 2 --image-property FLAGS=2 >/dev/null +wimlib-imagex info ISODIR/sources/boot.wim 2 --boot >/dev/null + +list= +for i in $bootSourcesList; do + list="$list -oie \"$i\"" +done + +files=$(find ISODIR -regex ".*/sources/.*" | eval grep $list) +list= + +echo "delete /Windows/System32/winpeshl.ini" >"$tempDir/update.txt" +echo "add ISODIR/setup.exe /setup.exe" >>"$tempDir/update.txt" +echo "add ISODIR/sources/background_cli.bmp /sources/background.bmp" >>"$tempDir/update.txt" +for i in $files; do + echo "add ISODIR/$i /$i" >>"$tempDir/update.txt" +done + +wimlib-imagex update ISODIR/sources/boot.wim 2 <"$tempDir/update.txt" >/dev/null +if [ $? != 0 ]; then + echo -e "$errorColor""Failed add required files to second index of boot.wim""$resetColor" + cleanup + exit 1 +fi + +wimlib-imagex optimize ISODIR/sources/boot.wim +rm "ISODIR/sources/xmllite.dll" + +echo "" +echo -e "$infoColor""Creating install.$type...""$resetColor" +for metadata in $metadataFiles; do + metadataName=`basename $metadata .esd` + echo -e "$infoColor""Exporting $metadataName...""$resetColor" + wimlib-imagex export "$metadata" 3 ISODIR/sources/install.$type "$metadataName" $compressParam --ref="$uupDir/*.esd" --ref "$tempDir/*.esd" + if [ $? != 0 ]; then + echo -e "$errorColor""Failed export index to install.$type""$resetColor" + cleanup + exit 1 + fi + + echo "" + echo -e "$infoColor""Adding winre.wim for $metadataName...""$resetColor" + wimlib-imagex update ISODIR/sources/install.$type 1 --command "add $tempDir/winre.wim /Windows/System32/Recovery/winre.wim" + echo "" +done + +info=`wimlib-imagex info "$firstMetadata" 3` +major=`echo "$info" | grep -i "^Major Version:" | sed "s/.* //g"` +minor=`echo "$info" | grep -i "^Minor Version:" | sed "s/.* //g"` +build=`echo "$info" | grep -i "^Build:" | sed "s/.* //g"` +spbuild=`echo "$info" | grep -i "^Service Pack Build:" | sed "s/.* //g"` +label="$major.$minor.$build.$spbuild""_$lang" + +echo -e "$infoColor""Creating ISO image...""$resetColor" +genisoimage -b "boot/etfsboot.com" --no-emul-boot --eltorito-alt-boot -e "efi/microsoft/boot/efisys.bin" --no-emul-boot --udf --hide "*" -V "$label" -o "$label.iso" ISODIR +if [ $? != 0 ]; then + echo -e "$errorColor""Failed to create ISO""$resetColor" + cleanup + exit 1 +fi + +cleanup +echo -e "\033[1;92mDone.""$resetColor" diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..172c1e6 --- /dev/null +++ b/readme.md @@ -0,0 +1,40 @@ +UUP converter +------------- + +### Description +A basic UUP converter aimed for Linux users who don't have access to any +Windows machine, but want or need to create ISO image for latest Windows +Insider version downloaded from UUP dump. + +### Usage +``` +./convert.sh [compression] [uups_directory] +``` + +###### Compression options: + * wim - standard compression + * esd - solid compression + +### Usage examples + * `./convert.sh` - starts conversion using files from UUPs directory and + creates ISO image with install.wim + + * `./convert.sh esd` - starts conversion using files from UUPs directory and + creates ISO image with install.esd + + * `./convert.sh wim MyUUP` - starts conversion using files from MyUUP + directory and creates ISO image with install.wim + +### Requirements +This script uses the following commands to do its work: + * cabextract - to extract cabs + * wimlib-imagex - to export files from metadata ESD + * chntpw - to modify registry of first index boot.wim + * genisoimage - to create ISO image + +If you use Debian or Ubuntu you can quickly install these using the following +command: + +``` +sudo apt-get install cabextract wimtools chntpw genisoimage +```