ドライバの更新と削除について

現在、自作PCIボード用のドライバを作成しております。
win2kやwinXP上で動かそうと思っています。

質問1:ドライバの更新について
ドライバの不具合を修正し、
デバイスマネージャからドライバの更新を行おうとすると、
"現在インストールされているソフトウェアよりも
ハードウェアと適合性の高いソフトウェアが見つかりませんでした。"
と表示されます。
この表示は、何を基に判断しているのでしょうか?
sysファイルの日付?
infファイルのバージョン?
(\System32\Driversのsysファイルを上書きしていましたが、
出来れば上記の方法で更新したく思います。)

質問2:ドライバの削除について
自作ドライバをインストールしたPCから削除しようと思います。
なるべくインストール前の状態に戻したいと思います。
質問2-1:
削除する項目は以下でよいのでしょうか?
(DDKサンプルのreadmeには以下の記載がありました。)
1.\Windows\Inf もしくは \Winnt\Inf から、
自作したドライバ情報が記述された infファイル と pnfファイルを削除
2.\System32\Drivers から sysファイルを削除
3.RegEditやRegEdt32を使用して以下を削除
HKEY_LOCAL_MACHINE\SYSTEM\Enum\PCI\VID_****&PID_****
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_****&PID_****
質問2-2:
infファイルを見ると、上記以外のレジストリ下にキーを作成している様です。
これらのキーも削除して良いのでしょうか?
例:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\*****
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System\*****
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{クラスGUID}
質問2-3:
デバイスマネージャからドライバの削除を行った場合、
削除されるのはOSが管理している内部情報だけなのでしょうか?
質問2-4:
ドライバを削除する場合、
デバイスマネージャからドライバの削除→上記ファイルの削除
の手順が良いのでしょうか?

どなたかご存じの方、
いらっしゃいましたらアドバイス頂けませんでしょうか?
よろしくお願いします。

5つ質問をされてい

5つ質問をされているのですが、これらすべてについて正確に答えるのはなかなか難しいと思います。
とりあえずは、古い記憶を頼りにできる範囲でやってみます。

まずwin2kやwinXP用のドライバを作成されているとのことですが、Windows Vista以降ではドライバのインストールの内部機構と、更新と削除の仕組みが、ややおおげさに言うと「大幅に」変わっているので、まず注意が必要です。

先にご参考までに解説しますと、Windows Vista以降では、以下の点が変わっています。
1.インストールの内部機構が変わったために、System32\Driversのsysファイルを上書きして動作する保障が無くなりました。
2.適合性の高いソフトウェアの判定のロジックが「より厳密に」行われるように、変わりました。
3.古いドライバの「完全な削除手順」が簡単に提供されるようになりました。

さて本題ですがWindows XPにおいて、質問1:ハードウェアと適合性の高いソフトウェアはまず、
Windowsが探し出した新しいハードウェアを識別する情報と、インストール候補のドライバの素性(適合ハードウェア)の度合いで決まります。
ハードウェアを識別する情報とインストール候補のドライバの素性が合致する場合には、Microsoft純正やWindowsロゴ取得ドライバであること、INFファイル記述のバージョン、日付情報が最新であることの順に適合性が評価されます。
ただしWindows XPにおいては、この判定方法は常に正しく動作しているは言えません。INFファイルの不備により、適合ハードウェアとしてインストールの検索時に検知されない場合もあります。

そのためなのか抜け道があります。インストールや更新時のメニューで、「一覧または特定の場所からインストールする」のオプションを選んで選択すると適合性が無いドライバでもインストールが可能になります。

質問2:
心配されているのは、デバイスマネージャからドライバの削除を行ったのにも関わらず、プラグアンドプレイ対応のドライバが復活してしまう事だと思います。復活させないためには、「ドライバの完全な削除」が必要ですが、Windows Vistaではデバイスマネージャから簡単に、「ドライバの完全な削除」ができるようになりました。

ドライバの完全な削除をする場合、2つの状況があります。1つは削除対象のデバイスがホストPCに接続されて稼動している場合、
2番目は、削除対象のドライバがインストールされてはいるが、デバイスがホストPCに接続されてなく、稼動もしていない場合。

