@ECHO OFF
setlocal

set log=%~dp0F11patch.log
set mountdir=%TEMP%\f11patchmount
set partLabel=HP_RECOVERY
goto CHECKACCESS

:MAIN
for /f "usebackq delims== tokens=2" %%J in (`wmic volume where label^="%partLabel%" get DEVICEID /format:value`) do set name=%%J
IF [%name%] == [] goto NOWINREVOL
IF NOT EXIST %mountdir% mkdir %mountdir%
echo.Mounting %partLabel% at %mountdir% >> %log% && echo. >> %log%
wmic volume where label="%partLabel%" call AddMountPoint %mountdir% >> %log% 2>>&1 || CALL :UNABLETOMOUNT
echo. >> %log% && echo.Getting architecture we are running under... >> %log%
for /f "usebackq delims== tokens=2" %%I in (`wmic OS get OSArchitecture /format:value 2^>^> %log%`) do set osarch=%%I
echo.	Running under %osarch% >> %log% && echo. >> %log%
IF EXIST %mountdir%\Recovery\WindowsRE\winre.wim echo.Found WIM. No need to do anything. >> %log% && echo. >> %log% && goto END
IF NOT EXIST %mountdir%\Recovery\WindowsRE\winre.wim CALL :PROCPATCH %mountdir%\Recovery\WindowsRE\winre.wim %osarch:~0,2%

goto END

:PROCPATCH
echo.Processing Patch... >> %log% && echo. >> %log%
set winre=%1
set winrep=%~dp1
set arch=%2
set srcwim=%~dp0winre%arch%.wim
IF NOT EXIST %winrep% mkdir %winrep% && echo.Created destination directory >> %log% 2>>&1 && echo. >> %log%
echo.Copying %srcwim% >> %log%
copy /V /Z %srcwim% %winre% >> %log% 2>>&1
echo. >> %log%
echo.Checking for the BCD... >> %log%
IF EXIST %mountdir%\boot\bcd (
	echo.	Updating BCD device information... >> %log%
	bcdedit /store %mountdir%\boot\bcd /set {default} device ramdisk=[BOOT]\Recovery\WindowsRE\winre.wim,{ramdiskoptions} >> %log% 2>>&1
	bcdedit /store %mountdir%\boot\bcd /set {default} osdevice ramdisk=[BOOT]\Recovery\WindowsRE\winre.wim,{ramdiskoptions} >> %log% 2>>&1
	bcdedit /store %mountdir%\boot\bcd /set {ramdiskoptions} ramdisksdidevice BOOT >> %log% 2>>&1
	bcdedit /store %mountdir%\boot\bcd /set {bootmgr} locale en-US >> %log% 2>>&1 && echo. >> %log%
)

CALL :CLEANUP
goto :eof

:CLEANUP
wmic VOLUME where label="%partLabel%" call Dismount >> %log% 2>>&1 && rmdir %mountdir% >> %log% 2>>&1
goto :eof

:UNABLETOMOUNT
echo.Unable to mount the %partLabel% partition. >> %log%
SET SERROR=1
goto END

:NOTFINDWINREWIM
echo. >> %log%
echo.Unable to find the source winre.wim. Please verify patch media. >> %log%
SET SERROR=2
goto END

:NOWINREVOL
echo. >> %log%
echo.Unable to locate the %partLabel% volume. >> %log%
SET SERROR=3
goto END

:CHECKACCESS
set fname=Accchk.txt
echo.It is ok to delete this file. It was just used for checking access. > %windir%\System32\%fname%
IF NOT EXIST %windir%\System32\%fname% goto RUNADMIN
IF EXIST %windir%\System32\%fname% del /q /f %windir%\System32\%fname%
goto MAIN

:RUNADMIN
echo.
echo.The patch needs to run in Administrator mode.
echo.Please login as Administrator or right click on %0
echo.Select Run as Administrator.
echo.
echo.Not running in Admin mode displayed user message >> %log%
echo.Press any key to exit.
pause > nul
goto END

:END
IF EXIST %mountdir%\Recovery CALL :CLEANUP
echo. >> %log%
echo.Finished running the patch. >> %log%
IF NOT DEFINED SERROR IF EXIST %~dp0HPRMF.dll copy %~dp0HPRMF.dll %WINDIR%\SYSTEM32\HPRMF.dll && EXIT /B 0
IF [%SERROR%] == [3] echo.Consuming unable to find WinRE Volume error. Acceptable possible error. Exiting with no error. >> %log% && IF EXIST %~dp0HPRMF.dll copy %~dp0HPRMF.dll %WINDIR%\SYSTEM32\HPRMF.dll && EXIT /B 0
EXIT /B %SERROR%