Debugging the Drivers
Kernel drivers do not write normal log files to disk. Instead they use Event Tracing for Windows (ETW), which you capture from the command line using etwutils.
BthPS3 ships instrumentation manifests (BthPS3.man, BthPS3PSM.man) for structured events. Verbose WPP-style tracing below is still off until you enable it once.
Prerequisites
Install the .NET SDK
etwutils is a .NET global tool and requires the .NET 8, 9, or 10 SDK (not the runtime-only install) on Windows.
Download it from dot.net and run the installer. Once done, open a new terminal and verify:
PowerShell
dotnet --version
Install etwutils
Administrator required
ETW session creation requires an elevated process. Open PowerShell as Administrator for all commands in this guide (press Win+X and choose it from the menu).
PowerShell (as Administrator)
dotnet tool install -g Nefarius.Utilities.ETW.CLI
This makes the etwutils command available on your PATH. For full installation details see the etwutils README.
Make sure you are on the latest release
Update before capturing
The etwutils capture commands below use the Nefarius public symbol server to automatically download the PDB files that match your installed drivers. If your BthPS3 installation is outdated or mismatched, symbol resolution will fail and every event will appear as a meaningless GUID=... placeholder — making the trace useless.
Before proceeding, make sure you have the latest published installer. Head to the BthPS3 releases page and follow the installation guide if you need to update.
Enable verbose tracing
By default, verbose tracing is off. Enable it once for both kernel services, then reboot.
-
In an Administrator PowerShell, run:
PowerShell (as Administrator)
etwutils verbose BthPS3 enable etwutils verbose BthPS3PSM enable Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\BthPS3\Parameters\Wdf" -Name "VerboseOn" -Type DWord -Value 1 -Force Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\BthPS3PSM\Parameters\Wdf" -Name "VerboseOn" -Type DWord -Value 1 -Forceetwutils verboseturns on driver WPP output. The twoParameters\Wdfvalues add verbose Windows Driver Framework logs for the same services. -
Reboot the machine before continuing.
You only need to do this once — later trace sessions do not require another reboot.
Step 1 — Quick live test (validate decoding first)
Before capturing to a file, confirm that the setup is working and that events are properly decoded.
In an Administrator PowerShell, run:
PowerShell (as Administrator)
etwutils realtime --driver BthPS3 --driver BthPS3PSM --symbol-server https://symbols.nefarius.at/download/symbols --format plain
On first run etwutils will download the matching BthPS3.pdb and BthPS3PSM.pdb from the Nefarius symbol server and cache them locally — subsequent runs start immediately from cache.
Now reproduce a Bluetooth action, for example press the PS button so the pad tries to connect. You should see human-readable lines scrolling in the terminal similar to:
2026-05-26T14:51:23.1234567+02:00 BthPS3TraceGuid TRACE_LEVEL_INFORMATION RemoteConnectReceived
2026-05-26T14:51:23.5678901+02:00 BthPS3PSMTraceGuid TRACE_LEVEL_VERBOSE PsmPatchActivity
Do not continue if you see GUID placeholders or no output
If the terminal shows lines like GUID={xxxxxxxx-...} instead of a friendly provider name and readable messages, symbol resolution failed. Go back and verify your BthPS3 installation is up to date.
If you see no output at all after trying to connect, verbose tracing may not have been enabled yet — confirm you ran the commands above and rebooted.
Only continue to Step 2 once you see properly decoded events here. Take a screenshot of this output to share if you are reporting an issue.
When you are done confirming, press Ctrl+C to stop the session.
Step 2 — Capture a trace to a file
Once Step 1 shows correctly decoded events, stop the live session (Ctrl+C) and run the same command redirected to a file:
PowerShell (as Administrator)
etwutils realtime --driver BthPS3 --driver BthPS3PSM --symbol-server https://symbols.nefarius.at/download/symbols --format plain --color never > C:\TEMP\events.tsv
Leave the terminal open and reproduce the behaviour you want to investigate. For example:
- Controller not connecting over Bluetooth: Try connecting it several times (turn on with the PS button, wait until the LEDs stop blinking, then try again).
- Controller turning off randomly: Use the controller until it disconnects on its own.
- Something works over USB but not Bluetooth (e.g. LEDs, rumble, sticks): Repeat the same actions over Bluetooth that work over USB.
Once you have captured the relevant behaviour, press Ctrl+C to end the capture.
The resulting events.tsv file can be quite large. Compress it with 7-Zip or WinRAR before sharing it.
Trace file contents
The trace file may contain device identifiers needed for debugging. Share it securely and only with trusted recipients.
Troubleshooting
Session resource error
If etwutils exits immediately with a resource or access error, a previous session may not have been cleaned up (e.g. after closing the terminal without pressing Ctrl+C). Clean up any leftover sessions with:
PowerShell (as Administrator)
etwutils sessions clean
Then try the capture command again.
Interpreting the trace
Once the trace is decoded, look for TRACE_LEVEL_WARNING or TRACE_LEVEL_ERROR entries. These indicate driver failures and can point to the cause of connection or behaviour issues. Whether the issue can be fixed depends on the specific message and your setup.
Also look at the structured events below. BthPS3 v3.1 and v3.2 added correlatable events for PSM registration, remote connect, filter initialization, and BTHX transport. They show up in the same decoded output once symbols (or the installed manifests) are applied.
Interpreting common events
These names come from the shipped manifests (BthPS3.man, BthPS3PSM.man). You do not need every line; use the table to tell expected noise from a real failure.
Profile driver (BthPS3)
| Event | What it means |
|---|---|
RemoteConnectReceived |
An inbound L2CAP connect reached the profile driver (address + PSM). |
PsmRegistrationSucceeded / PsmRegistrationFailed |
HID Control / Interrupt PSM listen was registered or failed. A failure here means PS3 peripherals cannot connect. |
PsmRegistrationStale / PsmRegistrationDeferred / PsmRegistrationRecovered |
A previous listen was still committed; the driver reclaims it and retries. Recovery is success. |
RemoteDeviceName / RemoteDeviceIdentified / RemoteDeviceNotIdentified |
The remote Bluetooth name was read and matched (or not) against the supported-name lists. An empty name followed by "not identified or denied" is a firmware/radio problem on the pad. See The controller tries to connect, then BthPS3 drops it. |
HidControlChannelConnected / HidInterruptChannelConnected / HidChannelConnectedDetailed |
The two HID channels came up. |
RemoteDeviceOnline |
Both channels are up; the pad is ready. |
RemoteDisconnectCompleted / RemoteL2capDisconnected |
The remote went away (status or channel). |
PowerPolicyIdleSettingsFailed |
Informational. Idle settings were left unchanged because BthPS3 does not own the device power policy and the device is not in RAW mode. This is expected when DsHidMini is installed. It is not a failure. |
WdfDeviceAssignS0IdleSettingsFailed |
A real power-policy assignment error (different from the informational skip above). |
Filter driver (BthPS3PSM)
| Event | What it means |
|---|---|
TransportTypeDetected |
The radio was classified as USB (1) or BTHX (2). |
FilterDeviceInitialized |
Filter init succeeded for that instance (transport, patch status, NTSTATUS). Logged only on success. |
PsmPatchActivity / PsmPatchActivityDetailed |
An L2CAP connection request was seen and optionally rewritten. Use these when PSM patching looks off. |
UnsupportedTransportType |
The radio is neither USB nor BTHX; the filter will not attach. Matches setup error 9004. |
BthxAclDataRejected |
A BTHX ACL completion reported an implausible length. Host-stack / radio noise; collect the trace if it repeats around a failed connect. |
FailedToFindBulkInPipe / HookSendFailed |
The USB or BTHX hook could not be installed or a hooked send failed. Patching will not work until this is resolved. |
PSM patching and traces
Filter options in the Driver Configuration Utility are what you change; these events are how you confirm the filter actually saw and rewrote a connect.