Simple L2CAP bluetooth kernel level driver for windows to connect to Apple Airpods.
It exposes the AirPods AAP control channel over L2CAP so librepods-windows can reach AirPods (the Microsoft Bluetooth stack doesn't expose L2CAP to user mode).
- Signed, ready to install: the
driver-latestrelease — auto-published by CI on every push tomain, signed with this project's test-signing certificate. This is whatlibrepods-windowsbridge's installer bundles automatically. - Unsigned compile-check builds: the Github Actions Tab (per-run artifacts,
Debug/Release, for verifyingsetup.ps1patches still build — not signed, won't load even in test mode).
This is not original kernel code. it's Microsoft's bthecho L2CAP client
profile driver (bthcli), retargeted to AirPods. The upstream is wired in as a
git remote:
$ git remote -v
origin https://github.com/will-ch-h/l2cap-windowsdriver
upstream https://github.com/microsoft/windows-driver-samples.git
- Upstream:
microsoft/windows-driver-samples, pathbluetooth/bthecho - Pinned at: commit
d5569c0 - Downstream delta: the whole fork is
setup.ps1— it fetches the pinned sample into `src/' and applies four changes.
| What | bthcli | here | why |
|---|---|---|---|
| Service GUID | c07508f2-… |
74ec2172-0bad-4d01-8f77-997b2be0722a |
bind to the AirPods AAP node + SDP PSM lookup |
| Interface GUID | fc71b33d-… |
9eec98bb-3c54-45d4-a843-7900c4635e08 |
what winl2capsocket.cpp opens with CreateFile |
| Read buffer | 256 | 1024 | AAP metadata SDUs would otherwise truncate |
| INF bind | echo service | AAP service | PnP loads us on the AirPods service node |
The PSM (0x1001) is discovered from the AirPods SDP record by the unchanged
client code — no hardcoding needed.
Most people don't need to build this at all — grab the signed driver-latest release above,
or just install librepods-windowsbridge, whose installer does it for you (test-signing mode
still has to be enabled manually first; see that project's README).
To build it yourself:
pwsh ./setup.ps1 # fetch + retarget into src/
# then BUILD.md to build and signThe consuming app finds the driver purely by the interface GUID 9eec98bb… and
a device path embedding the MAC (&<mac>_c), both of which bthcli already
produces.
Generative AI was used in this repository