> DDKサンプルのreadmeには以下の記載がありました(以下略)
というのは今まで見た記憶が無いのですが、この記述はそのPCIのドライバに対してだけ使えるかも知れない手順であり、他のバスのドライバやレガシィなドライバには適用できません。

削除対象のデバイスがホストPCに接続している場合の正しい(と私が信じている)削除手順は、次の通りです。
1.デバイスマネージャで対象デバイスを選択して、「削除」を行う。
2.Windows\Inf もしくは \Winnt\Inf から、該当のドライバ情報が記述された infファイル と pnfファイルを削除
3.\System32\Drivers から sysファイルを削除
4.もしも、該当のドライバ情報が記述された infファイルによりインストールされているdll等があれば、それらも削除
5.可能であれば、削除対象のデバイスを取り外す。

レジストリの操作をする必要がないのは、「デバイスマネージャ=レジストリのビューア」だからです。即ち、デバイスマネージャの操作はレジストリの操作と同じです。デバイスマネージャでのドライバ削除後は、ドライバの作業領域である質問2-2:のレジストリは無いはずですので、質問2-2:の削除の必要はありません。

削除対象のデバイスがホストPCに接続していない場合には、デバイスマネージャから「非表示のデバイスの表示」を行うことにより、上記とほぼ同じ手順で完全な削除ができます。いずれの手順も、レジストリを直接触るよりは、良いと思います。

--
> 質問2-3:
> デバイスマネージャからドライバの削除を行った場合、
> 削除されるのはOSが管理している内部情報だけなのでしょうか?

デバイスマネージャからドライバの削除==>レジストリ情報の削除になります。
OSが管理している内部情報==>レジストリ情報になります。

即ち、Yesです。

ただし上記削除を行った場合でも、PnPデバイス(PCIもPnPデバイス)ではPnP機構により、
ハードウェアの再接続=>ハードウェアの発見==>デバイスノードのレジストリ登録==>対応ドライバの検索==>ドライバの発見==>ドライバの再登録

の仕組みがあるので、完全削除をしない限り一旦削除したはずのドライバが復活する訳です。

ドライバの更新について

お世話になります。
便乗で質問させてください。

WDMで作成したUSBデバイスドライバを2つのソフトが使用しており、共にソフトインストール時にドライバをインストールしているのですが、
1つ目のソフトAをインストールした後に2つ目のソフトBをインストールした所、Aとの通信ができなくなる現象が発生しています。
(インストール直後はAとの通信は問題なくできていました)。OSはXPです。7では発生しませんでした。

別々のINFファイルで同名で同じバイナリのSysファイルをインストールしているのですが、このようなドライバを
共存させる使い方はできないのでしょうか。

以上、宜しくお願いします。

先にコッチから。 >

先にコッチから。

> 別々のINFファイルで同名で同じバイナリのSysファイルをインストールしているのですが、このようなドライバを共存させる使い方はできないのでしょうか。

ドライバの完全な削除(Windows 7の「このデバイスのドライバーソフトウェアの削除」)をするときの動作を考えると、この方法での共存は現実的ではありません。別々のINFファイルならば別々のバイナリのSysファイルにするか、各アプリケーションで共通のドライバとするのが普通です。

> 2つ目のソフトAをインストールした後に2つ目のソフトBをインストールした所、Aとの通信ができなくなる現象

恐らくですが、これは単にドライバのデバッグがちゃんとできていないというのが原因ではないでしょうか。
デバイス毎の作業領域はデバイスオブジェクトに保存して管理して、複数デバイスで同時に使用する可能性があるリソースは排他制御するというようなことです。

ご参考までに言いますと、Windows 7のドライバは、多少無茶をやっても<何とかこらえて>動いてしまう場合があります。

ありがとうございます

> ドライバの完全な削除(Windows 7の「このデバイスのドライバーソフトウェアの削除」)をするときの動作を考えると、この方法での共存は現実的ではありません。

なるほど、そうでしたか。
ちなみに複数装置との通信はできています。

ということで、別々のINFファイルなら別々のバイナリのSysファイルにす方向でいきたいと思います。
ありがとうございました。