デバイスマネージャーで不要なデバイスを削除する

Windows 全般で使えるネタです。
デバイスマネージャーを使用すると、接続している様々なデバイスが表示されますが、
何らかのハードウェアデバイスを買い替え、PC に接続すると、プラグアンドプレイによって
新しいデバイスが認識され、表示情報も更新されるのですが、必要ないデバイスの情報も残ったままになってしまいます。
通常では、接続していないデバイス情報はデバイスマネージャーに表示されません。
個人的に必要ない情報は削除しておきたい性格なので、不要なデバイスを削除する方法を残しておきます。

まず、コマンドプロンプトを開きます。
Vista 以降の OS では管理者権限に昇格したコマンドプロンプトを開きます。(Windows 7 以降でも使えます)

以下の環境変数を一時的に設定します。
もちろん、環境変数を一時的ではなく、システムの環境変数(システムのプロパティ-詳細設定-環境変数)に
登録してしまっても構いませんが、頻繁に使う環境変数でもないので、この方がいいと思います。

set devmgr_show_nonpresent_devices=1

その後で、start コマンドを使い、デバイスマネージャーを起動します。

start devmgmt.msc

こんな感じです。

すると、デバイスマネージャーが起動しますので、

表示メニュー
 非表示のデバイスの表示

を選択します。すると、非接続状態や無効のデバイスを表示されることができます。(アイコンが薄くなっている)
これで、不要なデバイスを削除することができるようになります。

Vista のドライバストアから不要なドライバパッケージを削除する

DDK の開発サポートをしていると、よく使うコマンドなのでメモ代わりに書いておきます。

Windows Vista ではドライバをインストールする際、承認されたドライバをドライバストアという
特殊なフォルダに格納しておきます。

DriverStore : C:\Windows\System32\DriverStore

実際のドライバパッケージは、リポジトリとして FileRepository フォルダに保存されています。

FileRepository : C:\Windows\System32\DriverStore\FileRepository

リポジトリフォルダに保存されているドライバは通常のファイル操作で削除することができません。
PnPUtil.exe というコマンドを使用します。使い方は、こんな感じです。

  1. 管理者権限でコマンドプロンプトを開く。
  2. PnPUtil.exe -e でリポジトリフォルダに保存されているドライバをすべて列挙する。

    pnputil_1

  3. 列挙されたドライバ一覧から不要なドライバを探し、公開名 oem##.inf をメモしておく。
  4. PnPUtil.exe -d oem##.inf でドライバをリポジトリフォルダから削除する。

    pnputil_2

これで、不要になったドライバをリポジトリフォルダから削除することができます。
(もちろん、このコマンドは Windows Server 2008 にもあります)

ちなみに PnPUtil.exe は Vista で導入されたコマンドですが、同じようなコマンドで DPInst.exe という
ものがあります。こちらは Vista/XP で使うことができます。

RADEON のドライバがインストールできない

自宅の PC のビデオカードは、RADEON 4670 を使っています。
AMD(ATI) のサイトを見たところ、新しい Vista 用ドライバ (Catalyst 8.10) があったので、更新しようとしたのですが
インストーラーがエラーになってしまい、どうにもこうにもなりません…。

—–
障害が発生しているアプリケーション InstallManagerApp.exe、バージョン 3.0.699.0、タイム スタンプ 0x49060f21、障害が発生しているモジュール MFC80U.DLL、バージョン 8.0.50727.1833、タイム スタンプ 0x482bc450、例外コード 0xc0000005、障害オフセット 0x0004c655、 プロセス ID 0x1754、アプリケーションの開始時刻 0x01c93c34e60f139d。
—–

調べたところ、InstallManagerApp.exe があるフォルダにマニフェストがあるのですが、そのマニフェスト(Microsoft.VC80.MFC.manifest)には

<assemblyIdentity
    type="win32"
    name="Microsoft.VC80.MFC"
    version="8.0.50727.42"
    processorArchitecture="x86"
    publicKeyToken="1fc8b3b9a1e18e3b"
/>
<file name="mfc80.dll"/>
<file name="mfc80u.dll"/>
<file name="mfcm80.dll"/>
<file name="mfcm80u.dll"/>

とあります。side-by-side 共有フォルダ(Winsxs)には 8.0.50727.42 のフォルダはあるので問題は無いはず。
フォルダを見ると、
「mfc80.dll」「mfc80u.dll」「mfcm80.dll」「mfcm80u.dll」
と 4 つのファイルがあります。mfc80u.dll を Resource Hacker で覗いてみたところ

<dependentAssembly>
  <assemblyIdentity type=’win32′ name=’Microsoft.VC80.MFCLOC’ version=’8.0.50608.0′ processorArchitecture=’x86′ publicKeyToken=’1fc8b3b9a1e18e3b’/>
</dependentAssembly>

となってました….。がびーん。これが原因だったのね。
私の環境には、8.0.50608.0 のmfc80u.dll が存在していないので、8.0.50727.1833 がロードされてしまい
内部でエラー(例外コード 0xc0000005)が発生したわけです。(0xc0000005 はアクセス違反です)
なお、8.0.50608.0 のランタイムライブラリは、Visual Studio 2005 RTM 版のランタイムライブラリバージョンです。
Microsoft のサイトから、Visual C++ 2005 再頒布可能パッケージをダウンロードして、インストールしても
Vista にインストールできない…。途方に暮れながら、ATI のフォーラムを調べていたところ
InstallManagerApp.exe を使わなくても、コマンドラインでインストール/アンインストールができることが判明。
インストールパッケージが展開された bin フォルダにある "ATISetup.exe" を直接使うことができるそうです。

  • コマンドラインでインストール
    ATISetup.exe -Install -output screen
  • コマンドラインでアンインストール
    ATISetup.exe -Uninstall -output screen

Vista の場合は、コマンドプロンプトを管理者権限で実行しておく必要があります。
インストールもアンインストールもできない状態になってしまい、かなり焦ってしまいましたが
この方法で無事に更新することができました。