ドライバ インストール時のトラブルシューティングの第一歩
皆さん、こんにちは。A寿です。
突然ですが、皆さんは魚に手足をかじられたことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。
さて、今回は、「ドライバインストール時のトラブルシューティングの第一歩」をご案内したいと思います。お客様からのお問い合わせの中に、よく「ドライバのインストールに失敗するのですが、どうすればよいのでしょうか?」とおっしゃられる方がいらっしゃいます。その場合に、お客様に最初にご確認いただく情報として、以下の2つをご案内することが多いです。
(1) デバイスマネージャで、対象デバイスに警告の「!」マークが出ている場合、プロパティに表示されるエラーコード
(2) setupapi.logを採取してエラーの内容を確認
それでは、(1)から順番に見ていきましょう。
(1) デバイスマネージャで、対象デバイスに警告の「!」マークが出ている場合、プロパティに表示されるエラーコード
デバイスマネージャで、対象デバイスに警告の「!」マークが出ている場合、とは、次のような状態のことを言います。
今回、説明のために、USBフラッシュメモリに「ハードウェアの安全な取り外し」を実行した後、物理的には抜いていない状態を作りました。このデバイスのプロパティを見ると、次のように表示されます。
このプロパティの全般タブの下半分の「デバイスの状態」にあるメッセージと、その後の「コード 47」というエラーコードにご着目ください。このようなエラーコードの解決方法などの説明は、
Device Manager Error Messages
https://msdn.microsoft.com/en-us/library/windows/hardware/ff541422(v=vs.85).aspx
を見てください。
今回の例であるコード47の場合は、メッセージ部分に「この問題を解決するには、デバイスを取り外してから再度取り付ける必要があります。」と解決方法が書いてあります。一方、上記ドキュメントの「Code 47 CM_PROB_HELD_FOR_EJECT」のリンクをたどると、
CM_PROB_HELD_FOR_EJECT
https://msdn.microsoft.com/en-us/library/windows/hardware/ff538998(v=vs.85).aspx
のドキュメントに行くことができ、そこには、「The device has been prepared for ejection.」というようにコードの説明がされていたり、Error Code、Display Message、Recommended Resolutionのような項目が並んでいたりすることが確認できます。
そして、Recommended Resolutionの項目に、上記メッセージの解決方法と同様に、
Unplug the device and plug it in again. Alternately, selecting Restart Computer will restart the computer and make the device available.
という内容を読むことができます。
それでは、同様に、お問い合わせの中で回答することが多いコード番号である、コード10とコード31を見てみましょう。
まず、コード10についてです。「Device Manager Error Messages」ドキュメントの中の「Code 10 CM_PROB_FAILED_START」のリンクをたどると、
CM_PROB_FAILED_START
https://msdn.microsoft.com/en-us/library/windows/hardware/ff538978(v=vs.85).aspx
のドキュメントに行くことができ、そこにメッセージ(Display Message)が
"This device cannot start. (Code 10)"
になることが書かれています。この問題の解決方法はプロパティの「デバイスの状態」には表示されませんが、このドキュメントを見ることで、Recommended Resolutionの中に、
This error code is set when one of the drivers in the device's driver stack fails IRP_MN_START_DEVICE.
という一文から、このエラーが、対象デバイスのドライバがIRP_MN_START_DEVICEの処理に失敗したことがわかります。そのため、この処理の周辺に
問題がないか、デバッグをしていけばよい、ということがわかります。
次に、コード31の対処方法を知るために、「Code 31 CM_PROB_FAILED_ADD」のリンクをたどってみましょう。
CM_PROB_FAILED_ADD
https://msdn.microsoft.com/en-us/library/windows/hardware/ff538951(v=vs.85).aspx
のドキュメントを見ると、Display Messageが
"This device is not working properly because Windows cannot load the drivers required for this device. (Code 31)"
です。このメッセージの場合も、メッセージだけからは解決方法を知ることはできません。そこで、Recommended Resolutionの項目を見ますと、
Starting with Windows XP, this problem can only occur if the driver's AddDevice routine fails.
とあります。つまり、対象デバイスのドライバがAddDeviceルーチンで失敗したために、このエラーになったことがわかります。
以上のように、ドライバのインストールが失敗した際に、デバイスマネージャ上のデバイスのプロパティでエラーコードがわかった場合は、「Device Manager Error Messages」ドキュメントから、該当エラーコードのリンクをたどることで、問題解決への第一歩を踏み出すことができます。
(2) setupapi.logを採取してエラーの内容を確認
setupapi.logは、Vista以前の場合は、%SystemRoot%(C:\Windows)フォルダ、Vista以降では%SystemRoot%\inf(C:\Windows\inf)フォルダにあります。
ただ、Vista以降でも%SystemRoot%(C:\Windows)フォルダにsetupapi.logがありますが、こちらを開くと、
The location of the SetupAPI log file has been changed. The new location is: D:\Windows\INF |
のように書かれています。実際には、Vista以降では、setupapi.logという名前ではなく、setupapi.app.logやsetupapi.dev.logという名前になっています。setupapi.app.logは、インストールアプリケーションやクラスインストーラなどのアプリケーション側のインストール時のログ、setupapi.dev.logはデバイスとドライバ側のインストールのログです。今回は両方のファイルを見ますので、2つのログの違いについての詳細は、下記ドキュメントやそのリンクに譲りたいと思います。
SetupAPI Text Logs
https://msdn.microsoft.com/en-us/vstudio/ff550900(v=vs.98).aspx
さて、Vista以前と以降でsetupapiログファイルのファイル名が違うと、説明がしづらいので、以後、総称して「SetupAPIログファイル」と呼ばせていただきます。このSetupAPIログファイルを見ることで、ドライバのインストールの成功/失敗、失敗時のエラーコードやメッセージを知ることができます。そして、エラーコードやメッセージを見つけたら、MSDNのサイトの
Installing Drivers and Utilities without Rebooting
https://msdn.microsoft.com/ja-jp/library/dn653568(v=vs.85).aspx
のページにある、SetupAPILog.docを開いて、その中でエラーコードやメッセージを文字列検索してみてください。「7. Common Device-Installation Problems」の章に、以下のような内容についてのエラーメッセージの実例が多くありますので、そのどれかにヒットすれば、問題が解決する確率がグンと上がります。
Ø The device’s INF file has been modified but not re-signed
Ø SetupAPI cannot find a driver for the device
Ø Rebooting the system is required
Ø A device vetoes its removal
Ø The test certificate for a driver package is not installed
Ø The certificate for a driver package that has a Authenticode signature is not installed
Ø A driver file is unsigned
Ø A service deletion is pending
Ø A protected system file was replaced
例を挙げましょう。例えば、Vista以降のx64環境にドライバをインストールした際に、インストールが失敗し、setupapi.app.logに
>>> [SetupVerifyInfFile - C:\Windows\INF\oem1.inf] >>> Section start 2009/06/19 19:06:06.702 cmd: "C:\Windows\system32\mmc.exe" "C:\Windows\system32\compmgmt.msc" /s ! sig: Verifying file against specific (valid) catalog failed! (0x800b0109) ! sig: Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider. ! sig: Verifying file against specific Authenticode(tm) catalog failed! (0x800b0109) ! sig: Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider. <<< Section end 2009/06/19 19:06:06.702 <<< [Exit status: FAILURE(0x800b0109)] |
のようなエラーが出たとします。この時、上記の黄色部分のメッセージからだけでも、ドライバ署名のルート証明書がtrusted providerに信頼されていないのだな、ということがわかります。この時、エラーコードである「0x800b0109」でSetupAPILog.docを文字列検索すると、「7.5 Test Certificate Not Installed」の、
Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
というメッセージが見つかります。そこで、この節を読んでみると、
To fix this problem, install the test certificate and reboot.
という解決策が書かれています。(実際には、これだけだと漠然としているので、
カーネル モード コード署名チュートリアル
を読んで、適切に署名を行ったり、certmgr.exeで証明書を正しい場所(rootやtrustedpublisher)にインストールをしたりといったことが必要になります。)
他の例としては、例えばWindows 2000で
エラー 1072: 指定されたサービスは削除の対象としてマークされています。 |
というようなエラーが表示された場合には、「1072」でSetupAPILog.docを文字列検索すると、「7.8 Service Deletion Pending」の
Error 1072: The specified service has been marked for deletion.
というメッセージが見つかります。そこで、この節を読んでみると、
If an INF file deletes a service by using a DelService directive, and then it attempts to add the same service by using an AddService directive, SetupAPI will log an error.
という説明や、
Note that the only way to correct this error is to reboot.
という解決策が書かれています。
以上のように、もしSetupAPIログファイルのエラー内容が、SetupAPILog.docドキュメントに記載されていれば、早い段階で問題を解決できる可能性があります。ただ、必ずしも、このドキュメントだけでSetupAPIログファイルに書かれた全てのエラーが解決できるわけではないことを十分ご理解いただきたいと思います。その場合はぜひ「Windows クライアント開発 - 全般」 のフォーラムにご相談いただいたり、我々ドライバ開発サポート(有償)にお問い合わせいただき、ログの状況から原因を調査させていただければ幸いです。ただ、このドキュメントにより、少しでも皆様のお問い合わせの手間を減らすことができれば、より幸いであると思います。
以上、「ドライバ インストール時のトラブルシューティングの第一歩」をお送りしましたが、あくまでもこれは第一歩です。上記の方法により、問題の解決の糸口をつかんだあと、長期にわたるデバッグ調査が必要な場合もありますが、早く問題解決への第一歩を踏み出せるのは意味のあることだと思います。開発中のドライバをインストールして問題がおきた場合は、ぜひ上記の方法をお試しいただきたいと思いますし、WDKドキュメントには以下のようなサイトもございますので、こちらも併せてご参照いただければ幸いです。
Troubleshooting Device and Driver Installations
https://msdn.microsoft.com/en-us/library/ff553489.aspx
――――――――――――――――
【閑話休題】皆さんは魚に手足をかじられたことはありますか?
私は、グアムでダイビング体験教室に参加した時に手を、箱根の某温泉テーマパークで足をかじられたことがあります。
ダイビングの時には、友人たちと一緒に海にもぐって、海中展望塔の中の小さなお子様とジャンケンして遊んだり、先生に写真を撮ってもらったりと楽しい時間を過ごしていたのですが、魚に魚肉ソーセージをあげようとしたところ、バクッと人差し指をかじられてしまいました。幸い、かじられたといっても数週間歯型が残る程度でしたし、「どうせ、初心者がダイビングするところなんて、かわいい熱帯魚しかいないから大したことないでしょ」と思われる方もいらっしゃると思います。が、残念ながら、私の指をかじったのは、でかい魚で、しかも、後で写真で確認したところ、他の友人たちの周りにはかわいい熱帯魚が囲んでいたにもかかわらず、私の周りだけ、でかい魚がうようよしていたのです。皆様もダイビング中に魚にえさをあげる際にはお気をつけください。彼らは結構テキトーです。
さて、足の方はといいますと、箱根の某温泉テーマパークでの話ですので、もちろんでかい魚にかじられるということはなく、ドクターフィッシュと言われる、足の悪いところ(?)をかじってくれる魚にかじってもらいました。「それなら全然危なくないじゃん」と思われるかもしれませんが、私は極度のくすぐったがりなので、魚のいる水槽(?)に足をつけたらすぐに小さな魚が大量に群がってきて、触れるか触れないかの絶妙な力加減で足の裏をこちょこちょこちょこちょと噛まれると、もう大変です。大騒ぎです。 同席していた外国の観光旅行者の方たちが、「Oh My God!!!! 」と口々に繰り返し叫んでいたことからも、私がどれだけ大変な思いをしたかがおわかりいただけると思います。その方たちのおかげで、私の大騒ぎは比較的軽い方であったのがせめてもの救いです。皆様も、魚に故意に足をかませる際には、自分がくすぐったがりでないかどうかをよくご確認ください。
――――――――――――――――
2014/07/01 / リンク先の修正 / I 沢