2018年10月31日水曜日

KB4462933をインストール後HID準拠ゲームコントローラー(ジョイパッド)が接続されているとスリープしない・・・?

変な表題ですが、理由があります。
結論だけ言うと「KB4462933を再インストールしたら再現しなくなった」ように見せかけて「やっぱり再現した」ものの「再インストールしなくても再現しなくなった」です。
何が何だかさっぱりわかりません。

調査を進めてみると、もしかしてこの事象が発生するのはKB4462933に限らないかもしれない可能性が疑われました。
さらにその後、やっぱりKB4462933が原因だろうと考えざるを得ない事態が出来しました。
ちょっと複雑なので、順を追ってご説明いたします。

まず、以前にもありましたが、またもやUSBで接続されたジョイパッド(MS用語では"HID 準拠ゲーム コントローラー")が接続されていると、アイドル状態が続いて既定の時刻になってもスリープどころかブランクスクリーン(MS用語では"ディスプレイの電源を切る")にもならなくなりました。

あくまでもアイドル状態が指定時間続いた場合にスリープに入らないので手動でスリープを指示すれば正しくスリープに入ります。
ジョイパッドを抜去すると再度アイドル状態が続いた後に自動でスリープに入るようになります。

今回はKB4462933を適用した直後からこの事象が発生しました。

イベントログで確認しても、このKB4462933がインストールされてから丸一日後(たまたま長時間不在の中での更新でした)に気が付いて、試しに手動でスリープボタンを押下するまでスリープに入っていないことが記録されています。
家族に聞いても(常時私のPCを監視しているわけではないのでイベントログほど確実性はないものの)画面がつきっぱなしだったと言われましたので、スリープに入っていないことは確実です。

前回同じようなことを経験しているので、試しに接続されたままだったジョイパッドを抜去して待ってみると、正常に一定時間経過によって自動的にスリープしました。

試しに再起動してみても、ジョイパッドを接続しなおしたり接続ポートを変更してもこの状況は変わりませんでした。

一応、極めて黒に近い灰色に思われましたが、このまま犯人だと決めつけて間違っていたら間抜けなので、念のためにKB4462933をアンインストールして同様の試験したところ、自動的にスリープに入ることを確認しました。

さらに念のため、アンインストール前と設定が変わっていないかどうかの比較のため、以前のようにデバイスマネージャで電源設定を確認したりコントロールパネル->電源オプション->プラン設定の編集をチェックしましたが、両者の間で変更点は全くありませんでした。
powercfg.exe /requestsの結果も双方「なし。」の羅列で阻害要因なし。
powercfg.exe /energyの結果も双方阻害要因なし。

言い方を変えれば、powercfg.exe /requestsの結果および/energyの結果にKB4462933適用済の時とKB4462933未適用の時での差異が一切ありません(が挙動は異なる)という状況でした。

ここまでで犯人もわかったことだし、面倒ではあるけど対策はあるわけだからよしとして、暇なときにでも今度はもうちょっと原因を突っ込んで調べてみよう、ということでこの記事も一旦終わるはずでした。

ところがどっこい、そうは問屋が卸してくれませんでした。

KB4462933を再インストールしたところ、なんとジョイパッドを接続しっぱなしでも今度は正常に指定時間ピッタリに自動的にスリープに入るのです。

同様に再起動してみたり接続ポートを変えたりしてみても、時間経過で正常に自動的にスリープします。
電源設定もpowercfg.exeも再インストール前とアンインストール前の結果と比較してみましたが、やっぱり同一です。

しかし、KB4462933を初回インストールしたあとの再起動後から一切スリープしなくなったのは確かです。
なぜなら、私が不在時にこのWindowsUpdateによる更新が行われましたので、操作者がいない以上、正常ならば再起動してから一定時間経過後にイベントログにKernel-Powerのイベント42、「スリープの理由: System Idle」が記録されていなければなりませんが、その記録がないことからも明らかです。
スリープしているはずの時間帯だけでなく、翌日手動でスリープするまでにどっさりESENTイベントID916などのゴミログがイベントログに大量に、かつ間断なく記録されているのも傍証となります(まさかあのゴミログが役に立つとは!!)。

問題は、KB4462933そのものが原因ではないことです(後述しますがこの段階ではそう見えたものの、この結論は実は早すぎるようです)。
アンインストールして再インストールしたら事象が再現しないのですからそう言わざるを得ません。

(ここから上記の誤った結論に基づいた仮説が縷々続きますが、その後の新しい現象が確認されたことにより無駄な文章となっております。表題の趣旨としては合致しないため、本来は削除すべきですが、スゴイ恥ずかしいのでblogの趣旨としてどう恥ずかしいのかしっかり残すために文字を一回り小さくして残させていただきたいと思います。)
ただし、ここから先は事実ではなく仮説になってしまいますが、今回のケースではKB4462933を入れたことによってスリープをしなくなったものの、再インストールを行うことによって正常にスリープするようになったという現象自体を見ると、WindowsUpdateで品質更新プログラムを適用する際に実行されていると思しき何らかの作業スクリプトに不備があり、このケースと同様にスリープしなくなるという現象を惹起する可能性に思いを致さざるを得ません。
ということは、つまるところ、別の品質更新プログラムや機能更新プログラムでもその修正・追加内容に拘らず同様の事象を再現する可能性があるということになります。

