Image: デュアルブート環境でBluetoothデバイスを再ペアリングせず使う [Win10/WinXP]

Windows 10とXPのデュアルブート環境でLogicool K380キーボードを使用しているのだが、これが一度ペアリングすると片方のOSでしか使えない。しかも、K380は3デバイスまで切替でペアリング可能なのだが、各OSを別々のデバイスとしてペアリング設定しても、直近のペアリング設定しか使えない。これは何事かと思ったのだが、どうも相性問題ではなくBluetoothの仕様上発生する問題で、解決方法としては各OSがペアリング時にランダムで設定するリンクキーなるものを同じ値で統一して設定させればいいらしい。

症状

同じBluetoothレシーバを使用する1台のPCで複数のOSをインストールしたマルチブート環境にて、片方のOSでペアリングを設定すると他のOSではペアリング設定が機能しなくなる。状態欄にはペアリング設定済みと表示されるが、接続済みにはならず接続されない。

解決方法

普通は下の方法の通りにやれば上手くいく。

マルチブート環境の全OSで同じBluetoothデバイスを使う - hnwの日記

私の場合はWindows 10とWindows XPのデュアルブート環境で、Windows 10の場合は標準ドライバが使われるが、Windows XPでは使っている中華製 CSR BluetoothのCDから別途ドライバをインストールした関係か、リンクキーの場所やデータの保存方法が異なっていたため、少し手こずった。

Windows XPかつCSR (Cambridge Silicon Radio) 製Bluetoothドライバの場合、リンクキーは次の場所にある。

レジストリキー 名前 データ型
HKLM\SYSTEM\CurrentControlSet\Services\CsrBtPort ScDbData BINARY

Image: CsrBtPort\ScDbData - レジストリエディタ

中身は複数デバイスのリンクキーを含むバイナリデータになっていて、ここから該当デバイスのリンクキーを探るのは少し手間が掛かる。

まず、一度デバイスをペアリングした状態で、ScDbDataをファイルにエクスポートしておく。次に、デバイスを削除して再度ペアリングした状態でScDbDataを別のファイルにエクスポートしておく。リンクキーはペアリングを行う毎に変わるので、バイナリ中でデータが変わっている部分が該当デバイスのリンクキーのはず。

Image: ScDbData - EmEditor

2つのファイルを差分比較してみる。ちょうど16バイト分だけ値が異なる場所 (e0 6a 7f d3 7e 77 59 4e 61 d9 ce 09 18 cf e6 6b) があるのでこれがXP側のリンクキーか。

Windows 10標準ドライバを使用している場合、リンクキーが保存されている場所はSYSTEMユーザー(管理者権限ユーザーとは異なる)でないとアクセスできないらしい。レジストリエディターをSYSTEMユーザーとして実行するために、PsExecを使う。コマンドpsexec -s -i regeditを実行する。ただし、PowerShellから実行する場合は./psexec -s -i regedit

Image: psexec - PowerShell

キーの場所はHKLM\System\CurrentControlSet\services\BTHPORT\Parameters\Keysで、BDアドレス(接続機器)毎にサブキーが置かれるらしい。Bluetooth機器一つしか繋いでないのなら、一つしかぶら下がっていないのでそれを開く。

Image: BTHPORT - レジストリエディター

名前にある34885d987a2eという文字列。バイト毎に逆にすると2e 7a 98 5d 88 34。これ、さっきのScDbDataにも似たようなバイナリがあるのでそれっぽい。この項目のバイナリを先ほどの差分比較で判明したXPのリンクキーに置き換える。

Image: バイナリ値の編集

キーボードの電源を入れ直してみる。Windows 10でも使えるようになった。表示も「接続済み」になったよ。パーでき!やったね!

Image: Bluetoothとその他のデバイス

(EOF)

参考サイト

問題解決の参考になった資料。感謝!


comments powered by Disqus

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.