REM ========================================================
REM   Template Version: 2.00
REM   WinPE online drvload
REM ========================================================

@ECHO OFF
SETLOCAL
SET APP_NAME=Windows 10 HP Image Enhancements - CPS - Online Driver Install for WinPE
SET APP_LOG=%~dp0%~n0.LOG

ECHO ############################################################# >> %APP_LOG%
ECHO  [%DATE%]                                                     >> %APP_LOG%
ECHO  [%TIME%] Beginning of the %~nx0                              >> %APP_LOG%
ECHO ############################################################# >> %APP_LOG%

REM ------------------- Script Entry ------------------------
ECHO [%TIME%] Start %APP_NAME% >>%APP_LOG%

set "CalebWMI=X:\Windows\System32\CalebWMI_%PROCESSOR_ARCHITECTURE%.exe"
if not exist "%CalebWMI%" echo %CalebWMI% lost >> %APP_LOG% & goto RESULTFAILED

:Initial
echo [%TIME%] wpeinit.exe >>%APP_LOG%
wpeinit.exe
echo [%TIME%] Errorlevel=%errorlevel% >>%APP_LOG%

set SystemId=
for /F "tokens=1,2,* delims= " %%A IN ('reg query HKLM\HARDWARE\DESCRIPTION\System\BIOS /v BaseBoardProduct') do if /I "%%~A"=="BaseBoardProduct" if /I "%%~B"=="REG_SZ" set "SystemId=%%~C"
if not defined SystemId echo Unknow System Id >> %APP_LOG% & goto RESULTFAILED
echo System Id=[%SystemId%] >>%APP_LOG%

:DrvInst
set isFail=
pushd "%~dp0"
for /f "delims=" %%i in ('dir /ad /b "*"') do (
	echo [%TIME%] Found "%%~i", checking %SystemId% in sysid.txt. >>%APP_LOG%
	pushd "%%~i"
	call :DrvInst_Each_Det
	popd
)
popd
:DrvInst_END

:MULTI_GEN_RSTCLI
dir /s /b X:\winpe_online\RSTCLI\rstcli*.exe
if errorlevel 1 echo No any RSTCLI in X:\winpe_online\RSTCLI, skip replacement >>%APP_LOG% & goto MULTI_GEN_RSTCLI_END
echo There's X:\winpe_online\RSTCLI\rstcli*.exe, check for multi-version >>%APP_LOG%
call "%~dp0SUB_setRSTCLI.cmd" "X:\winpe_online\RSTCLI" >>%APP_LOG% 2>&1
if errorlevel 1 set "isFail=1" & echo Failed to get RSTCLI >>%APP_LOG%
echo xcopy /y /f "%RSTCLI%" "X:\System.sav\Exclude\rstcli\" >>%APP_LOG%
     xcopy /y /f "%RSTCLI%" "X:\System.sav\Exclude\rstcli\" >>%APP_LOG% 2>&1
if errorlevel 1 set "isFail=1" & echo Failed to copy RSTCLI >>%APP_LOG%
:MULTI_GEN_RSTCLI_END


if defined isFail goto RESULTFAILED
GOTO RESULTPASSED

:RESULTPASSED
ECHO [%TIME%] Result of the %APP_NAME% >> %APP_LOG%
ECHO RESULT=PASSED >> %APP_LOG%
GOTO END

:RESULTFAILED
ECHO [%TIME%] Result of the %APP_NAME% >> %APP_LOG%
ECHO RESULT=FAILED >> %APP_LOG%
GOTO END






:GetWP
echo Finding drive letter: WP 
set WP=
REM for /F "skip=2 tokens=2 delims=,:" %%L IN ('Wmi___c path Win32_LogicalDisk where ^(FreeSpace^!^=null AND DriveType^=3^) get DeviceID /format:csv') do (
for /F "skip=2 tokens=2 delims=,:" %%L IN ('CalebWMI_%PROCESSOR_ARCHITECTURE%.exe /WQL:"select DeviceID from Win32_LogicalDisk where (FreeSpace!=null AND DriveType=3)" /format:csv') do (
	if /I [%%L:]==[X:] echo "Skip: %%L:" 
	echo "Checking: %%L:" 
	if exist "%%L:\SYSTEM.SAV\cpqdl.ini"    echo cpqdl.ini found, set to WP  & set "WP=%%L:" & exit /b 0
	if exist "%%L:\SYSTEM.SAV\flags\UP.flg" echo UP.flg    found, set to WP  & set "WP=%%L:" & exit /b 0
)
if not defined WP echo [ERROR] Cannot find drive letter  & exit /b 1


:checkHwidTxt
REM wmi___c path Win32_PnPEntity get DeviceID > "%~dpn0_pnpentity.lst"
CalebWMI_%PROCESSOR_ARCHITECTURE%.exe /WQL:"select DeviceID from Win32_PnPEntity" > "%~dpn0_pnpentity.lst"
for /F "tokens=1,* delims==" %%A IN ('type "%~1"') do (
	echo find /I "%%~B" "%~dpn0_pnpentity.lst"
		 find /I "%%~B" "%~dpn0_pnpentity.lst"
	if not errorlevel 1 echo HWID match & exit /b 0
)
echo All HWID mismatch
exit /b 1


:DrvInst_Each_Det
	if exist "sysid.txt" (
		find /i "%SystemId%" "sysid.txt" >nul 2>&1
		if errorlevel 1 echo SysId mismatch >>%APP_LOG% & exit /b -1
		echo SysID match, check next rule >>%APP_LOG%
	)
	if exist "hwid.txt" (
		call :checkHwidTxt "hwid.txt" >>%APP_LOG% 2>&1
		if errorlevel 1 echo HWID mismatch >>%APP_LOG% & exit /b -1
		echo HWID match, check next rule >>%APP_LOG%
	)
	echo Meet all rules, online drvload folder. >>%APP_LOG%

	set timeoutSecondsAfterDrvload=
	if exist "timeout.txt" for /F "tokens=1,2 delims==" %%A IN ('type "timeout.txt"') do if /I "%%~A"=="timeout" set "timeoutSecondsAfterDrvload=%%~B"
	echo Timeout [%timeoutSecondsAfterDrvload%] seconds after drvload each INF >>%APP_LOG%

	for /f "delims=" %%i in ('dir /a-d /b /s "*.inf"') do (
		echo drvload.exe "%%~i" >>%APP_LOG%
		     drvload.exe "%%~i" >>%APP_LOG% 2>&1
		if Errorlevel 1 set "isFail=1" & echo RESULT=FAILED >>%APP_LOG%
		if defined timeoutSecondsAfterDrvload ( ping localhost -n %timeoutSecondsAfterDrvload% >>%APP_LOG% 2>&1 )
	)
exit /b 0

:END
call :GetWP
if not errorlevel 1 (
	echo WP=[%WP%] >>%APP_LOG%
	if not exist "%WP%\System.sav\IVT" (
		if not exist "%WP%\System.sav\Logs\ImgEnh" mkdir "%WP%\System.sav\Logs\ImgEnh"
		type "%APP_LOG%" >> "%WP%\System.sav\Logs\ImgEnh\%~n0.LOG"
	)
)
ENDLOCAL
@ECHO ON