というのは、一般的にはこういった更新適用スクリプトには固有の手続き以外の共通化できる手順というのがあって、そういった部分は毎回書き直したりせず、使いまわされることが多いからです。
その部分に、たとえば更新中は一時的に自動スリープを抑止するような手続きが含まれており、かつ何らかの条件で抑止を解除する手続きの中で一部正常に元に戻せなくなるケースが見逃されているのではないか、などの可能性が考えられます。
また、様々な環境用に一切合切まとめられてしまっている品質更新プログラムの中から、当環境に適したモジュールを抽出して適用する際、特定条件下ではスクリプト部分に問題があって、誤適用してしまう可能性も考えられます。

もしこの仮説が正しければ、の話ですが、もしも今回同様なケースに見舞われた方がおいででしたら、スリープしなくなってしまった直前に適用された品質更新プログラムや機能更新プログラムを再インストールしてみてはいかがでしょうか。
もしかしたら、今回のケースのようにあっさり直ってしまうかもしれません。

今回のケースでも「アア、マタカ」と面倒くさがってジョイパッドを抜去するだけの対策で済ませていたら、品質更新プログラムの再インストールで正常な挙動に直せることが分からずじまいでした。

仮説を唱えるなら実証して見せろ!とお叱りを受けそうです。
ごもっともです。

これは言い訳ですが、KB4462933のインストールとアンインストールと各段階でのデータどりを1ターンとすると、当環境では1ターン当たり2時間弱かかります。
しかも、一般的に機能更新プログラムなどがWindowsUpdateで適用される前の再起動は「前回の」WindowsUpdateでリブートがかかった後、何日~何十日も再起動されないままで適用されるという条件もあります(今回の事案では12日間再起動されていませんでした)。
私にはそれを検証するだけの時間的資源がありません。本当に申し訳ございません。

言い訳だけでなく、危うくKB4462933冤罪事件を免れましたので、恥の記録としてここに記録する次第です。
お読みいただきありがとうございました。

・・・とは終われませんでした
問屋が卸してくれない状況で輪をかけてこれですから、言うなれば元売りも卸してくれないとでも言えばいいのでしょうか。

KB4462933を再インストールして正常にスリープをすることを確認したその当日の数時間後には、スリープしなくなる現象がまたもや再現したのです。

KB4462933を再インストールして正常にスリープができたことを何度も確認してから、そのままジョイパッドを接続したまま再起動もせず、数時間PCを使った後、所用で1時間ほど離席して帰ってくると、画面がまばゆく輝いていました。

イベントログも確認しましたが、離席した時刻以後は確かにスリープが記録されていません。

その間、繰り返しになりますが、検証のための最後のスリープを確認して復帰させた後は再起動などシステムに手を加えるようなことは何もしていません。
テキストエディタとブラウザを使っていただけです。

仕方がないのでもう一度ジョイパッドを抜去してスリープするか確かめたところ、抜いてあれば時間経過でスリープすることを確認しました。

もうなんだこれ?と途方に暮れつつ、ジョイパッドを接続したままにして、まだ用事が済んでいなかったため再度離席したのち所用を終えて帰ってくると、今度はスリープしているではありませんか。

うーん。魂消たなあ。
この現象はこれまでとはまた違った新現象です。

KB4462933のアンインストール前でのケースでは、ジョイパッドを接続しなおしてもシステムを再起動しても兎にも角にもジョイパッドが接続されている限りスリープに入らない状態は変わらなかったのですが、今回はKB4462933をアンインストールしなくともスリープに入ってしまったわけです。
当然、電源周りの設定とpowercfg.exeの出力も比較しましたが、これまた他と同様、まるで違いは認められません。

前回のアンインストール前の挙動とは明らかに異なります。
いったい何なんだろう。
帰ってきてまたまたパッドを挿抜したりなどのこれまでと同様のテストを行いましたが、正しくスリープに入ってしまいます。

こうなると、現時点では一度スリープから復帰して何時間も使ったあとはスリープに入らなくなったという事しか言えなくなりました。

一度はKB4462933は冤罪とみなしそうになりましたが、実はそうとは言い切れないのではないかという疑いが再浮上してしまいました。むしろ、このパッチが当たるまでは何の問題もなかったのですからますます疑惑が深まってしまいました。

(ひょっとして、その間にスリープ抑止リクエストが入った場合はどうなるかと思いついてしばらくwindows media playerでDISPLAYとDRIVERとPROCESSに抑止が入るようにして使った後、スリープに入るかどうか試してみましたが、正しくスリープに入りましたのでこれは関係ないようです。確かに再インストールしてから特別なスリープ抑止リクエストがかかるようなアプリを起動した覚えはないので、無意味なテストでした。)

とにかく私の先の仮説とやらは大仰に書きまくった割には大外れでとっても恥ずかしいので、このblogの趣旨にとてもふさわしいため、このままこの記事を公開させていただきます。

いやほんと、魂消たなあ。
新たな仮説を打ち立てないと検証方法も設計できないし、今のところお手上げです。

原因を特定することが果たしてできるのか先行きが大変不安な展開となっております。
申し訳ございません。

0 件のコメント:

コメントを投稿