【Windows】"Windows Updateで0xc1900101 0x30018が発生したときの対処法"

Windows8モデルのPCをWindows10の最新バージョンに上げてくれと言われたので、はいはいお安い御用ですよーと受け合ったらエラーを吐いて上がってくれないきかん坊で困った。
威勢よく引き受けた手前、簡単に諦めるにも行かないから、なんとかしてアップデートした。
そのときの記録。

結論

Windows8.1からWindows10へアップグレードで失敗し、エラーコードが0xc1900101 - 0x30018だった場合、以下の手順で直せることがある。

  1. $Windows.~BT\Sources\Rollback\setupapi\setupapi.dev.logを見てエラーを起こしているドライバのPCIデバイス識別子を確認
  2. PCIデバイス識別子からドライバを特定
  3. ドライバをアンインストール

以下、この手順について詳しく書いく。

環境

今回アップグレードしようとしたのはNECのPC-LL750LS6G。
Windows8搭載で販売され、CPUは3世代のi7、メモリ8GBで事務用途であればまだまだ使えるPC。

Windows8.1のサポートが終了してしまったのでWindows10にアップデートしたいとのことで持って来られた。

ちなみに公式ではWindows10非対応機種になっていた。

0xc1900101 - 0x30018 との遭遇

サポートが終了したWindows8.1から10へアップグレードするのは難しいように思えるかもしれないが、意外に簡単に行うことができる。

一旦Windows8.1をWindows8.1インストールメディアで上書きインストールして、そのあとWindows10インストールメディアを使って更新プログラムを行うと80%くらいは問題なくアップグレードができる。

わざわざ上書きインストールなんてする必要があるのか、と思うかもしれないが、上書きインストールによってWindows8.1のシステムがきれいな状態になりWindows updateで問題が起きにくくなるから、私は必ずWindows8.1で上書きインストールをするようにしている。

しかし、上書きインストールをしただけではなびかない曲者も中にはいる。

そんなときはいきなり最新版のWindows10を使うのではなく、少し古いバージョンのインストールメディアで刻みながらアップデートをすることでアップグレードができることがある。

ちなみにMicrosoft公式サイトでは最新版のインストールメディアしかダウンロードできないので、旧バージョンのインストールメディアが必要な場合Rufasを使うといい。

今回作業を行ったPC-LL750LS6Gはなかなかの問題児で、22H2で失敗、1903で失敗。
2回失敗して腹が立ったので、過去の遺物でもくれてやらんと1507をぶち込んでやったら、やっとのことでWindows10に上がった。

しかしここからが問題で、1507から上のビルドにアップデートができない。

Windows updateを実行しても更新の途中で電源が落ちてWindows updateに失敗するのだ。

電源が落ちた後再起動させると決まって画面には情けなくエラーコード0xc1900101 - 0x30018が表示される。

0xc1900101は大体ドライバエラー

色々とググると、0xc1900101はドライバーエラーを示すコードであるということが分かった。(汎用的なエラーコードらしくドライバエラー以外でもスローされることがあるらしい。ふざけるな。ややこしいわ。)

エラーコードを信じるのであれば、古いドライバがWindows10に対応しておらずロールバックしたのだろうと解決へのアタリがついた。

信じる者は救われる、ということでその”古いドライバ”を特定しアンインストールを行っていく。

ログに原因のドライバを教えてもらう

Windowsアップデートに失敗するとCドライブルートに$Windows.~BTという見慣れないフォルダが作られる。

この中にトラブルシューティングに役立つ(こともある)ログが残されている。

今回は以下のログが役に立った。

$Windows.~BT\Sources\Rollback\setupapi\setupapi.dev.log

Windows update関連のログの場所は意外にも公式ドキュメントが役に立った。

ログはWindows update成功とともに雲散霧消してしまったため、はっきりとは覚えていないのだが、sysprepフェーズのログの部分にドライバを操作する記述があった。

そこからエラーっぽい部分を探してみると、あるドライバでエラーが起きていた。

ログの見方がわからないよという場合は、ログの一番下まで行って、そこから「error」や「failed」などのエラーっぽい記述を探しながらログを上がっていくと何となく読めると思う。

PCIデバイス識別子からドライバを特定する

先程のログはエラーを起こしているドライバを教えてくれたのだが一つ不親切な点がある。

それはドライバの名前を教えてくれているわけではないという点だ。
じゃあ何を教えてくれたのかというとエラーを起こしているドライバのPCIデバイス識別子である。

PCIデバイス識別子は人間にわかりやすいものではない。
ネットワークでいうところのIPアドレスとURLの関係に似ており、PCIデバイス識別子はIPアドレス側だ。

PCIデバイス識別子からドライバを特定する方法を私は知らないため、まずは識別子からドライバを割り出す作業をすることにした。

PCIデバイス識別子からドライバを割り出すときはここが役に立つ。

ここでドライバの製造メーカーを特定してドライバを絞り込んでいく。

今回の私のケースではVEN_10ECでありRealtekのドライバだと判明した。 Realtekのドライバであればせいぜい入っていても2,3だろうということで次の工程に移った。

Realtekのドライバを全部消してみる

これまでの工程から、現在インストールされているドライバの中からrealtekのドライバを探して消せばアップデートエラーが消えるだろうと見立てがついた。

ドライバをアンインストールする方法はいくつかあると思うが私はDISMコマンドから消した。

回復環境に入り、以下のコマンドを打つ

DISM /image:C: /get-drivers > C:drivers.txt

DISM /image:C: /remove-dricer /driver:xxx.inf

上のコマンドはシステムにインストールされているドライバの一覧を取得してくる。
その結果をコマンドプロンプトではなく、C直下にテキストファイルとして出力した。

出力したテキストファイルを参照しつつ、ベンダー名がRealtekになっているドライバを探す。

見つかったら2つ目のコマンドを打つ。
ちなみにこの2つ目のコマンドはonlineの環境に対しては使えない。
回復環境に入ったのはこのためである。

無事アップデート完了

Realtekのドライバを消したところ無事Windows10 22H2にアップグレードできた。

同じエラーで困っている人の参考になれば幸いだ。

補足

エラーコード的にはドライバエラーだと分で作業をしていたが、エラー発生時決まって電源が落ちるという症状が気になった。

ドライバエラーであれば電源が落ちるのは少しおかしくないだろうか。

今回作業したPCはずいぶん古いものということもあってバッテリーが消耗しきっており充電できない状態であった。

そのためドライバをアンインストールして更新をかける前にバッテリーを抜いてACのみで動作させていたということも追記しておく。

ドライバのアンインストールとバッテリーの取り外し、どちらも同じタイミングで行ったためエラーとの正確な関連は不明である。
おそらくはドライバのアンインストールが決めてだとは思うが念の為。