2015年9月10日木曜日

Windows10でHID準拠ゲームコントローラが接続されているとスリープできない

Windows10をクリーンインストール後、2日目になってもスリープ状態に移行しなかったので調査したところ、上記の結果が得られました。

もっと言えば手動でスリープ状態に移行させることはできるのですが、時間経過によってスリープ状態に移行しません。
スリープはおろか、モニタの電源も落ちないし、スクリーンセーバすら起動しません。

本来であればOSのアップグレードやインストールを行う際には当然USB機器などは取り外し、さらに出来れば最小構成でインストールすべきというのがこれまでの常識でしたが、Windows10無償アップグレード版は人にではなくデバイスに対してライセンスが付与されるということでしたので、今回はあえてWindows8.1で利用しているデバイスを全部接続した状態でアップグレードとインストールを行いました。

そのため、スリープに入らない原因を突き止めるのに時間がかかりました。
では恥の顛末を早速。

まず、真っ先に疑ったのは周辺機器の電源管理オプションです。
デバイスマネージャを開き、接続されている機器の一つ一つのプロパティを開き、「電源の管理」オプションを見て回りましたが、すべて「電力の節約のため、コンピューターでこのデバイスの電源をオフにできるようにする」チェックボックスはチェック済みとなっていました。

次に、Windows10用デバイスドライバが用意されていないデバイスのせいでスリープに入れないのではないか、ということです。
PT3、ADBドライバ、プリンタ、ラベルプリンタ、CDラベルプリンタやスキャナなどのドライバはOSインストール直後にすべてインストールしておいたのですが、デバイスマネージャを開いてみると、確かに、

  • SMバスコントローラ
  • 不明なデバイス
の2つがドライバが適用されていない状態でした。
これだけでは何のことかさっぱりわからないのでデバイスマネージャのイベント欄から手がかりを調べてみると、何のことはなくて単純にMSがチップセットドライバを端折って入れていただけでした。
ちなみに、これらは
  • Intel(R) Management Engine Interface
  • Intel(R) Smart Connect Technology Device
のことでした。
しかし、これらのドライバを入れてみてもスリープせず、無関係でした。

次に疑ったのは当然Windows10です。何せ今回、一番変わったのはコイツです。
そこで、ひとつづつプロセスをkillしては数分待ち・・・というようなことを延々繰り返していましたが、やっぱりスリープする気配がない。

かなりな数のプロセス数なので、さすがに途中で飽きてしまったところ、ちょっと思いついたことがあって、起動直後にロック画面のまま何も触らなければどうなるのか試してみました。

スリープしました

では一度ログインすればダメなのか、と思って、ログインしてスリープ状態に移行しないことを確認した後、再度ログオフして待機してみました。

スリープしました

いろいろ試すうちに、ログインしていなければスリープするが、ログイン中はスリープしないことが分かりました。

え?ログオン?え??サインインですか?そうですか。

一度ログインしてスリープしない状態になっても、ログアウトさえすれば、設定時間経過後に正しくスリープ状態に移行するのです。

再度ログインすると、またスリープしなくなりました。
スリープしないことを確認後、ログオフすると、今度もやはり正しくスリープに入ります。

ここで、ログイン中に起動されるプロセスを重点的にkillしては様子を見て、ということをやってみたのですが、相変わらず阻害要因となっているプロセスを特定できませんでした。

もちろんその間、powercfg.exeでも原因を探ってみましたが、彼の報告によればスリープを無効にする要因はハードウェアからは全くなし、ソフトウェアからはWindows Updateの予約や録画予約ばかりで、いま、まさにスリープに入らない原因が全くない。
常にpollしてるんだろうから、動作ログ見せてくれれば一発なんだけどなぁ・・・

また、タスクスケジューラも全エントリを調査しましたが、スリープを解除してしまう悪い子は見当たりませんでした。

とにかく、ログアウト中はスリープするのにログイン中はスリープしないという奇妙な行動を突き止めることがなかなかうまくいかないため、さらにログオフ中とログイン中の稼働プロセスの違いをはっきりさせるため、後日ログオフ中でも稼働中のプロセスリストを取るサービスを書くことにして、次の確認項目としてUSB機器の取り外し試験を開始しました。

え?ログオフ?サインアウト?そうですか。

そこで、1つ抜いては数分待機、を繰り返した結果、表題の通り、「HID準拠ゲームコントローラ」が接続されていた場合にスリープしないことが分かりました。

まっさきに「HID準拠ゲームコントローラ」をデバイスマネージャで電源の設定を確認しましたが、これには「電源の管理」タブがありません。
しかし、その下にぶら下がっているコントローラ本体の「USB入力デバイス」では正しく「電力の節約のため、コンピューターでこのデバイスの電源をオフにできるようにする」チェックボックスはチェック済みとなっています。

そもそも、ログアウト中はスリープするわけですから、デバイスの設定としては正しいわけですよね。

powercfg.exeでスリープを拒止するプロセスもつかめないし、ログアウト中ならスリープするという点を見ると、どうもこりゃあ長丁場になりそうなので、今はとにかく、これを抜去しておきゃスリープはするわけですから、抜本的解決には至っておらず、まことに恐縮ですが毎月ン万円も電気代をTEPCOに支払う身としてはいまはこれまでとしておきたいと思います。

sleepに入るロジックの動作ログを見られればすぐわかるんだろうなぁ。。。

0 件のコメント:

コメントを投稿