You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
381 lines
12 KiB
381 lines
12 KiB
@setlocal DisableDelayedExpansion |
|
@set uivr=v0.4 |
|
@echo off |
|
:: Change to 0 to skip adding SSU to the msu file |
|
set IncludeSSU=1 |
|
|
|
set _Debug=0 |
|
|
|
set "_cmdf=%~f0" |
|
if exist "%SystemRoot%\Sysnative\cmd.exe" ( |
|
setlocal EnableDelayedExpansion |
|
start %SystemRoot%\Sysnative\cmd.exe /c ""!_cmdf!" %*" |
|
exit /b |
|
) |
|
if exist "%SystemRoot%\SysArm32\cmd.exe" if /i %PROCESSOR_ARCHITECTURE%==AMD64 ( |
|
setlocal EnableDelayedExpansion |
|
start %SystemRoot%\SysArm32\cmd.exe /c ""!_cmdf!" %*" |
|
exit /b |
|
) |
|
set _dpx=0 |
|
set _exd=0 |
|
set _fail=0 |
|
set DD64create=0 |
|
set DD86create=0 |
|
set "sdl=dpx.dll ReserveManager.dll TurboStack.dll UpdateAgent.dll UpdateCompression.dll wcp.dll" |
|
set "onf=onepackage.AggregatedMetadata.cab" |
|
set "_Null=1>nul 2>nul" |
|
set "_err===== ERROR ====" |
|
set "_ntc===== NOTICE ====" |
|
set "_repo=" |
|
set "_args=" |
|
set "_args=%~1" |
|
if not defined _args goto :NoProgArgs |
|
if "%~1"=="" set "_args="&goto :NoProgArgs |
|
|
|
:NoProgArgs |
|
set "SysPath=%SystemRoot%\System32" |
|
set "Path=%SystemRoot%\System32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SystemRoot%\System32\WindowsPowerShell\v1.0\" |
|
if exist "%SystemRoot%\Sysnative\reg.exe" ( |
|
set "SysPath=%SystemRoot%\Sysnative" |
|
set "Path=%SystemRoot%\Sysnative;%SystemRoot%;%SystemRoot%\Sysnative\Wbem;%SystemRoot%\Sysnative\WindowsPowerShell\v1.0\;%Path%" |
|
) |
|
set "xBT=x64" |
|
if /i "%PROCESSOR_ARCHITECTURE%"=="arm64" set "xBT=x86" |
|
if /i "%PROCESSOR_ARCHITECTURE%"=="x86" if "%PROCESSOR_ARCHITEW6432%"=="" set "xBT=x86" |
|
if /i "%PROCESSOR_ARCHITEW6432%"=="amd64" set "xBT=x64" |
|
if /i "%PROCESSOR_ARCHITEW6432%"=="arm64" set "xBT=x86" |
|
set "_log=%~dpn0" |
|
set "_work=%~dp0" |
|
set "_work=%_work:~0,-1%" |
|
set "_temp=%TEMP%" |
|
for /f "skip=2 tokens=2*" %%a in ('reg.exe query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do call set "_dsk=%%b" |
|
if exist "%PUBLIC%\Desktop\desktop.ini" set "_dsk=%PUBLIC%\Desktop" |
|
setlocal EnableDelayedExpansion |
|
|
|
if defined _args goto :chkarg |
|
if not exist "!_work!\*.AggregatedMetadata*.cab" (goto :continue |
|
) else if not exist "!_work!\Windows1*-KB*.psf" (goto :continue |
|
) |
|
if not exist "!_work!\Windows1*-KB*.cab" if not exist "!_work!\Windows1*-KB*.wim" goto :continue |
|
if exist "!_work!\*DesktopDeployment*.cab" set "_repo=!_work!" |
|
if exist "!_work!\SSU-*-*.cab" set "_repo=!_work!" |
|
if not defined _repo goto :continue |
|
if exist "!_work!\Windows1*-KB*.cab" (set xmf=cab |
|
) else if exist "!_work!\Windows1*-KB*.wim" (set xmf=wim |
|
) |
|
goto :continue |
|
|
|
:chkarg |
|
if not exist "!_args!\*.AggregatedMetadata*.cab" (goto :continue |
|
) else if not exist "!_args!\Windows1*-KB*.psf" (goto :continue |
|
) |
|
if not exist "!_args!\Windows1*-KB*.cab" if not exist "!_args!\Windows1*-KB*.wim" goto :continue |
|
if exist "!_args!\*DesktopDeployment*.cab" set "_repo=!_args!" |
|
if exist "!_args!\SSU-*-*.cab" set "_repo=!_args!" |
|
if not defined _repo goto :continue |
|
if exist "!_args!\Windows1*-KB*.cab" (set xmf=cab |
|
) else if exist "!_args!\Windows1*-KB*.wim" (set xmf=wim |
|
) |
|
goto :continue |
|
|
|
:continue |
|
if %_Debug% equ 0 ( |
|
set "_Nul1=1>nul" |
|
set "_Nul2=2>nul" |
|
set "_Nul6=2^>nul" |
|
set "_Nul3=1>nul 2>nul" |
|
set "_Pause=pause >nul" |
|
set "_Exit=echo Press any key to exit." |
|
set "_Supp=" |
|
goto :Begin |
|
) |
|
set "_Nul1=" |
|
set "_Nul2=" |
|
set "_Nul6=" |
|
set "_Nul3=" |
|
set "_Pause=rem." |
|
set "_Exit=rem." |
|
set "_Supp=1>nul" |
|
copy /y nul "!_work!\#.rw" %_Null% && (if exist "!_work!\#.rw" del /f /q "!_work!\#.rw") || (set "_log=!_dsk!\%~n0") |
|
echo. |
|
echo Running in Debug Mode... |
|
echo The window will be closed when finished |
|
@echo on |
|
@prompt $G |
|
@call :Begin >"!_log!_tmp.log" 2>&1 &cmd /u /c type "!_log!_tmp.log">"!_log!_Debug.log"&del "!_log!_tmp.log" |
|
@color 07 |
|
@title %ComSpec% |
|
@exit /b |
|
|
|
:Begin |
|
title PSFXv2 MSU Maker %uivr% |
|
if %_Debug% equ 0 if not defined _args @cls |
|
if not defined _repo goto :N_PT |
|
if %xmf%==wim if not exist "!_work!\bin\imagex_%xBT%.exe" goto :E_Bin |
|
pushd "!_repo!" |
|
for /f "delims=" %%# in ('dir /b /a:-d "*.AggregatedMetadata*.cab"') do set "metaf=%%#" |
|
if /i "%metaf%"=="%onf%" ( |
|
ren "%metaf%" "org_%metaf%" |
|
set "metaf=org_%metaf%" |
|
) |
|
if %xmf%==cab ( |
|
expand.exe -f:LCUCompDB*.xml.cab "%metaf%" . %_Null% |
|
if not exist "LCUCompDB*.xml.cab" goto :E_DB |
|
) |
|
if %xmf%==wim ( |
|
if exist "_tMSU\" rmdir /s /q "_tMSU\" %_Nul3% |
|
mkdir "_tMSU" |
|
expand.exe -f:*.AggregatedMetadata*.cab "%metaf%" "_tMSU" %_Null% |
|
if not exist "_tMSU\*.AggregatedMetadata*.cab" goto :E_DB |
|
for /f %%# in ('dir /b /a:-d "_tMSU\*.AggregatedMetadata*.cab"') do expand.exe -f:*.xml "_tMSU\%%#" "_tMSU" %_Null% |
|
if not exist "_tMSU\LCUCompDB*.xml" goto :E_DB |
|
for /f %%# in ('dir /b /a:-d "_tMSU\LCUCompDB*.xml"') do ( |
|
%_Null% makecab.exe /D Compress=ON /D CompressionType=MSZIP "_tMSU\%%~n#.xml" "_tMSU\%%~n#.xml.cab" |
|
) |
|
if exist "_tMSU\SSUCompDB*.xml" for /f %%# in ('dir /b /a:-d "_tMSU\SSUCompDB*.xml"') do ( |
|
%_Null% makecab.exe /D Compress=ON /D CompressionType=MSZIP "_tMSU\%%~n#.xml" "_tMSU\%%~n#.xml.cab" |
|
) |
|
if not exist "_tMSU\LCUCompDB*.xml.cab" (echo makecab.exe LCUCompDB failed&goto :TheEnd) |
|
del /f /q "_tMSU\*.AggregatedMetadata*.cab" %_Nul3% |
|
copy /y "_tMSU\*.cab" . %_Nul3% |
|
rmdir /s /q "_tMSU\" %_Nul3% |
|
) |
|
for /f %%# in ('dir /b /a:-d "LCUCompDB*.xml.cab"') do set "dblcu=%%#" |
|
for /f "tokens=2 delims=_." %%# in ('echo %dblcu%') do set "kbn=%%#" |
|
if not exist "Windows1*%kbn%*.%xmf%" set xtn=%xmf%&goto :E_KB |
|
if not exist "Windows1*%kbn%*.psf" set xtn=psf&goto :E_KB |
|
for /f "tokens=3 delims=-_" %%# in ('dir /b /a:-d "Windows1*%kbn%*.psf"') do set "bit=%%~n#" |
|
if exist "Windows1*%kbn%*%bit%*.msu" goto :N_MS |
|
for /f "delims=" %%# in ('dir /b /a:-d "Windows1*%kbn%*%bit%*.%xmf%"') do set "_sCAB=%%#" |
|
for /f "delims=" %%# in ('dir /b /a:-d "Windows1*%kbn%*%bit%*.psf"') do set "_sPSF=%%#" |
|
set "kbf=Windows10.0-%kbn%-%bit%" |
|
if /i "%_sCAB:~0,10%"=="Windows11." set "kbf=Windows11.0-%kbn%-%bit%" |
|
if /i "%_sCAB:~0,10%"=="Windows12." set "kbf=Windows12.0-%kbn%-%bit%" |
|
if exist "SSU-*%bit%*.cab" ( |
|
for /f "tokens=2 delims=-" %%# in ('dir /b /a:-d "SSU-*%bit%*.cab"') do set "suf=SSU-%%#-%bit%.cab" |
|
for /f "delims=" %%# in ('dir /b /a:-d "SSU-*%bit%*.cab"') do set "_sSSU=%%#" |
|
) else ( |
|
set IncludeSSU=0 |
|
) |
|
if %IncludeSSU% equ 1 if not exist "SSUCompDB*.xml.cab" ( |
|
expand.exe -f:SSUCompDB*.xml.cab "%metaf%" . %_Null% |
|
if exist "SSU*-express.xml.cab" del /f /q "SSU*-express.xml.cab" |
|
) |
|
if exist "SSUCompDB*.xml.cab" (for /f %%# in ('dir /b /a:-d "SSUCompDB*.xml.cab"') do set "dbssu=%%#") else (set IncludeSSU=0) |
|
set "_sDDD=DesktopDeployment_x86.cab" |
|
if exist "*DesktopDeployment*.cab" ( |
|
for /f "delims=" %%# in ('dir /b /a:-d "*DesktopDeployment*.cab" ^|find /i /v "%_sDDD%"') do set "_sDDC=%%#" |
|
) |
|
if exist "%SysPath%\ucrtbase.dll" call :dodpx |
|
if not defined _sDDC ( |
|
call set "_sDDC=DesktopDeployment.cab" |
|
call :DDCAB |
|
) |
|
if %_fail% equ 1 goto :TheEnd |
|
if defined suf if /i not %bit%==x86 if not exist "%_sDDD%" call :DDC86 |
|
call :DDF %onf% |
|
(echo "%dblcu%" |
|
if %IncludeSSU% equ 1 echo "%dbssu%" |
|
)>>zzz.ddf |
|
%_Null% makecab.exe /F zzz.ddf /D Compress=ON /D CompressionType=MSZIP |
|
if %ERRORLEVEL% neq 0 (echo makecab.exe %onf% failed&goto :TheEnd) |
|
if %xmf%==wim goto :DDWIM |
|
call :DDF %kbf%.msu |
|
(echo "%_sDDC%" "DesktopDeployment.cab" |
|
if exist "%_sDDD%" echo "%_sDDD%" "DesktopDeployment_x86.cab" |
|
echo "%onf%" |
|
if %IncludeSSU% equ 1 echo "%_sSSU%" "%suf%" |
|
echo "%_sCAB%" "%kbf%.cab" |
|
echo "%_sPSF%" "%kbf%.psf" |
|
)>>zzz.ddf |
|
%_Null% makecab.exe /F zzz.ddf /D Compress=OFF |
|
if %ERRORLEVEL% neq 0 (echo makecab.exe %kbf%.msu failed&goto :TheEnd) |
|
echo. |
|
echo Finished |
|
echo. |
|
goto :TheEnd |
|
|
|
:DDWIM |
|
echo. |
|
echo Creating: %kbf%.msu |
|
if exist "_tWIM\" rmdir /s /q "_tWIM\" %_Nul3% |
|
mkdir "_tWIM" |
|
copy /y "%_sDDC%" "_tWIM\DesktopDeployment.cab" %_Nul3% |
|
if exist "%_sDDD%" copy /y "%_sDDD%" "_tWIM\DesktopDeployment_x86.cab" %_Nul3% |
|
copy /y "%onf%" "_tWIM\%onf%" %_Nul3% |
|
if %IncludeSSU% equ 1 copy /y "%_sSSU%" "_tWIM\%suf%" %_Nul3% |
|
copy /y "%_sCAB%" "_tWIM\%kbf%.wim" %_Nul3% |
|
copy /y "%_sPSF%" "_tWIM\%kbf%.psf" %_Nul3% |
|
:: %_Nul3% dism.exe /Capture-Image /ImageFile:%kbf%.msu /CaptureDir:_tWIM\ /Name:content /Compress:none /noacl:all |
|
%_Nul3% "!_work!\bin\imagex_%xBT%.exe" /CAPTURE _tWIM\ %kbf%.msu content /COMPRESS none /NOACL ALL /NOTADMIN /TEMP "!_temp!" |
|
if %ERRORLEVEL% neq 0 (echo wim capture %kbf%.msu failed&goto :TheEnd) |
|
echo. |
|
echo Finished |
|
echo. |
|
goto :TheEnd |
|
|
|
:DDCAB |
|
echo. |
|
echo Extracting: %_sSSU% |
|
if exist "_tmpSSU\" rmdir /s /q "_tmpSSU\" %_Nul3% |
|
mkdir "_tmpSSU\000" |
|
expand.exe -f:* %_sSSU% _tmpSSU %_Null% || ( |
|
rmdir /s /q "_tmpSSU\" %_Nul3% |
|
echo failed. |
|
echo. |
|
echo Provide ready DesktopDeployment.cab and try again |
|
echo. |
|
set _fail=1 |
|
goto :eof |
|
) |
|
set xbt=%bit% |
|
if /i %bit%==x64 set xbt=amd64 |
|
for /f %%# in ('dir /b /ad "_tmpSSU\%xbt%_microsoft-windows-servicingstack_*"') do set "src=%%#" |
|
for %%# in (%sdl%) do if exist "_tmpSSU\%src%\%%#" (move /y "_tmpSSU\%src%\%%#" "_tmpSSU\000\%%#" %_Nul1%) |
|
set DD64create=1 |
|
call :DDF %_sDDC% |
|
call :ADD _tmpSSU\000 |
|
%_Null% makecab.exe /F zzz.ddf /D Compress=ON /D CompressionType=MSZIP |
|
mkdir "_tmpSSU\111" |
|
if /i not %bit%==x86 if not exist "DesktopDeployment_x86.cab" goto :DDCdu |
|
rmdir /s /q "_tmpSSU\" %_Nul3% |
|
exit /b |
|
|
|
:DDC86 |
|
echo. |
|
echo Extracting: %_sSSU% |
|
if exist "_tmpSSU\" rmdir /s /q "_tmpSSU\" %_Nul3% |
|
mkdir "_tmpSSU\111" |
|
expand.exe -f:* %_sSSU% _tmpSSU %_Null% || ( |
|
rmdir /s /q "_tmpSSU\" %_Nul3% |
|
echo failed. |
|
echo. |
|
echo Skipping DesktopDeployment_x86.cab |
|
echo see ReadMe.txt for more details |
|
goto :eof |
|
) |
|
:DDCdu |
|
for /f %%# in ('dir /b /ad "_tmpSSU\x86_microsoft-windows-servicingstack_*"') do set "src=%%#" |
|
for %%# in (%sdl%) do if exist "_tmpSSU\%src%\%%#" (move /y "_tmpSSU\%src%\%%#" "_tmpSSU\111\%%#" %_Nul1%) |
|
set DD86create=1 |
|
call :DDF %_sDDD% |
|
call :ADD _tmpSSU\111 |
|
%_Null% makecab.exe /F zzz.ddf /D Compress=ON /D CompressionType=MSZIP |
|
rmdir /s /q "_tmpSSU\" %_Nul3% |
|
exit /b |
|
|
|
:DDF |
|
echo. |
|
echo Creating: %1 |
|
(echo .Set DiskDirectoryTemplate="." |
|
echo .Set CabinetNameTemplate="%1" |
|
echo .Set MaxCabinetSize=0 |
|
echo .Set MaxDiskSize=0 |
|
echo .Set FolderSizeThreshold=0 |
|
echo .Set RptFileName=nul |
|
echo .Set InfFileName=nul |
|
echo .Set Cabinet=ON |
|
)>zzz.ddf |
|
exit /b |
|
|
|
:ADD |
|
(echo .Set SourceDir="%1" |
|
echo "dpx.dll" |
|
echo "ReserveManager.dll" |
|
echo "TurboStack.dll" |
|
echo "UpdateAgent.dll" |
|
echo "wcp.dll" |
|
if exist "%1\UpdateCompression.dll" echo "UpdateCompression.dll" |
|
)>>zzz.ddf |
|
exit /b |
|
|
|
:dodpx |
|
set _nat=0 |
|
set _wow=0 |
|
if /i %bit%==%xBT% set _nat=1 |
|
if %_nat% equ 0 set _wow=1 |
|
|
|
if exist "!_repo!\dpx.dll" if not exist "!_repo!\expand.exe" ( |
|
if %_wow% equ 1 copy /y %SystemRoot%\SysWOW64\expand.exe "!_repo!\" %_Nul3% |
|
if %_nat% equ 1 copy /y %SysPath%\expand.exe "!_repo!\" %_Nul3% |
|
set _exd=1 |
|
exit /b |
|
) |
|
if %_wow% equ 1 if exist "%_sDDD%" ( |
|
expand.exe -f:dpx.dll "%_sDDD%" "!_repo!" %_Nul3% |
|
if exist "!_repo!\dpx.dll" ( |
|
copy /y %SystemRoot%\SysWOW64\expand.exe "!_repo!\" %_Nul3% |
|
set _dpx=1 |
|
exit /b |
|
) |
|
) |
|
if %_nat% equ 1 if defined _sDDC ( |
|
expand.exe -f:dpx.dll "%_sDDC%" "!_repo!" %_Nul3% |
|
if exist "!_repo!\dpx.dll" ( |
|
copy /y %SysPath%\expand.exe "!_repo!\" %_Nul3% |
|
set _dpx=1 |
|
exit /b |
|
) |
|
) |
|
exit /b |
|
|
|
:E_Bin |
|
echo. |
|
echo %_err% |
|
echo. |
|
echo Required file "bin\imagex_%xBT%.exe" is missing |
|
echo. |
|
goto :TheEnd |
|
|
|
:E_KB |
|
echo. |
|
echo %_err% |
|
echo. |
|
echo LCU %kbn% %xtn% file is missing |
|
echo. |
|
goto :TheEnd |
|
|
|
:E_DB |
|
echo. |
|
echo %_err% |
|
echo. |
|
echo LCUCompDB file is missing from AggregatedMetadata |
|
echo. |
|
goto :TheEnd |
|
|
|
:N_MS |
|
echo. |
|
echo %_ntc% |
|
echo. |
|
echo LCU %kbn% msu file already exist |
|
echo. |
|
goto :TheEnd |
|
|
|
:N_PT |
|
echo. |
|
echo %_ntc% |
|
echo. |
|
echo Could not find all required update files |
|
echo. |
|
goto :TheEnd |
|
|
|
:TheEnd |
|
if exist "zzz.ddf" del /f /q "zzz.ddf" |
|
if exist "LCUCompDB*.xml.cab" del /f /q "LCUCompDB*.xml.cab" |
|
if exist "SSUCompDB*.xml.cab" del /f /q "SSUCompDB*.xml.cab" |
|
if exist "%onf%" del /f /q "%onf%" |
|
if %DD86create% equ 1 if exist "DesktopDeployment_x86.cab" del /f /q "DesktopDeployment_x86.cab" |
|
if %DD64create% equ 1 if exist "DesktopDeployment.cab" del /f /q "DesktopDeployment.cab" |
|
if %_exd% equ 1 ( |
|
if exist "expand.exe" del /f /q "expand.exe" %_Nul3% |
|
) |
|
if %_dpx% equ 1 ( |
|
if exist "dpx.dll" del /f /q "dpx.dll" %_Nul3% |
|
if exist "expand.exe" del /f /q "expand.exe" %_Nul3% |
|
) |
|
if exist "_tWIM\" rmdir /s /q "_tWIM\" %_Nul3% |
|
if exist "_tMSU\" rmdir /s /q "_tMSU\" %_Nul3% |
|
%_Exit% |
|
%_Pause% |
|
goto :eof
|
|
|