@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
@ setlocal DisableDelayedExpansion
@ set uiv = v10.25
@ set uiv = v10.27
@ echo off
: : enable debug mode, you must also set target and repo (if updates are not beside the script)
set _Debug = 0
@ -136,7 +136,6 @@ for /f "skip=2 tokens=2*" %%a in ('reg.exe query "HKCU\Software\Microsoft\Window
@@ -136,7 +136,6 @@ for /f "skip=2 tokens=2*" %%a in ('reg.exe query "HKCU\Software\Microsoft\Window
if exist " %PUBLIC% \Desktop\desktop.ini " set " _dsk= %PUBLIC% \Desktop "
set psfnet = 0
if exist " %SystemRoot% \Microsoft.NET\Framework\v4.0.30319\ngen.exe " set psfnet = 1
if exist " %SystemRoot% \Microsoft.NET\Framework\v2.0.50727\ngen.exe " set psfnet = 1
if %_pwsh% equ 0 set psfnet = 0
for %% # in ( E F G H I J K L M N O P Q R S T U V W X Y Z) do (
set " _adr %% #= %% # "
@ -386,11 +385,42 @@ if %_init%==1 (goto :check) else (goto :mainmenu)
@@ -386,11 +385,42 @@ if %_init%==1 (goto :check) else (goto :mainmenu)
: check
if /i " !target! " == " %SystemDrive% " (
if /i %xOS% == x86 ( set arch = x86) else if /i %xOS% == amd64 ( set arch = x64) else ( set arch = arm64)
set _build = %winbuild%
reg.exe query %_SxS% /v W10UIclean %_Nul3% && ( set onlineclean = 1& set online = 1& set cleanup = 1)
reg.exe query %_SxS% /v W10UIrebase %_Nul3% && ( set onlineclean = 1& set online = 1& set cleanup = 1& set resetbase = 1)
reg.exe query %_SxS% /v W10UIclean %_Nul3% && ( set onlineclean = 1)
reg.exe query %_SxS% /v W10UIrebase %_Nul3% && ( set onlineclean = 1)
)
if defined onlineclean goto : main2board
if not defined onlineclean goto : main1board
: main0board
set _elr = 0
@ cls
echo ======================= W10UI %uiv% ==========================
echo .
echo Detected pending " Cleanup System Image " for Current OS:
echo .
echo [1] Execute Cleanup
echo .
echo [2] Skip Cleanup and continue
echo .
echo ============================================================
choice /c 129 /n /m " Choose a menu option, or press 9 to exit: "
set _elr = %errorlevel%
if %_elr% == 3 goto : eof
if %_elr% == 2 (
set onlineclean =
reg.exe delete %_SxS% /v W10UIclean /f %_Nul3%
reg.exe delete %_SxS% /v W10UIrebase /f %_Nul3%
goto : main1board
)
if %_elr% == 1 (
reg.exe query %_SxS% /v W10UIclean %_Nul3% && ( set online = 1& set cleanup = 1)
reg.exe query %_SxS% /v W10UIrebase %_Nul3% && ( set online = 1& set cleanup = 1& set resetbase = 1)
goto : main2board
)
goto : main0board
: main1board
call : counter
set " brep=!repo! "
if %_sum% == 0 set " repo= "
@ -657,12 +687,19 @@ if !skip!==1 (set /a _sum-=1&if %msuchk% equ 1 (set /a _msu-=1&goto :eof) else (
@@ -657,12 +687,19 @@ if !skip!==1 (set /a _sum-=1&if %msuchk% equ 1 (set /a _msu-=1&goto :eof) else (
: cab1proceed
if %msuchk% equ 0 goto : eof
set uupmsu = 0
set msuwim = 0
cd /d " !repo! "
for /f " tokens=2 delims=: " %% # in ( 'expand.exe -d -f:*Windows*.cab !package! ^| findstr /i %kb% ' ) do set kbcab = %% #
expand.exe -d -f:*Windows*.psf !package! | findstr /i %arch% \.psf %_Nul3% && set uupmsu = 1
expand.exe -d -f:*Windows*.psf !package! %_Nul2% | findstr /i %arch% \.psf %_Nul3% && set uupmsu = 1
if %uupmsu% equ 0 if %_build% geq 21382 (
dism.exe /English /List-Image /ImageFile:!package! /Index:1 %_Nul2% | findstr /i %arch% \.psf %_Nul3% && ( set uupmsu = 1& set msuwim = 1)
)
if %uupmsu% equ 0 for /f " tokens=2 delims=: " %% # in ( 'expand.exe -d -f:*Windows*.cab !package! %_Nul6% ^| findstr /i %kb% ' ) do set kbcab = %% #
cd /d " !_work! "
set /a count += 1
if %uupmsu% equ 1 goto : msu1
if %uupmsu% equ 1 (
if %_pwsh% equ 0 goto : eof
goto : msu1
)
if %_embd% equ 0 (
set " msucab=!msucab! %kbcab% "
) else (
@ -678,11 +715,21 @@ cd /d "!_cabdir!"
@@ -678,11 +715,21 @@ cd /d "!_cabdir!"
if %_embd% equ 0 if exist " %dest% \ " rmdir /s /q " %dest% \ " %_Nul3%
if not exist " %dest% \chck\ " mkdir " %dest% \chck "
echo %count% /%_msu% : %package% [Combined UUP]
if %msuwim% equ 0 (
expand.exe -f:*Windows*.cab " !repo! \!package! " " %dest% \chck " %_Null%
for /f " tokens=* delims= " %% # in ( 'dir /b /on " %dest% \chck\*Windows1*-KB*.cab"' ) do set " compkg= %% #
expand.exe -f:SSU-*%arch% *.cab " !repo! \!package! " " %dest% \chck " %_Null%
) else (
for /f " tokens=1 delims=\ " %% # in ( 'dism.exe /English /List-Image /ImageFile:"!repo!\!package!" /Index:1 ^| findstr /i /r "SSU-.* %arch% \.wim"' ) do powershell -nop -c " $f=[IO.File]::ReadAllText('!_batp!') -split ':wimmsu\:.*';iex ($f[1]);E '!repo!\!package!' ' %% #' ' %dest% \chck\ %% #' "
)
: : dism.exe /English /Apply-Image /ImageFile:"!repo!\!package!" /Index:1 /ApplyDir:"%dest%\chck" /NoAcl:all %_Null%
: : del /f /q "%dest%\chck\*.psf" %_Nul3%
for /f " tokens=* delims= " %% # in ( 'dir /b /on " %dest% \chck\*Windows1*-KB*.*"' ) do set " compkg= %% #
if %msuwim% equ 0 (
expand.exe -f:update.mum " %dest% \chck\ %compkg% " " %dest% " %_Null%
expand.exe -f:%sss% _microsoft-updatetargeting-*os_*.manifest " %dest% \chck\ %compkg% " " %dest% " %_Null%
expand.exe -f:SSU-*%arch% *.cab " !repo! \!package! " " %dest% \chck " %_Null%
) else (
for /f " tokens=1 delims=\ " %% # in ( 'dism.exe /English /List-Image /ImageFile:" %dest% \chck\ %compkg% " /Index:1 ^| findstr /i /r "update.mum %sss% _microsoft-updatetargeting-.*os_"' ) do powershell -nop -c " $f=[IO.File]::ReadAllText('!_batp!') -split ':wimmsu\:.*';iex ($f[1]);E ' %dest% \chck\ %compkg% ' ' %% #' ' %dest% \ %% #' "
)
if exist " %dest% \chck\SSU-* %arch% *.cab " for /f " tokens=* delims= " %% # in ( 'dir /b /on " %dest% \chck\SSU-* %arch% *.cab"' ) do ( set " compkg= %% # " & call : uupssu )
rmdir /s /q " %dest% \chck\ " %_Nul3%
set msu_ %dest% = 1
@ -779,7 +826,7 @@ if exist "checker\*_netfx4*.manifest" findstr /i /m "Package_for_RollupFix" "che
@@ -779,7 +826,7 @@ if exist "checker\*_netfx4*.manifest" findstr /i /m "Package_for_RollupFix" "che
)
if not defined _type (
expand.exe -f:*_microsoft-windows-s..boot-firmwareupdate_*.manifest " !repo! \!package! " " checker " %_Null%
if exist " checker\*_microsoft-windows-s..boot-firmwareupdate_*.manifest " set " _type=[SecureBoot] "
if exist " checker\*_microsoft-windows-s..boot-firmwareupdate_*.manifest " findstr /i /m " Package_for_RollupFix " " checker\update.mum " %_Nul3% || set " _type=[SecureBoot] "
)
set /a _fixSV =% _build %+ 1
if not defined _type if %_build% geq 18362 (
@ -834,22 +881,14 @@ if not exist "%package%" (
@@ -834,22 +881,14 @@ if not exist "%package%" (
copy /y " !repo! \ %pkgn% .* " . %_Nul3%
if not exist " %pkgn% .psf " for /f %% # in ( 'dir /b /a:-d "!repo!\* %pkgid% * %arch% *.psf"' ) do copy /y " !repo! \ %% # " %pkgn% .psf %_Nul3%
)
if not exist " PSFExtractor.exe " if %psfcpp% equ 0 (
setlocal
set " TMP= %SystemRoot% \Temp "
set " TEMP= %SystemRoot% \Temp "
)
)
if defined psf_ %pkgn% (
if not exist " PSFExtractor.exe " if %psfcpp% equ 0 (
%_Nul3% powershell -nop -c " $d='!cd!';$f=[IO.File]::ReadAllText('!_batp!') -split ':embdbin\:.*';iex ($f[1]);X 1 "
endlocal
if %psfcpp% equ 0 (
%_Nul3% powershell -nop -c " $f=[IO.File]::ReadAllText('!_batp!') -split ':cabpsf\:.*';iex ($f[1]);P ' %package% ' "
)
if not exist " PSFExtractor.exe " if %psfcpp% equ 1 (
%_Nul3% copy /y " !_exe! " .
if %psfcpp% equ 1 (
copy /y " !_exe! " . %_Nul3%
PSFExtractor.exe %package% %_Null%
)
PSFExtractor.exe %package% %_Null%
if !errorlevel! neq 0 (
dir /b /ad " %dest% \*_microsoft* " %_Null% || (
echo Error: failed to extract PSF update
rmdir /s /q " %dest% \ " %_Nul3%
set psf_ %pkgn% =
@ -1194,21 +1233,13 @@ if not exist "%lcupkg%" (
@@ -1194,21 +1233,13 @@ if not exist "%lcupkg%" (
copy /y " !repo! \ %lcupkg:~0,-4% .* " . %_Nul3%
if not exist " %lcupkg:~0,-4% .psf " for /f %% # in ( 'dir /b /a:-d "!repo!\ %lcupkg:~0,-12% *.psf"' ) do copy /y " !repo! \ %% # " %lcupkg:~0,-4% .psf %_Nul3%
)
if not exist " PSFExtractor.exe " if %psfcpp% equ 0 (
setlocal
set " TMP= %SystemRoot% \Temp "
set " TEMP= %SystemRoot% \Temp "
if %psfcpp% equ 0 (
%_Nul3% powershell -nop -c " $f=[IO.File]::ReadAllText('!_batp!') -split ':cabpsf\:.*';iex ($f[1]);P ' %lcupkg% ' "
)
)
if exist " %lcudir% \*.psf.cix.xml " (
if not exist " PSFExtractor.exe " if %psfcpp% equ 0 (
%_Nul3% powershell -nop -c " $d='!cd!';$f=[IO.File]::ReadAllText('!_batp!') -split ':embdbin\:.*';iex ($f[1]);X 1 "
endlocal
if %psfcpp% equ 1 (
copy /y " !_exe! " . %_Nul3%
PSFExtractor.exe %lcupkg% %_Null%
)
if not exist " PSFExtractor.exe " if %psfcpp% equ 1 (
%_Nul3% copy /y " !_exe! " .
)
PSFExtractor.exe %lcupkg% %_Null%
if !_sbst! equ 1 popd
if !_sbst! equ 1 subst %_sdr% /d %_Nul3%
)
@ -1327,7 +1358,7 @@ if %verb%==1 (set /a _sum-=1&goto :eof)
@@ -1327,7 +1358,7 @@ if %verb%==1 (set /a _sum-=1&goto :eof)
set " safeos=!safeos! /PackagePath: %dest% \update.mum "
goto : eof
)
if exist " %dest% \*_microsoft-windows-s..boot-firmwareupdate_*.manifest " (
if exist " %dest% \*_microsoft-windows-s..boot-firmwareupdate_*.manifest " findstr /i /m " Package_for_RollupFix " " %dest% \update.mum " %_Nul3% || (
if exist " !mumtarget! \Windows\Servicing\Packages\*WinPE-LanguagePack*.mum " ( set /a _sum -= 1 & goto : eof )
if %winbuild% lss 9600 ( set /a _sum -= 1 & goto : eof )
set secureboot = !secureboot! /PackagePath:" !repo! \!package! "
@ -2041,8 +2072,7 @@ goto :eof
@@ -2041,8 +2072,7 @@ goto :eof
if %cleanup% == 0 call : cleanmanual & goto : eof
if exist " !mumtarget! \Windows\WinSxS\pending.xml " (
if %online% == 1 (
if %resetbase% == 0 ( set rValue = W10UIclean) else ( set rValue = W10UIrebase)
reg.exe add %_SxS% /v !rValue! /t REG_DWORD /d 1 /f %_Nul1%
call : onlinepending
goto : eof
)
call : cleanmanual & goto : eof
@ -2115,6 +2145,45 @@ for /f "tokens=* delims=" %%# in ('dir /b /ad "!mumtarget!\Windows\CbsTemp\" %_N
@@ -2115,6 +2145,45 @@ for /f "tokens=* delims=" %%# in ('dir /b /ad "!mumtarget!\Windows\CbsTemp\" %_N
del /s /f /q " !mumtarget! \Windows\CbsTemp\* " %_Nul3%
goto : eof
: onlinepending
if %resetbase% == 0 ( set rValue = W10UIclean) else ( set rValue = W10UIrebase)
reg.exe add %_SxS% /v !rValue! /t REG_DWORD /d 1 /f %_Nul1%
(
echo @echo off
echo reg.exe query " HKU\S-1-5-19 " 1^> nul 2^> nul ^| ^| ^( echo Run the script as administrator^& pause^& exit^)
echo if exist " %% SystemRoot %% \winsxs\pending.xml " ^( echo Restart the system first^& pause^& exit^)
echo set " _sbs=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Configuration "
echo set _build=%_build%
echo set resetbase=%resetbase%
echo set savc=0^& set savr=1
echo if %% _build%% geq 18362 ^( set savc=3^& set savr=3^)
echo net stop trustedinstaller 1^> nul 2^> nul
echo net stop wuauserv 1^> nul 2^> nul
echo del /f /q %% SystemRoot%% \Logs\CBS\* 2^> nul
echo reg.exe delete %% _sbs%% /v W10UIclean /f 1^> nul 2^> nul
echo reg.exe delete %% _sbs%% /v W10UIrebase /f 1^> nul 2^> nul
echo if %% resetbase%% ==0 ^(
echo echo.
echo echo ============================================================
echo echo Cleaning up OS image...
echo echo ============================================================
echo reg.exe add %% _sbs%% /v DisableResetbase /t REG_DWORD /d 1 /f 1^> nul 2^> nul
echo reg.exe add %% _sbs%% /v SupersededActions /t REG_DWORD /d %% savc%% /f 1^> nul 2^> nul
echo dism.exe /Online /Cleanup-Image /StartComponentCleanup
echo ^) else ^(
echo echo.
echo echo ============================================================
echo echo Resetting OS image base...
echo echo ============================================================
echo reg.exe add %% _sbs%% /v DisableResetbase /t REG_DWORD /d 0 /f 1^> nul 2^> nul
echo reg.exe add %% _sbs%% /v SupersededActions /t REG_DWORD /d %% savr%% /f 1^> nul 2^> nul
echo dism.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase
echo ^)
echo ^( goto^) 2^> nul ^& del /f /q %% 0 ^& exit /b
)>"W10Cln.cmd"
move /y " W10Cln.cmd " " !_dsk! \RunOnce_AfterRestart_DismCleanup.cmd "
goto : eof
: MeltdownSpectre
reg.exe load HKLM\TEMP " !mumtarget! \Windows\System32\Config\SYSTEM " %_Nul1%
reg.exe add " HKLM\TEMP\ControlSet001\Control\Session Manager\Kernel " /v DisableTsx /t REG_DWORD /d 1 /f %_Nul1%
@ -2413,6 +2482,7 @@ if "!isodir!"=="" set "isodir=!_work!"
@@ -2413,6 +2482,7 @@ if "!isodir!"=="" set "isodir=!_work!"
call : DATEISO
if %_cwmi% equ 1 for /f " tokens=2 delims==. " %% # in ( 'wmic os get localdatetime /value' ) do set " _date= %% # "
if %_cwmi% equ 0 for /f " tokens=1 delims=. " %% # in ( 'powershell -nop -c "([WMI]'Win32_OperatingSystem=@' ) .LocalDateTime" ') do set " _date=%% #"
if not defined _date set " _date=000000-0000 "
if not defined isodate set " isodate= %_date:~2,6% - %_date:~8,4% "
for %% # in ( A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do (
set isolab = !isolab:%%#=%%#!
@ -2568,68 +2638,87 @@ function :DIR2ISO ($dir, $iso, $efi=0, $vol='DVD_ROM') { if (!(test-path -Path $
@@ -2568,68 +2638,87 @@ function :DIR2ISO ($dir, $iso, $efi=0, $vol='DVD_ROM') { if (!(test-path -Path $
$obj=$fsi.CreateResultImage(); [dir2iso]::Create($iso,[ref]$obj.ImageStream,$obj.BlockSize,$obj.TotalBlocks) };[GC]::Collect()
} $:DIR2ISO: #,# export directory as (bootable) udf iso - lean and mean snippet by AveYo, 2021
: embdbin :
Add-Type -Language CSharp -TypeDefinition @"
using System.IO; public class BAT85{ public static void Decode(string tmp, string s) { MemoryStream ms=new MemoryStream(); n=0;
byte[] b85=new byte[255]; string a85=" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$&()+,-./;=?@[] ^ _{|}~ " ;
int[] p85={52200625,614125,7225,85,1}; for(byte i=0;i< 85;i++){b85[(byte)a85[i]]=i;} bool k=false;int p=0; foreach(char c in s){
switch(c){ case'\0':case'\n':case'\r':case'\b':case'\t':case'\xA0':case' ':case':': k=false;break; default: k=true;break; }
if (k){ n + = b 8 5 [ ( b y t e ) c ] * p 8 5 [ p + + ] ; i f ( p == 5){ ms.Write(n4b(), 0, 4); n=0; p=0; } } } if(p> 0){ for(int i=0;i< 5-p;i++){
n += 84 * p85[p+i]; } ms.Write(n4b(), 0, p-1); } File.WriteAllBytes(tmp, ms.ToArray()); ms.SetLength(0); }
private static byte[] n4b(){ return new byte[4]{(byte)(n>> 24),(byte)(n>> 16),(byte)(n>> 8),(byte)n}; } private static long n=0; }
" @; function X([int]$r=1){ $tmp= " $r._" ; [BAT85]::Decode($tmp, $f[$r+1]); expand.exe -R $d\$tmp -F:* . 1>$nul; del $tmp -force }
: embdbin :
: :O/bZg000006B7Uc00000EC2ui000000|5a50ssI200000bpQYW0RRIP04e|g00000008)?S,9QWP,X.lcyw}MV{~tFE[gOS0J/DG001fg0002zQui|/08mp#MR/]^
: :VPkY}axP^fWiDfHZf0p_07u$kq@Qu8DqDbnjRFv+s{jBaGgdPI0B.=jy=)irrEE+,wn;8aq@RR&OO~x8ODFwg?ntp)mXWNljMsx)Z#Hq$.rC,|lZSw92r((HrnE]P
: :)qb]8Psv[0G1#VJlMX{kVo5&ia3C=aXHNpAxlQ=pos-/AasdDtnE/~$0Cy/D-jToj)h^!10xVEZ5-.4ApDi{K,X^Rch9d0iUR[||uHs)z-D2;,uXZ)6(o(OX9VcqH
: :l~xGtIKfScMrji=0Ya!qjJ9!2lJbw=PyP2P{{RpG0FeS9nxF#hZkF7);cLBfct8LL[jd@U[dfjb=W]VG9stxTFg_11(U-PnKwy0H6;C@|Zkx/F2Yb5Ts|vJxGAJK|
: :h=--x8WM3p98[AFqar!MDJ9g4IK/4[#,jE7WOki3c51yH(8ie2Fx0_mWCbT${ekEOd@@7d75T/Ao/Y)-pw^DN=SnfU.nG)t$vR~]8_k1Zm+gg&.IUk0&@TQujx)[W
: :+2YL^F#DV{=/z=5HFNw{EUo&Z9bqm!Ip]iuOR5B3tmp^1;Q0HyuP#3Mvi(o)?vT3TDqEUvt-)1~KTxe,{Y.hrR8srTtzXXt-feC-M2D?6Ujp&GSNc2LIr[3/XMqEr
: :q7$9h/r(tb54Wd}[~nP$)RJqq]yDfte+/3Fccb@^qcalz&wXhhe&-gON&S.H3y[WQ7[~R?=48+)[6Qb#doJW&?=C.u!1$XwQy8JoE@AAEJ1O4BTKEvmyK30WR4p|4
: :Gu6rr^@ek{pE#}bR=.oa4&t7!0?IB5C^(|Ub0f3d=/WR(sK2ZSE]tr5tIpGO&~l$eyxx8h8_&F8|2|Nl87P(8SJ]4JrR89.je8}6NlPrB{orB]]rAE^!Wh.y=J|bV
: :-$FiZ#-PV1-cUHTu9m[eDc.dnNx&}XLEt3wy@P1RC1cQ!lVK(_eQ-Dss3EpvJv[PTmYyux[!jQ,&cl-Iy9|?XF~/}4epAu$Ia_Tfx,c6L.FdU#Sti$XtS,dAmTD5x
: :U~KMaMSItitH_~TaaM//Asu@)n5/.rZ}_Srd-x4qCponvvj=1^Y4(U4,!{tr@B-YHb6+5Ln6nQzx1M{&2y5]w_#/c]u_EmA)a8Otko(Cyi@KD&!{z;/TN$Hg_E90$
: :kZsNIh5ZC~F#YF(6AZP2{WMq.1y4G[4{}+zcm@{jbZ;Qb/r?Xm(H1fVZof5pPd~]H2~i,pSzNNB@/hLwtk_V3d|yS{9bG8p/F,j+,C#TFw&T+/81],LY9TxWC._l9
: :6Vx#tg!m}DXe$ICKCGDTnh_d7lixa.-scb1t7UcUx{pXV@!6_{2)tE^&@W)(v9v+lgAnXk3{+1em$k4;S!(Qg#U~bkjexaJ?#y$3e}x9fss)svYYk^7Zm8{tTTv)E
: :jHi{nVKwm@3iKnTtZd.gMgY[LKcXJ,DY}DQw[h2Z0/rZ1ykVIHTQ8xV,y1KGiH!N#_Y|GWdvh0KW5GKN4f)j?yXw&F&LFkKjbhnkw0[4GtZ8Gt3voJ9yRYD5(t/[L
: :IpFinb9~@py)V[+@k]MBc&H$JzR;;a_]3!T+wzFumTSkp3q{Ob,;+RX@5#Qm^vWT6Hy0dN#Sow1[E[kPAN&DY^yD=DbunS1E8c|qN#(G9nYzP1$voxpOuXdylk_ec
: :^Yyr(v=fxU|72LLKkGhyr~4GH,OTv4k2]0fkFZ-Js$.$/MM9Ct^HCcf5Bu2+q^Oev]9rVCOQaPjn?oJTg7Fv!f7e1oA6dp,vNdGQpMiz#36X!qBys]~BUd;c_1ts(
: :aM,n.HFgB.1P(w&7DWr_8si#Tn+_y!!)u!k2ro?hj}jd-S(205D8W1nX@!Mw9FWH?n_Fo0/(N73j1=V]Cej!pJ1p3Os#llqOoi@T1^!^8,=~lL3oeny;ZhC./k65e
: :ztjWI+3ArV0H~nL]4Lq;a#!&zQYSE}El8oW)w1H=Ut})CIYV;9e95;fe;c+qN4N;(Dl3d8nx.^{cfEyGm[J$+_?dpe=s;9iRFPlJFEo}R4A]|XY7!8y!(j,,zIrX@
: :o2P-7hl5QmpKW#1Z=a)Mpq}tKkki.P61mKtk9GkrhZG(l=#$13_#-$am#E[uXMU1T?Q)9#Aav8Ea=B$~4a,[G]j(S+toT}GwJLSAU@5&Q9.h!SbR2#yxmKvtZ;tGr
: :-CpZ)nwXZ{F;NfSWIW(1TPz2oYT?T1dxDnwg{S0/p^Z56{NVlVRF}zu=sAuh.vY/1_Us[xCegh|4-Xr[Ssq7Yb&ftWt5~)EIlaHD2c_@c2;f+-ap(=XFaqi]VBHsb
: :F6#2DjV]9q!HxS$Xy|IZt,BW_;SZ^l2s9};u!W]fR#^Gdq$SuYvP_U?qFQ#Ef{]_YDy+B}xKJ$1RMMCY;?v4eT@.cJYqhL!-Az@#1ot?$XyK,erT,n#-LwQq5F)(,
: :?QDVm5,,y7W;VV;IP|Yy0JaDY2qJ/?45#M]4]B[ITa@~($_{}Vhf,taT)#fKnLh+7_JnsGNe)FbS~@QsjwZ_.UzA1j1Jgm^6}Wan,-u,vg.#I{D7dh_)7fWuCE6M[
: :-+a]~1L_mDLB(B_gprKwFF?mUZgRo@!DC$m!?]kzn7[3k=gJ]tqu{qqm63jYS^^5]i&A_(e!-j3JGQ[FB@B5Z;GEz}fF#JD4@uEuFGe3AxV9hM-DdpYs0-iKrW[k7
: :?fUdOasaPg7yxHg16cmF&,FKrUKUa}EGnQ2=W@nrLL{E#CdNiWd_0(.#VcLjMrRu5MnomABXCh&[;F}edM(T#pcKV_]^OrL7}[q~$$v$J[sMBWP+si20?0(5mY]Jc
: :SrG(fIFm##2Z84&kGLcATb7QOA3ERwlnLSk&TY8rsvy^/0bQZjr&ZyofCN&&bN4/o/P_]$VYvbbg9WG{b9h{iyur9KZ_UKC[D$hCmDRB6&Y0C[xZtU$/Fxe@Fat7B
: :AzX|jP~)rYV#f(r5r=VoIy5raN$|?$lvJEzhe6|-3{!@G65=#KWrUF33_m-9gUL9kF[~BFJ#s;NX]2zfsiy?}OhN55NMUN]QW1qC2&iQa!&3cwvwa6GXF21B-a9JO
: :o,E]$v)hxfA&jAs(yh#y@3B1BM1dGvB+-#;uU1e)ozyc7q)._rnnYxxNsNzlpwI#k[$JxeE-14zlE1U#$#s?ZRmHf7008N]#,a@8R|oMvV?p9xaGPwSDI#$[Y;?b}
: :&P}fi5?~bzpE0HDC|b+CY)=cdtD0k@nnl}=p0T(Dc^K9mrXdkdhJv0[kz~Zm)m/zM$sMwrWR;zKE|Zg~WM(pJiP),-i]OoEHxWjAOz2.-[P!EBZnm6ljx3U-ppdn6
: :$+9He70Qaol)bUYjk8T@+5ei&k{(Ez)|BA4LNyhxH?Q3nZ][Ll3Q+{ygySdLhalqfPtcxqy.dV~rIeH6)O9=siOc9H$!klv2iQqlRPBHZFnn|LoTL2Fg=WP-ETLo1
: :+KGUVhzBeU)n]bghLVk=-eKt2W)V!.cq7?R#vlx-4;eDOgjazruxNvE1vNESum]4797_GDd39L2@QO?j-ASBdxxMew(.;hYj^wqfEW_;gI)w;yv/r=T+(gOXh_zte
: :)}3/+8RHu_Qvu+ivL$jBYIE2[hIK~SbCRYGYenAI#]IFIl=wG|Dg#~|i^wd+k;a@v8tRTqb;T2aNSSOdwMI|4KOtS9dr9rX0itd4B2gmXY[~=1szwW/tRPZOcPAU[
: :$JLHWq8g;{fq/N+WR+.=7n?]~qq_#vKkIa_eT+PAm{s.,pRlIi-x}9(@0Uv+!)?v$SRVBnIpQO-,W0Lp_rL6V{.7?)MEgQV9z}PHkga2v9XpB?/=NrnG-0,QXwfE9
: :&/(.naS(//5gj~uLeXbZvN&mq8Cnq@C8wo3|5LPSTMqD7TRnhKJdDiFNa^nfd}YJ[Z/P0M(1;cu{3UMD=GC{x;P&nh{zh}FK9JHJH!3hkbpMJ^jW@YKVM,87d_ZlH
: :QDu^/jO{G+uWqgzq40z!wN4#$=TaI0[k=FEWo!AALF;pt{gn.ae{kj05g4FF)CT;^!T}C}05Wvo[IWMJrAox}00;SROo9?-2,Y4pvSKI5I@+QCgkh=?7|5|v8Uvt{
: :7YqTLq]UG]O{nZxAzI./B!MB)4#A@,7=M8zine+e!n$G9r4f-8RX|ca?D]3ajMOg?U7=BN-9)Y{W;L!iF6/F~RjMMpktc|da}e26+d5q17-FcaMoNmrdn903EZ$8,
: :?([4JWGEAScD9j$fjQSqe^IK3McV-h2dvMPNR3#Bc)G-q@8;,39JVMi2Nz1aiLgP99zi+mtO3HWDdi(7jgOe}1JqVQNfR#&vJ[KOO57d}VD.lwHaiGYrUh2RjypIb
: :LV#?G#Hoe5O(+/1a/Mm$grapdPX]0DAOQ1$5980gtu@atSkkH_9xXw($uHpQlak;=o],k=ES9yZ8X4(kDtZnD_5SRjY/IMH@P}o&ukA=Aso+&OFYQ,QTiqd^g+U6.
: :xlNQKp(0NSTU{B=b;=i@v/z5xr95|xR,EljuJ8a,btgx6jL3nCwsx;-dE.|mVH!{-BZF6Y)^?X)BWJXU$Rk#czk|omeftCLTTId/u0T7{IG@mY?&|BgX&H.].0U3=
: :S|4.=f(74FU.uKV.xZTz)q69x-yqXL5!l)6Mec4y]kv]hDJ8KL&-[z58Da_h3RKI|49VQUlCUT!z07!~[ssyQ7ebFF[GFER!b8G|W-UwxFL.)d1&^5]!60g7FUCZY
: :zPxX#[jBDK)M7V(E?CF;irR,zF5UXG;nRQnr2!iGmfH-j[3c]~sFn5ruD/.,MCowKui_MUcFcE|=8Z;?Dh5[lWpf.9I6}cfnhmh-X(6mLZ)Xgt,FM?_,~MENV_1ct
: :g4OWP.jIb|&6-gI7xkG!hyBd(z6_K/cYNC&!FK;En)eqgF(S+^)1keD2.wq;xU.^f!JkJ^j.MmHL8c09Jgl&s@u82x5-)&p5DywG1}-Tf8S,GYmt]]}Nm!ot_I{i2
: :M?#!j5Sp.MRQJgKjpM-KDlDAUs0,Ro6#;|oS8i@pg^]Xt[)t|wWN)$)#HkjD.9B1zP)rwA0wqP(.R@R{-qwouraIM(Ls8_r7GNRDZ,Gpf$C-~-(4GdiJv{-Df=qJ(
: :qk5|@JV$#4q41@BaFB2~7&VIXEDRe2c^aiVBsG$u^98+mAZBl1c$+P}xT,}huGY[4+v_YL5&rl@?HJ9lNpFJd5u$ILdZl.ecjJ+guG7U;yg)l5[dyPtBt95}{td{&
: :BYDVxMi8QgEdK3~NrTAwud)V[K#n~,ivKZb-pDgKfhh8Pp&b!;Z[wsXS;axEUm2VBvOS.m=$;ZI5&A7)Osnhtr|4xIUD~OrKT5gZD.EZpS2V_{Ac{^t!2y)@{lsN5
: :P{?Oezmct@Vi@!;+!T#V6[GIxaJVdN@G0T8=e}.eB5bn)2/2YK{CvrfW^#02+wD-$0U83H5R6I[Gke#)0!HDu#y$;IyH=~8a.cnYf7B~nk)YHcdks.087-h.K}W06
: :T6~TE@WMH&HA7qonzeOlz)V#sicszF-I,sMmum(9N!O{6nLz8K/Yc-@,=k2Zjlkp0I+T5f3AwX&F,Luo;+D!pSI#^b3Xlf_+y4=;A^!80i@gaS#.UP40iilmvnuEh
: :!yqn5DDfqh&|8z;fH!ktg&k]#kSz/GVaLm[,!?$tZZ_6gCH@n[Jr?$zj/jWZf[~vOP(/r=2EC&nY.)E/N}/78nlBdlNFg(v(1V!JaQE-zNc]Q]o{JGA&yLHHR=yk0
: :c/P!z!5N]H4={~5Ic+qZ1VRQ9aS[@28.,1qQp]_AUf0/fVD;]+b(8FOl&QI/bP#edO0Lu,0RtpJj7icO/3m0+9d=0bRMJ)b#D&0BYr3Xvl85t&6-X28R-/0@wU}=N
: :Y9yi$tfwF)&?)z,[hd3#;|3.pasLrw2+esnP&7^?Fb0KDjm5#J&c!g|RI1bxRb)-b==iRfgQ}|3zN{iJ)+L?O-}TH6jgC(0GS?0y!BF2BiUtB!dm&Zv5yehfeaiPx
: :@Ss.?EnxmYb_)2oz~XDyfe,xD{&S6Dm6d;p{d;2/s7[qoFN22Z{w@eX,;SO6QlQ(Fdl/syef/k^(xxZOT;?gdn,VE4$OY6szM8nMf;S=
: embdbin :
: cabpsf :
function G($DirectoryName) {
$DeltaList = [ordered] @{}
$doc = New-Object xml
$doc.Load($DirectoryName + " \express.psf.cix.xml " )
$child = $doc.FirstChild.NextSibling.FirstChild
while (!$child.LocalName.Equals(" Files " )) {$child = $child.NextSibling}
$FileList = $child.ChildNodes
foreach ($file in $FileList)
{
$fileChild = $file.FirstChild
while (!$fileChild.LocalName.Equals(" Delta " )) {$fileChild = $fileChild.NextSibling}
$deltaChild = $fileChild.FirstChild
while (!$deltaChild.LocalName.Equals(" Source " )) {$deltaChild = $deltaChild.NextSibling}
$DeltaList[$($file.id)] = @{name=$file.name; time=$file.time; stype=$deltaChild.type; offset=$deltaChild.offset; length=$deltaChild.length};
}
return $DeltaList
}
function P($CabFile) {
$DirectoryName = $CabFile.Substring(0, $CabFile.LastIndexOf('.'))
$PSFFile = $DirectoryName + " .psf "
$null = [IO.Directory]::CreateDirectory($DirectoryName)
$DeltaList = G $DirectoryName
$AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly(4, 1)
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule(2, $False)
$TypeBuilder = $ModuleBuilder.DefineType(0)
[void]$TypeBuilder.DefinePInvokeMethod('ApplyDeltaW', 'msdelta.dll', 'Public, Static', 1, [int], @([Int64], [String], [String], [String]), 1, 3)
$MSD = $TypeBuilder.CreateType()
$PSFFileStream = [IO.File]::OpenRead([IO.Path]::GetFullPath($PSFFile))
$cwd = [IO.Path]::GetFullPath($DirectoryName)
[Environment]::CurrentDirectory = $cwd
$null = [IO.Directory]::CreateDirectory(" 000 " )
foreach ($DeltaFile in $DeltaList.Values)
{
$FullFileName = $DeltaFile.name
if (Test-Path $ F u l l F i l e N a m e ) { c o n t i n u e }
$ShortFold = [IO.Path]::GetDirectoryName($FullFileName)
$ShortFile = [IO.Path]::GetFileName($FullFileName)
[bool]$UseRobo = (($cwd + '\' + $FullFileName).Length -gt 255) -or (($cwd + '\' + $ShortFold).Length -gt 248)
if ($UseRobo - e q 0 - a n d $ S h o r t F o l d . I n d e x O f ( " _ " ) - n e - 1 ) { $ n u l l = [ I O . D i r e c t o r y ] : : C r e a t e D i r e c t o r y ( $ S h o r t F o l d ) }
if ($UseRobo - e q 0 ) { $ W h e r e F i l e = $ F u l l F i l e N a m e }
Else {$WhereFile = " 000\ " + $ShortFile}
try {[void]$PSFFileStream.Seek($DeltaFile.offset, 0)} catch {}
$Buffer = New-Object byte[] $DeltaFile.length
try {[void]$PSFFileStream.Read($Buffer, 0, $DeltaFile.length)} catch {}
$OutputFileStream = [IO.File]::Create($WhereFile)
try {[void]$OutputFileStream.Write($Buffer, 0, $DeltaFile.length)} catch {}
[void]$OutputFileStream.Close()
if ($DeltaFile.stype - e q " P A 3 0 " ) { [ v o i d ] $ M S D : : A p p l y D e l t a W ( 0 , $ n u l l , $ W h e r e F i l e , $ W h e r e F i l e ) }
$null = [IO.File]::SetLastWriteTimeUtc($WhereFile, [DateTime]::FromFileTimeUtc($DeltaFile.time))
if ($UseRobo - e q 0 ) { c o n t i n u e }
Start-Process robocopy.exe -NoNewWindow -Wait -ArgumentList ('" ' + $cwd + '\000' + ' " ' + ' ' + '" ' + $cwd + '\' + $ShortFold + ' " ' + ' ' + $ShortFile + ' /MOV /R:1 /W:1 /NS /NC /NFL /NDL /NP /NJH /NJS')
}
[void]$PSFFileStream.Close()
$null = [IO.Directory]::Delete(" 000 " , $True)
}
: cabpsf :
: : ============
: wimmsu :
function E($WimPath, $InnFile, $OutFile) {
$DllPath = 'wimgapi.dll'
$AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly(4, 1)
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule(2, $False)
$TypeBuilder = $ModuleBuilder.DefineType(0)
[void]$TypeBuilder.DefinePInvokeMethod('WIMCreateFile', $DllPath, 'Public, Static', 1, [IntPtr], @([String], [UInt32], [Int32], [Int32], [Int32], [Int32].MakeByRefType()), 1, 3).SetImplementationFlags(128)
[void]$TypeBuilder.DefinePInvokeMethod('WIMLoadImage', $DllPath, 'Public, Static', 1, [IntPtr], @([IntPtr], [Int32]), 1, 3).SetImplementationFlags(128)
[void]$TypeBuilder.DefinePInvokeMethod('WIMSetTemporaryPath', $DllPath, 'Public, Static', 1, [int], @([IntPtr], [String]), 1, 3)
[void]$TypeBuilder.DefinePInvokeMethod('WIMExtractImagePath', $DllPath, 'Public, Static', 1, [int], @([IntPtr], [String], [String], [Int32]), 1, 3)
[void]$TypeBuilder.DefinePInvokeMethod('WIMCloseHandle', $DllPath, 'Public, Static', 1, [int], @([IntPtr]), 1, 3)
$WIMG = $TypeBuilder.CreateType()
$hWim = 0
$hImage = 0
$hWim = $WIMG::WIMCreateFile($WimPath, " 0x80000000 " , 3, " 0x20000000 " , 0, [ref]$null)
[void]$WIMG::WIMSetTemporaryPath($hWim, [Environment]::GetEnvironmentVariable('SystemDrive'))
$hImage = $WIMG::WIMLoadImage($hWim, 1)
[void]$WIMG::WIMExtractImagePath($hImage, $InnFile, $OutFile, 0)
[void]$WIMG::WIMCloseHandle($hImage)
[void]$WIMG::WIMCloseHandle($hWim)
}
: wimmsu :
: : ============
: EndDebug