!list
その !list 拡張機能は、指定されたデバッガー コマンドを、リンク リスト内の要素ごとに 1 回ずつ繰り返し実行します。
!list -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [Options] StartAddress
!list " -t [Module!]Type.Field -x \"Commands\" [-a \"Arguments\"] [Options] StartAddress "
!list -h
パラメーター
Module
この構造体を定義するモジュールを指定する省略可能なパラメーター。 その可能性があるなら Type 別のモジュール内の有効なシンボルと一致する可能性があるため、含める必要があります モジュール 曖昧さをなくすために。
Type
データ構造体の名前を指定します。
Field
リストリンクを含むフィールドを指定します。 これは、ピリオドで区切られたフィールドのシーケンスを実際に指定できます(つまり、 Type.Field.Subfield.Subsubfieldなど)。
-x "コマンド"
実行するコマンドを指定します。 デバッガーコマンドの任意の組み合わせを指定できます。 引用符で囲む必要があります。 複数のコマンドを指定する場合は、セミコロンで区切って、コマンドのコレクション全体を囲んでください !list 引数は引用符で囲み、外側の引用符内のそれぞれの引用符の前にエスケープ文字 ( \ ) を使用します。 もし コマンド が省略されている場合、デフォルトは dp (ディスプレイメモリー).
-a "引数"
渡す引数を指定します、 コマンドパラメーター 。 これは、引用符で囲む必要があります。 Arguments 通常、このコマンドの後に使用できる有効な引数文字列を指定できます。ただし、 引数 引用符は使用できません。 疑似レジスタの場合、 $抽出された に含まれます コマンド, その -a "引数" パラメーターは省略できます。
オプション 次のオプションをいくつでも指定できます.
-e
各要素に対して実行されているコマンドをエコーします。
-m Max
コマンドを実行する要素の最大数を指定します。
StartAddress
最初のデータ構造体のアドレスを指定します。 これは、必ずしもリンクフィールドのアドレスではなく、構造体の先頭にあるアドレスです。
-h
デバッガーコマンドウィンドウで、この拡張機能の簡単なヘルプテキストを表示します。
DLL
Ext.dll
備考
その !list リスト拡張機能は、リンクリストを通過し、リスト要素ごとに1回指定されたコマンドを発行します。
擬似レジスタ $extret 各リスト要素のリストエントリのアドレスの値に設定されます。 各要素に対して、 コマンド 文字列コマンドが実行されます。 このコマンド文字列は、 $extre t構文を使用してこの擬似レジスタを参照できます。 コマンド文字列に表示されない場合は、実行前にコマンド文字列の末尾にリストエントリのアドレスの値が追加されます。 コマンドでこの値を表示する場所を指定する必要がある場合は、この擬似レジスタを明示的に指定する必要があります。
このコマンドシーケンスは、リストがnullポインターで終了するか、最初の要素にループバックして終了するまで実行されます。 リストが後の要素にループバックする場合、このコマンドは停止しません。 ただし、このコマンドは、次のコマンドを使用していつでも停止できます CTRL+C KD および CDB で、または デバッグ | 壊す WinDbg では CTRL+BREAK を押します。
コマンドが実行されるたびに、使用されているコマンドに省略可能なアドレスパラメーターがある場合、現在の構造体のアドレスが 既定のアドレスとして使用されます 。
ユーザーモードでこのコマンドを使用する方法の2つの例を次に示します。 カーネルモードの使用も可能ですが、別の構文に従うことに注意してください。
簡単な例として、型名が次のような構造体があるとします MYTYPE, そして、その中にリンクがあるもの .links.Flink そして .links.Blink 田畑. 0x6BC000の構造で始まるリンクリストがあります。 次の拡張コマンドはリストを調べ、要素ごとに dd L2コマンド。 dd コマンドにアドレスが指定されていないため、リストの先頭のアドレスが目的のアドレスとして取得されます。 これにより、各構造体の最初の2つのDwordが表示されます。
0:000> !list -t MYTYPE.links.Flink -x "dd" -a "L2" 0x6bc00
より複雑な例として、 $extretを使用する場合を考えてみます。 これは、 RtlCriticalSectionListの_リスト_エントリの種類の一覧に従います。 各要素について、最初の4つのDwordが表示され、リストエントリの Flink要素の8バイト前のオフセットにある_RTL_CRITICAL_SECTION_DEBUG構造体が表示されます 。
0:000> !list "-t ntdll!_LIST_ENTRY.Flink -e -x \"dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8\" ntdll!RtlCriticalSectionList"
dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8
7c97c0c8 7c97c428 7c97c868 01010000 00000080
+0x000 Type : 1
+0x002 CreatorBackTraceIndex : 0
+0x004 CriticalSection : (null)
+0x008 ProcessLocksList : _LIST_ENTRY [ 0x7c97c428 - 0x7c97c868 ]
+0x010 EntryCount : 0x1010000
+0x014 ContentionCount : 0x80
+0x018 Spare : [2] 0x7c97c100
dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8
7c97c428 7c97c448 7c97c0c8 00000000 00000000
+0x000 Type : 0
+0x002 CreatorBackTraceIndex : 0
+0x004 CriticalSection : 0x7c97c0a0
+0x008 ProcessLocksList : _LIST_ENTRY [ 0x7c97c448 - 0x7c97c0c8 ]
+0x010 EntryCount : 0
+0x014 ContentionCount : 0
+0x018 Spare : [2] 0