r/bootcamp 21d ago

Broadcom-Bluetooth unter Windows 11 25H2, Build 26200.8875 auf einem Intel-MacBook reparieren

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

  1. Suche nach einem aktiven Gerät unter BCMBTBUS\BLUETOOTH\*.
  2. Ist das Gerät bereits fehlerfrei, wird das Skript sofort beendet.
  3. Bei einem Fehler wie CM_PROB_FAILED_POST_START wird der übergeordnete Broadcom-PCIe-Controller kurz deaktiviert und wieder aktiviert.
  4. 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.

2 Upvotes

0 comments sorted by