summaryrefslogtreecommitdiff
path: root/.github/crashdetect/CrashDetectOsReinstall.cmd
diff options
context:
space:
mode:
Diffstat (limited to '.github/crashdetect/CrashDetectOsReinstall.cmd')
-rw-r--r--.github/crashdetect/CrashDetectOsReinstall.cmd258
1 files changed, 258 insertions, 0 deletions
diff --git a/.github/crashdetect/CrashDetectOsReinstall.cmd b/.github/crashdetect/CrashDetectOsReinstall.cmd
new file mode 100644
index 00000000..faebb443
--- /dev/null
+++ b/.github/crashdetect/CrashDetectOsReinstall.cmd
@@ -0,0 +1,258 @@
+@echo off
+setlocal EnableExtensions EnableDelayedExpansion
+
+echo CrashDetectOsReinstall.cmd...START
+
+echo Searching for the USB drive volume letter...
+set "USB="
+
+for %%D in (D E F G H I J K L M N O P Q R S T U V W Y Z) do (
+ if exist "%%D:\Scripts\CrashDetectOsReinstall.cmd" (
+ set "USB=%%D"
+ echo Found USB at drive volume letter !USB!:
+ )
+)
+
+if not defined USB (
+ echo ERROR: Did not find USB drive volume letter
+ goto error
+)
+
+if not exist "!USB!:\Logs" (
+ echo Creating Logs directory on USB
+ mkdir "!USB!:\Logs"
+)
+set "LOG=!USB!:\Logs\CrashDetectOsReinstall.log"
+echo Created log file "%LOG%" on USB
+echo [%DATE% %TIME%] CrashDetectOsReinstall.cmd...START >> "%LOG%"
+echo [%DATE% %TIME%] Found USB at drive volume letter !USB!: >> "%LOG%"
+
+set "FLAG_RETRIES=!USB!:\Logs\Retries.flg"
+set "FLAG_INSTALLOS=!USB!:\Logs\InstallOs.flg"
+set "FLAG_DEPLOYOSDONE=!USB!:\Logs\DeployOsDone.flg"
+
+
+:installos
+if exist "%FLAG_INSTALLOS%" (
+ if exist "%FLAG_DEPLOYOSDONE%" (
+ echo OS reinstall done.
+ echo [%DATE% %TIME%] OS reinstall done. >> "%LOG%"
+ del "%FLAG_INSTALLOS%" >> "%LOG%" 2>&1
+ del "%FLAG_DEPLOYOSDONE%" >> "%LOG%" 2>&1
+ goto reboot
+ )
+ echo Reinstalling OS...
+ echo [%DATE% %TIME%] Reinstalling OS... >> "%LOG%"
+ goto deployos
+)
+
+
+:detectcrash
+if exist "C:\Windows\Minidump\" (
+ echo OS crashed on last reboot into the OS!
+ echo [%date% %time%] OS crashed on last reboot into the OS! >> "%LOG%"
+
+ set "MININAME="
+ for %%F in ("C:\Windows\Minidump\*.dmp") do (
+ set "MININAME=%%~nF"
+ echo Minidump filename: !MININAME! >> "%LOG%"
+ )
+
+ echo Backing up Minidump files...
+ copy /y "C:\Windows\Minidump\*.dmp" "!USB!:\Logs" >> "%LOG%" 2>&1
+ if !errorlevel! neq 0 (
+ echo ERROR: Failed to back up Mini dump file
+ echo [%date% %time%] ERROR: Failed to back up Mini dump file >> "%LOG%"
+ )
+ rmdir /s /q "C:\Windows\Minidump" >> "%LOG%" 2>&1
+ if !errorlevel! neq 0 (
+ echo ERROR: Failed to delete Minidump folder
+ echo [%date% %time%] Failed to delete Minidump folder >> "%LOG%"
+ )
+
+ if exist "C:\Windows\MEMORY.DMP" (
+ if defined MININAME (
+ ren "C:\Windows\MEMORY.DMP" "MEMORY-!MININAME!.DMP" >> "%LOG%" 2>&1
+ )
+ if !errorlevel! neq 0 (
+ echo ERROR: Failed to rename MEMORY.DMP file
+ echo [%date% %time%] ERROR: Failed to rename MEMORY.DMP file >> "%LOG%"
+ echo Backing up MEMORY.DMP file...
+ copy /y "C:\Windows\MEMORY.DMP" "!USB!:\Logs" >> "%LOG%" 2>&1
+ ) else (
+ echo Backing up MEMORY-!MININAME!.DMP file...
+ copy /y "C:\Windows\MEMORY-!MININAME!.DMP" "!USB!:\Logs" >> "%LOG%" 2>&1
+ )
+ if !errorlevel! neq 0 (
+ echo ERROR: Failed to back up MEMORY.DMP file
+ echo [%date% %time%] ERROR: Failed to back up MEMORY.DMP file >> "%LOG%"
+ )
+ )
+
+ echo Done trying to back up files to USB
+ echo [%date% %time%] Done trying to back up files to USB >> "%LOG%"
+ goto retry
+) else (
+ rem If OS crashed just now, it will be detected on next reboot.
+ rem Minidump folder used for crash detection is not created yet on automatic first crash reboot until OS is loaded.
+ echo No OS crash on last reboot into the OS.
+ echo [%date% %time%] No OS crash on last reboot into the OS. >> "%LOG%"
+ if exist %FLAG_RETRIES% (
+ del %FLAG_RETRIES% >> "%LOG%" 2>&1
+ )
+ goto reboot
+)
+
+
+:retry
+set "TRIES=0"
+rem Retries are always one less than actual crashes because first crash is not detected.
+set "MAX_RETRIES=2"
+
+if not exist "%FLAG_RETRIES%" (
+ echo Creating "%FLAG_RETRIES%" with default retries set to 0 >> "%LOG%"
+ echo RETRIES=0 > "%FLAG_RETRIES%"
+)
+
+for /f "tokens=1,2 delims==" %%A in (%FLAG_RETRIES%) do (
+ if /i "%%A"=="RETRIES" (
+ set "TRIES=%%B" >> "%LOG%" 2>&1
+ )
+)
+
+set /a TRIES+=0 2>nul >> "%LOG%" 2>&1
+set /a TRIES+=1 >> "%LOG%" 2>&1
+echo RETRIES=!TRIES! > %FLAG_RETRIES%
+
+echo Current OS boot retries: !TRIES!
+echo Current OS boot retries: !TRIES! >> "%LOG%"
+if !TRIES! GEQ %MAX_RETRIES% (
+ echo Max %MAX_RETRIES% retries reached, reinstalling OS...
+ del %FLAG_RETRIES% >> "%LOG%" 2>&1
+ type nul > %FLAG_INSTALLOS%
+ goto installos
+) else (
+ echo Max %MAX_RETRIES% retries allowed, booting into OS...
+ goto reboot
+)
+
+
+:deployos
+rem Image index is the OS edition to install from a multi-edition OS install image.
+rem For "Windows 11 25H2" image, "Windows 11 Pro" is the 6th item on the list of editions available.
+rem Adjust accordingly to install other OS editions.
+rem For single edition OS images, set index to 1.
+set "IMAGE_INDEX=6"
+set "TARGET_DISK=0"
+set "SYSTEM_DRIVE=S"
+set "SYSTEM_LABEL=System"
+set "TARGET_DRIVE=W"
+set "TARGET_LABEL=TestOS"
+set "INSTALL_WIM=install.wim"
+set "UNATTEND_XML=Unattend.xml"
+
+echo Setting flag InstallOs.flg for CrashDetectOsReinstall.cmd autorun script to detect OS install. >> "%LOG%"
+type nul > "%FLAG_INSTALLOS%"
+
+echo [1/8] Creating DiskPart script...
+echo [%DATE% %TIME%] [1/8] Creating DiskPart script... >> "%LOG%"
+(
+echo select disk "%TARGET_DISK%"
+echo clean
+echo convert gpt
+echo create partition efi size=100
+echo format quick fs=fat32 label="%SYSTEM_LABEL%"
+echo assign letter="%SYSTEM_DRIVE%"
+echo create partition msr size=16
+echo create partition primary
+echo format quick fs=ntfs label="%TARGET_LABEL%"
+echo assign letter="%TARGET_DRIVE%"
+) > X:\diskpart.txt
+
+echo [2/8] Partitioning target disk...
+echo [%DATE% %TIME%] [2/8] Partitioning target disk... >> "%LOG%"
+diskpart /s X:\diskpart.txt >> "%LOG%" 2>&1
+if errorlevel 1 (
+ echo ERROR: DiskPart failed. See %LOG%
+ goto error
+)
+
+echo [3/8] Applying OS WIM image...
+echo [%DATE% %TIME%] [3/8] Applying image... >> "%LOG%"
+dism /Apply-Image /ImageFile:"!USB!:\Images\%INSTALL_WIM%" /Index:"%IMAGE_INDEX%" /ApplyDir:"%TARGET_DRIVE%":\ >> "%LOG%" 2>&1
+if errorlevel 1 (
+ echo ERROR: DISM apply failed. See %LOG%
+ goto error
+)
+
+echo [4/8] Copying "%UNATTEND_XML%"...
+echo [%DATE% %TIME%] [4/8] Copying %UNATTEND_XML%... >> "%LOG%"
+if not exist "%TARGET_DRIVE%:\Windows\Panther" (
+ mkdir "%TARGET_DRIVE%:\Windows\Panther" >> "%LOG%" 2>&1
+)
+copy /y "!USB!:\Scripts\%UNATTEND_XML%" "%TARGET_DRIVE%:\Windows\Panther\%UNATTEND_XML%" >> "%LOG%" 2>&1
+if errorlevel 1 (
+ echo ERROR: Failed to copy %UNATTEND_XML%. See %LOG%
+ echo [%DATE% %TIME%] ERROR: Failed to copy %UNATTEND_XML%. >> %LOG%
+ goto error
+)
+
+echo [5/8] Creating boot files...
+echo [%DATE% %TIME%] [5/8] Creating boot files... >> "%LOG%"
+bcdboot W:\Windows /s S: /f UEFI >> "%LOG%" 2>&1
+if errorlevel 1 (
+ echo ERROR: BCDBOOT failed. See %LOG%
+ goto error
+)
+
+echo [6/8] Setting one-time bootsequence to OS boot manager...
+echo [%DATE% %TIME%] [6/8] Setting one-time bootsequence to OS boot manager... >> "%LOG%"
+bcdedit /set {fwbootmgr} bootsequence {bootmgr}
+echo bcdedit /set {fwbootmgr} bootsequence {bootmgr} >> "%LOG%"
+if errorlevel 1 (
+ echo ERROR: BCDEDIT /set {fwbootmgr} bootsequence {bootmgr} failed. See "%LOG%"
+ goto error
+)
+
+echo [7/8] Deployment complete.
+echo [%DATE% %TIME%] [7/8] Deployment complete. >> "%LOG%"
+echo Deployment complete. >> "%LOG%"
+echo Setting flag DeployOsDone.flg for script to detect OS install complete and boot into OS.
+type nul > "%FLAG_DEPLOYOSDONE%"
+
+echo [8/8] Rebooting into OS in 10sec...
+echo [%DATE% %TIME%] [8/8] Rebooting into OS in 10sec... >> "%LOG%"
+rem Simulate timeout with ping (10 sec)
+ping -n 11 127.0.0.1 >nul
+wpeutil reboot >> "%LOG%" 2>&1
+
+
+:reboot
+echo Rebooting into OS in 10sec...
+echo [%DATE% %TIME%] Rebooting into OS... >> "%LOG%"
+rem Force next boot into Windows boot manager.
+bcdedit /set {fwbootmgr} bootsequence {bootmgr} >> "%LOG%" 2>&1
+if errorlevel 1 (
+ echo ERROR: BCDEDIT /set {fwbootmgr} bootsequence {bootmgr} - failed. See "%LOG%"
+ goto error
+)
+rem Disable WinRE prompt to attempt system recovery, which requires user intervention.
+bcdedit /set {default} recoveryenabled no >> "%LOG%" 2>&1
+if errorlevel 1 (
+ echo ERROR: BCDEDIT /set {default} recoveryenabled no - failed. See "%LOG%"
+)
+rem Simulate timeout with ping (10 sec)
+ping -n 11 127.0.0.1 >nul
+wpeutil reboot >> "%LOG%" 2>&1
+
+
+:error
+echo CrashDetectOsReinstall.cmd...ERROR! See "%LOG%"
+echo [%DATE% %TIME%] CrashDetectOsReinstall.cmd...ERROR! >> "%LOG%"
+exit /b 1 >> "%LOG%" 2>&1
+
+
+:done
+echo CrashDetectOsReinstall.cmd...DONE!
+echo [%DATE% %TIME%] CrashDetectOsReinstall.cmd...DONE! >> "%LOG%"
+exit /b 0 >> "%LOG%" 2>&1