Windows 10 UEFI mit BSOD 0xc000000e - Grund und Workaround

Hallo,

da ich etwas Langeweile hatte, habe ich mal wieder mit LMN7 herumprobiert. Dabei ist mir folgendes aufgefallen.

Immer wenn ein UEFI-Image mit Windows in eine neue Gruppe eingefügt und diese auf einen Client ausgerollt wird, gibt es einen BSOD mit 0xc000000e als Fehlermeldung. Das betrifft nur UEFI und kein BIOS/Legacy, da hier der Bootprozess anders abläuft.

Da 0xc000000e als Fehlermeldung eigentlich nur zwei Ursachen haben kann, bin ich diesen nachgegangen. Linbo kopiert die nötigen Dateien auf die EFI-Partition. Das funktioniert. Wenn die Dateien des Windows Bootloaders da und am richtigen Ort sind, dann bleibt nur noch, dass die uuid-Einträge in der BCD-Datei nicht stimmen und der Bootloader die falsche Festplatte/Partition sucht.

Wenn man ein UEFI-Image auf einen Client erstellt und in der gleichen Gruppe verteilt, dann erhalten die Festplatte /dev/sda und die Partitionen EFI (/dev/sda1) sowie Windows (/dev/sda3) von Linbo die gleiche uuid. Damit stimmen die uuid-Daten mit den in der BCD-Datei gespeicherten Werten überein und Windows startet normal.

Anders ist es, wenn Linbo das gleiche UEFI-Image in einer anderen Gruppe verteilt. Dann erhalten nur die EFI (/dev/sda1) sowie Windows (/dev/sda3) Partitionen die ursprüngliche uuid. Die Festplatte (dev/sda) erhält eine neue uuid. Wenn nun der Windows Bootloader vom UEFI des Rechners gestartet wird, dann sucht der Bootloader seine Dateien auf einer nicht im System vorhandenen Festplatte. Das führt zwangsläufig zu einem BSOD mit 0xc000000e. Wenn man nun auf dem defekten Client manuell z.B. mit gdisk am Linbo-Terminal der Festplatte die uuid aus der ursprünglichen Gruppe gibt, dann startet Windows wieder normal.

Linbo bindet scheinbar die uuid der Festplatte an die Gruppe, nicht an das Image. Somit ist es nicht möglich, ein UEFI-Image von Windows für verschiedene Gruppen zu nutzen.

Als Lösung bieten sich folgende Möglichkeiten an:

  • Linbo bindet in Zukunft die uuid der Festplatte genauso an das Image, wie es für die EFI- und Windows-Partition gemacht wird.
  • Für jede Gruppe wird das UEFI-Image repariert und eigenständig gepflegt. Das scheint hier im Forum der übliche Rat zu sein. Macht aber am meinsten Arbeit.
  • Per Postsync der Festplatte die uuid aus der ursprünglichen Gruppe verpassen. (Keine Ahnung, wie das geht. Ich nutze LMN nicht an der Schule und Linux auch nur in meiner Spielwiese für Experimente.)
  • Man erstellt einen universellen UEFI-Bootloader für Windows.

Hier eine Variante mit einem universellen UEFI-Bootloader für Windows:

Universeller UEFI-Bootloader für Windows

Das entsprechende UEFI-Windows starten und eine Eingabeaufforderung mit administrativen Rechten starten. Da folgende Befehle eingeben:

Zuerst:

echo %firmware_type%

Da sollte als Antwort UEFI kommen. Ansonsten wurde Windows im BIOS/Legacy Modus installiert.

Dann:

bcdedit /delete {bootmgr} /F
bcdedit /create {bootmgr}
bcdedit /set {bootmgr} device Boot
bcdedit /set {bootmgr} path \EFI\Microsoft\Boot\bootmgfw.efi
bcdedit /set {bootmgr} description "Windows Boot Manager"
bcdedit /set {bootmgr} locale de-DE
bcdedit /set {bootmgr} inherit {globalsettings}
bcdedit /set {bootmgr} default {current}
bcdedit /set {bootmgr} displayorder {current}
bcdedit /set {bootmgr} toolsdisplayorder {memdiag}
bcdedit /set {bootmgr} timeout 30
bcdedit /set {current} device locate=custom:12000002
bcdedit /set {current} osdevice locate=custom:22000002

sc config stornvme start=boot

Die Befehle löschen den bisherigen Windows Boot Manager und erstellen einen neuen mit Standartwerten. Die Option Boot weist Windows an, dass seine Startdateien auf der Festplatte/Partition liegen, von wo die Datei bootmgfw.efi gestartet wurde. Die Option locate lässt Windows nach einem Ordner Windows suchen. Der Bootloader entspricht dann weitgehend dem eines mit Sysprep generalisierten Images. Normale Updates funktionieren, jedoch ein Upgrade (Windows 1511 è 1809) wahrscheinlich nicht, da das Setup Programm bei dieser BCD-Datei eben von einer Sysprep-Image ausgeht, das erst installiert werden soll.

Das Verhalten des Windows Boot Manager entspricht dann ziemlich genau der Lösung von Linux/Grub mit den Labels.

Der Befehl sc config stornvme start=boot aktiviert den Treiber für NVME beim Bootvorgang. Dann ist es möglich, ein Image von einem Rechner mit SATA auf einen mit NVME zu übertragen. Normalerweise erledigt das Windows Setup solche Sachen, aber Linbo nutzt eine Methode, die von Microsoft nie unterstützt wurde. Daher muss man das manuell erledigen.

In einer ESXI-Umgebung hat das mit virtuellen Clients funktioniert.

Viel Spaß
Christian

6 „Gefällt mir“

Hallo Christian,

… starker Einstieg in ein neues Post :slight_smile:

… und das Ergebnis ist super: vielen Dank für den Hinweis und vor allem für die Anleitung.
Ich hatte bisher bemerkt, dass ich das Windows danach reparieren mußte, aber nie genau gewußt warum… jetzt sehe ich klarer.

Ich sag mal dem Entwickler bescheid: viellelicht kann man das in linbo einbauen (uuids dem Image zuordnen).

Aber den Bootloader einmal manipulieren (generalisieren) ist auch nicht schlecht.

LG

Holger

Hallo Christian,

vielen Dank für diese wertvolle Erkenntnis und Deinen Beitrag! Im Forum gibt es einige Threads, welche dieses Thema haben - alle ungelöst.

@baumhof
Holger, ich bitte Dich darum, daß man das so einbauen lässt, wie Du das vorhast. Also nicht nur die UUID der Partitionen zum Image zu speichern, sondern auch die UUID der Festplatte.

Viele Grüße
Klaus

Hallo Christian,

danke für die Forschungsarbeit. :+1:

Ich denke, das lässt sich Linbo seitig regeln ohne den Windows Bootmanager zu behelligen. Die Lösung mit dem Patchen der Disk-UUID werde ich mir mal anschauen.

VG, Thomas

2 „Gefällt mir“

Siehe Windows 10 UEFI throws BSOD 0xc000000e with new group #26.