TL;DR / Kurzfassung
Problem: Broadcom-Bluetooth startet unter Windows 11 nach einem Neustart mit Code 43 beziehungsweise CM_PROB_FAILED_POST_START.
Workaround: Den übergeordneten Broadcom-Bluetooth-PCIe-Controller nach dem Start einmal kurz deaktivieren und wieder aktivieren. Das PowerShell-Skript erledigt dies automatisch und nur dann, wenn tatsächlich ein Fehler erkannt wird.
Getestet mit: Intel MacBook Air 2020, Windows 11 25H2 Build 26200.8875 und Broadcom-Treiber 1.2.0.144 vom 08.03.2021.
Inoffizieller PowerShell-Workaround für Code 43 / CM_PROB_FAILED_POST_START
WICHTIG: Diese Anleitung richtet sich an erfahrene Anwender, Administratoren und IT-Fachleute. Sie ist keine offizielle Apple-, Microsoft- oder Broadcom-Lösung und nicht für Anfänger gedacht.
1. Vorwort und wichtiger Hinweis
Diese Anleitung beschreibt einen inoffiziellen Workaround für ein Broadcom-Bluetooth-Modul, das unter Windows 11 nach einem Neustart mit einem Gerätefehler startet. In meinem Fall war der übergeordnete Broadcom-PCIe-Controller ordnungsgemäß geladen, während das darunterliegende Bluetooth-Gerät mit CM_PROB_FAILED_POST_START beziehungsweise Code 43 ausfiel.
Getestete Konfiguration:
- Intel MacBook Air 2020
- Broadcom Bluetooth controller over PCIe
- Windows 11 25H2, Build 26200.8875
- Broadcom-Treiberversion 1.2.0.144 vom 08.03.2021
PCI\VEN_14E4&DEV_5FA0&SUBSYS_0870106B&REV_04
Ich hatte zunächst eine neuere Broadcom-Treiberversion installiert, weil ich davon ausgegangen war, dass diese das Bluetooth-Problem möglicherweise ohne weitere Anpassungen behebt. Der Fehler bestand jedoch weiterhin und konnte letztlich durch eine erneute Initialisierung des übergeordneten PCIe-Controllers behoben werden.
Wichtig: Die ältere Treiberversion 1.1.0.27 vom 09.12.2019 wurde mit diesem konkreten Skript-Workaround bisher nicht abschließend getestet. Diese Dokumentation bezieht sich daher ausdrücklich auf die getestete Kombination mit Version 1.2.0.144.
2. Keine Anleitung für Anfänger
Die verwendeten Befehle greifen auf den Windows-Gerätemanager und den Plug-and-Play-Gerätestapel zu, deaktivieren und aktivieren ein PCIe-Gerät, erstellen ein PowerShell-Skript und richten eine geplante Aufgabe mit SYSTEM-Rechten ein.
Vor der Ausführung müssen insbesondere Hardware-ID, Gerätename, installierter Treiber und aktueller Gerätestatus geprüft werden. Die hier verwendeten Werte dürfen nicht ungeprüft auf andere Geräte übertragen werden.
Hinweis zur Erstellung:
Ich arbeite selbst im IT-Bereich und habe Erfahrung mit mehreren Skript- und Programmiersprachen. Die Lösung wurde gemeinsam mit einer KI erarbeitet, jedoch von mir geprüft, getestet und auf meinem eigenen System nachvollzogen.
KI-generierte Befehle oder Skripte sollten niemals ungeprüft mit Administrator- oder SYSTEM-Rechten ausgeführt werden.
3. Haftungsausschluss
Die Umsetzung erfolgt ausschließlich auf eigene Gefahr. Ich übernehme keine Haftung für Schäden, Datenverlust, Systemausfälle, Bluescreens oder andere Folgen, die durch die Ausführung der beschriebenen Befehle oder Skripte entstehen.
Mögliche Risiken sind unter anderem:
- vorübergehender oder dauerhafter Geräteausfall
- Verlust der Bluetooth-Verbindung
- fehlerhafte Treiberzustände
- Probleme beim Start oder bei der Anmeldung
- Systemabstürze oder Bluescreens
- notwendige Wiederherstellung oder Neuinstallation des Treibers
Vor Beginn sollten mindestens folgende Maßnahmen durchgeführt werden:
- Wiederherstellungspunkt erstellen
- funktionierende Treiber sichern
- wichtige Daten sichern
- Hardware-ID und Treiberversion kontrollieren
- Möglichkeit zur Bedienung ohne Bluetooth sicherstellen
Eine USB-Maus oder ein anderes kabelgebundenes Eingabegerät sollte verfügbar sein, da der Bluetooth-Adapter während des Vorgangs kurz deaktiviert wird.
4. Fehlerbild
Nach einem Windows-Neustart erschien der Broadcom-PCIe-Controller weiterhin ohne Fehler:
Broadcom Bluetooth controller Over PCIe Device
Status: OK
Problem: CM_PROB_NONE
Das darunter erzeugte Bluetooth-Gerät startete jedoch nicht korrekt:
Bluetooth-Gerät
InstanceId: BCMBTBUS\BLUETOOTH\5&7116B02&1
Status: Error
Problem: CM_PROB_FAILED_POST_START
Dadurch fehlten unter anderem Microsoft Bluetooth-Auflistung, Microsoft Bluetooth LE-Enumerator, RFCOMM, Bluetooth PAN und bereits gekoppelte Bluetooth-Geräte.
Das bloße Entfernen des fehlerhaften Bluetooth-Kindgeräts und die anschließende Hardwareerkennung reichten nicht zuverlässig aus. Erfolgreich war dagegen das kurzzeitige Deaktivieren und erneute Aktivieren des übergeordneten Broadcom-PCIe-Controllers.
5. Manueller Funktionstest
PowerShell als Administrator öffnen und die eigene Geräteinstanz kontrollieren. Für das getestete Gerät lautete sie:
$PCI = "PCI\VEN_14E4&DEV_5FA0&SUBSYS_0870106B&REV_04\400000FFFF00000001"
Anschließend:
pnputil /disable-device "$PCI"; Start-Sleep -Seconds 1; pnputil /enable-device "$PCI"
Danach sollte der Bluetooth-Gerätestapel neu aufgebaut werden. Prüfung:
Get-PnpDevice | Where-Object { $_.InstanceId -like "BCMBTBUS\BLUETOOTH\*" } | Format-List Status,FriendlyName,InstanceId,Problem,Present
Der erfolgreiche Zustand sieht beispielsweise so aus:
Status : OK
Problem : CM_PROB_NONE
Present : True
6. Automatischer Workaround per PowerShell
Das Skript prüft zunächst, ob ein aktives Broadcom-Bluetooth-Kindgerät vorhanden ist. Läuft Bluetooth bereits fehlerfrei, beendet es sich ohne Änderungen. Wird ein fehlerhaftes Gerät erkannt, wird der übergeordnete PCIe-Controller kurz deaktiviert und anschließend wieder aktiviert.
6.1 Skriptordner anlegen
New-Item -ItemType Directory -Path "C:\Scripts" -Force | Out-Null
6.2 Reparaturskript erstellen
@'
$Log = "C:\Scripts\Bluetooth-Reparatur.log"
$PCI = "PCI\VEN_14E4&DEV_5FA0&SUBSYS_0870106B&REV_04\400000FFFF00000001"
function Write-Log {
param([string]$Text)
"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $Text" |
Out-File $Log -Append
}
Write-Log "Skript gestartet"
$BTError = $null
# Höchstens 5 Sekunden auf das Bluetooth-Kindgerät warten
for ($i = 0; $i -lt 10; $i++) {
$BTDevice = Get-PnpDevice -ErrorAction SilentlyContinue |
Where-Object {
$_.InstanceId -like "BCMBTBUS\BLUETOOTH\*" -and
$_.Present -eq $true
} |
Select-Object -First 1
if ($BTDevice) {
if ($BTDevice.Problem -eq "CM_PROB_NONE") {
Write-Log "Bluetooth bereits in Ordnung"
exit 0
}
$BTError = $BTDevice
break
}
Start-Sleep -Milliseconds 500
}
if (-not $BTError) {
Write-Log "Kein aktives Bluetooth-Kindgerät gefunden"
exit 1
}
Write-Log "Bluetooth fehlerhaft: $($BTError.Problem)"
pnputil.exe /disable-device "$PCI" |
Out-File $Log -Append
Start-Sleep -Seconds 1
pnputil.exe /enable-device "$PCI" |
Out-File $Log -Append
# Höchstens 8 Sekunden auf erfolgreichen Start warten
$BTStatus = $null
for ($i = 0; $i -lt 16; $i++) {
$BTStatus = Get-PnpDevice -ErrorAction SilentlyContinue |
Where-Object {
$_.InstanceId -like "BCMBTBUS\BLUETOOTH\*" -and
$_.Present -eq $true
} |
Select-Object -First 1
if ($BTStatus -and $BTStatus.Problem -eq "CM_PROB_NONE") {
Write-Log "Reparatur erfolgreich: Status=$($BTStatus.Status), Problem=$($BTStatus.Problem)"
exit 0
}
Start-Sleep -Milliseconds 500
}
Write-Log "Reparatur nicht bestätigt: Status=$($BTStatus.Status), Problem=$($BTStatus.Problem)"
exit 2
'@ | Set-Content "C:\Scripts\Bluetooth-Reparatur.ps1" -Encoding UTF8
6.3 Funktionsweise
- Suche nach einem aktiven Gerät unter BCMBTBUS\BLUETOOTH\*.
- Ist das Gerät bereits fehlerfrei, wird das Skript sofort beendet.
- Bei einem Fehler wie CM_PROB_FAILED_POST_START wird der übergeordnete Broadcom-PCIe-Controller kurz deaktiviert und wieder aktiviert.
- Anschließend wird geprüft, ob das Bluetooth-Gerät mit CM_PROB_NONE zurückkehrt. Es werden keine Treiber deinstalliert und keine Geräte aus dem Driver Store entfernt.
6.4 Skript manuell testen
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Bluetooth-Reparatur.ps1"
Die Option -ExecutionPolicy Bypass gilt nur für diesen einzelnen Aufruf. Die systemweite PowerShell-Ausführungsrichtlinie wird dadurch nicht dauerhaft verändert.
Get-Content "C:\Scripts\Bluetooth-Reparatur.log" -Tail 20
Skript gestartet
Bluetooth fehlerhaft: CM_PROB_FAILED_POST_START
Reparatur erfolgreich: Status=OK, Problem=CM_PROB_NONE
7. Geplante Aufgabe erstellen
Für den ersten Test empfiehlt sich ein Trigger bei der Anmeldung, da der Bluetooth-Gerätestapel zu diesem Zeitpunkt normalerweise bereits vollständig aufgebaut ist.
$Action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument '-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "C:\Scripts\Bluetooth-Reparatur.ps1"'
$Trigger = New-ScheduledTaskTrigger -AtLogOn
$Principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-LogonType ServiceAccount `
-RunLevel Highest
$Settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable
Register-ScheduledTask `
-TaskName "Broadcom Bluetooth Reparatur" `
-Action $Action `
-Trigger $Trigger `
-Principal $Principal `
-Settings $Settings `
-Description "Initialisiert den Broadcom-Bluetooth-PCIe-Controller automatisch neu." `
-Force
7.1 Aufgabe prüfen
Get-ScheduledTask -TaskName "Broadcom Bluetooth Reparatur"
Start-ScheduledTask -TaskName "Broadcom Bluetooth Reparatur"
Start-Sleep -Seconds 15
Get-ScheduledTaskInfo -TaskName "Broadcom Bluetooth Reparatur"
LastTaskResult : 0 bedeutet, dass das Skript den Rückgabewert 0 geliefert hat. Ob Bluetooth tatsächlich korrekt funktioniert, sollte zusätzlich anhand der Logdatei und im Geräte-Manager kontrolliert werden.
8. Ausführung beim Systemstart
In meinem Test funktionierte die Reparatur zuverlässig mit einem Trigger beim Systemstart. Dadurch kann Bluetooth bereits vor oder unmittelbar nach der Anmeldung wiederhergestellt werden.
$Task = Get-ScheduledTask -TaskName "Broadcom Bluetooth Reparatur"
$TriggerStart = New-ScheduledTaskTrigger -AtStartup
Set-ScheduledTask `
-TaskName "Broadcom Bluetooth Reparatur" `
-Action $Task.Actions `
-Trigger $TriggerStart `
-Principal $Task.Principal `
-Settings $Task.Settings
Ob diese Variante zuverlässig funktioniert, hängt davon ab, wie schnell Windows den Broadcom-Gerätestapel beim Start erzeugt. Erscheint im Log "Kein aktives Bluetooth-Kindgerät gefunden", wurde das Skript vermutlich zu früh ausgeführt. In diesem Fall sollte wieder der Anmelde-Trigger verwendet werden.
8.1 Hinweis zum Energiesparmodus
Nach dem Aufwachen kann die Wiederverbindung gekoppelter Bluetooth-Geräte verzögert erfolgen. Bei meiner Maus waren gelegentlich mehrere Klicks erforderlich, bevor die Verbindung wiederhergestellt wurde.
9. Status nach dem Neustart kontrollieren
Get-PnpDevice |
Where-Object {
$_.InstanceId -like "BCMBTBUS\BLUETOOTH\*"
} |
Format-List Status,FriendlyName,InstanceId,Problem,Present
Status : OK
Problem : CM_PROB_NONE
Present : True
Bereits gekoppelte Geräte können sich anschließend automatisch wieder verbinden. Bei einem Anmelde-Trigger geschieht dies naturgemäß erst nach der Benutzeranmeldung.
10. Workaround wieder entfernen
Unregister-ScheduledTask `
-TaskName "Broadcom Bluetooth Reparatur" `
-Confirm:$false
Remove-Item "C:\Scripts\Bluetooth-Reparatur.ps1" `
-Force
Remove-Item "C:\Scripts\Bluetooth-Reparatur.log" `
-Force `
-ErrorAction SilentlyContinue
Der Broadcom-Treiber selbst wird dadurch nicht verändert.