#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : A cloned or imaged drive will not boot, or has the wrong drive letter Fix : Give the clone the storage driver it needs Source: https://jbtecwiz.com/support/win-rec-clone-drive Run as : WinRE, or the firmware Expect : 45 minutes Risk : medium Reversible : yes WHEN THIS IS THE RIGHT FIX 0x7B on the clone, particularly when moving between machines or from SATA to NVMe. HOW TO UNDO IT Firmware modes can be switched back; always clear the safeboot flag. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 5" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' A cloned or imaged drive will not boot, or has the wrong drive letter' -ForegroundColor White Write-Host ' Give the clone the storage driver it needs' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium Reversible 45 minutes' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Check the firmware''s storage mode first -- switching between AHCI, RAID and Intel VMD is the usual cause and switching it back is free.' -Why 'Windows only loads the storage driver it was installed with. A machine moved from AHCI to RAID has no driver for the controller it now has, and it stops at 0x7B before anything can be logged.' -Manual Invoke-Step -Number 2 -Do 'If the mode must change, pre-enable the driver before switching. From a working boot, put Windows into safe mode once so it loads the alternative drivers.' -Command { cmd.exe /c 'bcdedit /set {current} safeboot minimal & shutdown /r /t 0' } Invoke-Step -Number 3 -Do 'Change the firmware mode while it is in safe mode, boot once, then remove the flag.' -Command { cmd.exe /c 'bcdedit /deletevalue {current} safeboot & shutdown /r /t 0' } Invoke-Step -Number 4 -Do 'If the machine is already at 0x7B, inject the storage driver offline from WinRE.' -Command { cmd.exe /c 'DISM /Image:D:\ /Add-Driver /Driver:E:\storagedriver\iaStorVD.inf' } Invoke-Step -Number 5 -Do 'For a clone moving to different hardware entirely, run sysprep generalize on the source before imaging, which removes the hardware-specific configuration.' -Manual Write-Rule " Confirm it worked" Show-Prose 'The clone boots and the storage controller appears correctly in Device Manager.' 'White' Write-Host '' if (-not $DryRun) { Get-PnpDevice -Class SCSIAdapter | Format-Table Status,FriendlyName } Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/win-rec-clone-drive' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Firmware modes can be switched back; always clear the safeboot flag.' 'DarkGray' Write-Rule