次の方法で共有


ユーザーモード デバッガーでのデバイスのインストールのデバッグ

Windows Vista 以降では、プラグアンドプレイ (PnP) マネージャーがシステム内の新しいデバイスを検出すると、オペレーティングシステムはデバイスのドライバーを検索して、インストールするためのデバイスインストールのホストプロセス (DrvInst.exe) を開始します。

ユーザーモードのデバイスインストールホストプロセスをデバッグする最も効率的な方法は、WinDbg や Visual Studio などのユーザーモードのデバッガーを使用することです。 理由として、DrvInst.exe プロセスは通常、ユーザーの操作なしで完了するため、Microsoft は Windows Vista とそれ以降のバージョンの Windows にサポートを追加し、ドライバーパッケージの開発者がデバイスのインストールのコアステージを処理する前にデバッガーをアタッチできるようにします。

ユーザーモードのデバッガーとその他のデバッグツールの詳細については、Windows デバッグを参照してください。

DebugInstall レジストリ値は、システムで有効になっているデバイスインストールのデバッグサポートの種類を指定します。 このレジストリ値の詳細については、デバイスのインストールのデバッグサポートを有効にするを参照してください。

DebugInstall レジストリ値が 2 に設定されている場合、DrvInst.exeは、インストールを続行する前に、ユーザーモードデバッガーがプロセスにアタッチされるのを待ちます。 デバッガーがアタッチされると、プロセスはデバッガー自体に分割されます。 デバッガーをアタッチし、デバッグ対象のターゲットシステムで独自の初期ブレークポイントを開始しないように構成する必要があります。

たとえば、デバッガーを名前で DrvInst.exe にアタッチできます。

C:\>C:\Debuggers\WinDbg.exe -g -pn DrvInst.exe

または、デバッガーがターゲットシステムにアタッチされている場合は、次のデバッグ情報が表示されます。

DRVINST.EXE: Waiting for debugger on Process ID = 3556 ......

これにより、デバッガーは独自のプロセス ID を使用して DrvInst.exe プロセスにアタッチできます。

C:\>C:\Debuggers\WinDbg.exe -g -p 3556

ユーザーモードデバッガーがDrvInst.exe プロセスにアタッチされると、プロセスはデバッガーに分割されます。

Debugger detected!
DRVINST.EXE: Entering debugger during PnP device installation.
Device instance = "X\Y\Z" ...

(d48.5a0): Break instruction exception - code 80000003 (first chance)
eax=7ffde000 ebx=00000000 ecx=00000000 edx=77f745c0 esi=00000000 edi=00000000
eip=77f24584 esp=0105ff74 ebp=0105ffa0 iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
77f24584 cc               int     3

0:000> |
.  0id: d48attachname: E:\Windows\system32\DrvInst.exe

デバイスのインストールのコアステージが処理されていないため、デバイスに使用されるクラスインストーラーまたは共同インストーラー DLL はまだ読み込まれていません。

ブレークポイントのモジュール名と関数名が事前にわかっている場合は、「bu」 デバッガーコマンドを使用して、その名前を未解決のブレークポイントとして設定できます。 次のコード例は、MyCoinst.dll共同インストーラーのメインエントリポイント (CoInstallerProc) に未解決のブレークポイントを設定する方法を示しています。

0:000> bu mycoinst!CoInstallerProc
0:000> bl
 0 eu             0001 (0001) (mycoinst!CoInstallerProc)

MyCoinst.dll共同インストーラーが読み込まれ、ブレークポイントに達したとき:

Breakpoint 0 hit
eax=00000001 ebx=00000000 ecx=00000152 edx=00000151 esi=01a57298 edi=00000002
eip=5bcf54f1 esp=0007e204 ebp=0007e580 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
mycoinst!CoInstallerProc:
5bcf54f1 8bff             mov edi,edi
0:000> bl
 0 e 5bcf54f1     0001 (0001)  0:**** mycoinst!CoInstallerProc

クラスインストーラーまたは共同インストーラー DLL は、それぞれ、DrvInst.exe プロセスから読み込まれるかアンロードされるかを予測しません。 ただし、「bu」を使用して設定されたブレークポイントはメインモジュールがアンロードされた場合でも残ります。

または、特定のクラス インストーラーまたは共同インストーラー DLL がプロセスに読み込まれる時点まで、その DLL の読み込みイベントにデバッガーの例外を設定することで、DrvInst.exe プロセスの実行が許可される場合があります。

0:000> sxe ld mycoinst.dll

0:000> g

モジュールが読み込まれた後、DLL 内でブレークポイントを設定できます。 次に例を示します。

ModLoad: 5bcf0000 5bd05000   C:\WINDOWS\system32\mycoinst.dll
eax=00000000 ebx=00000000 ecx=011b0000 edx=7c90eb94 esi=00000000 edi=00000000
eip=7c90eb94 esp=0007da54 ebp=0007db48 iopl=0         nv up ei ng nz ac po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000296
ntdll!KiFastSystemCallRet:
7c90eb94 c3               ret
0:000> .reload mycoinst.dll
0:000> x mycoinst!*InstallerProc*
5bcf54f1 mycoinst!CoInstallerProc (unsigned int, void *, struct _SP_DEVINFO_DATA *)

0:000> bu mycoinst!CoInstallerProc
0:000> bl
 0 e 3b0649d5     0001 (0001)  0:**** mycoinst!CoInstallerProc
0:000> sxd ld mycoinst.dll
0:000> g
Breakpoint 0 hit
eax=00000001 ebx=00000000 ecx=000001d4 edx=000001d3 esi=000bbac0 edi=00000002
eip=5bcf54f1 esp=0007e204 ebp=0007e580 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
mycoinst!CoInstallerProc:
5bcf54f1 8bff             mov edi,edi
0:000> 

ブレークポイントは未解決のブレークポイント (bu) として設定されているため、モジュールがアンロードされても設定されたままになります。

インストールのプロセスが完了するまでの既定時間は 5 分です。 指定時間内にプロセスが完了しない場合、システムはプロセスがハング (応答を停止) して、インストールのプロセスが終了したと見なします。

デバイスのインストールのプロセス中にユーザー モードデバッガーがターゲットシステムにアタッチされている場合、システムはこのタイムアウト期間を強制しません。 これにより、 ドライバーパッケージ 開発者は、インストールのプロセスのデバッグに必要な時間を費やすことができます。