!for_each_function 拡張機能は、指定されたパターンに名前が一致する、指定されたモジュール内の関数ごとにデバッガ コマンドを実行します。
!for_each_function -m:ModuleName -p:Pattern -c:CommandString
!for_each_function -?
パラメーター
-m:ModuleName
モジュール名を指定します。 この名前は通常、ファイル名拡張子を除いたファイル名です。 場合によっては、モジュール名がファイル名と大きく異なる場合があります。
-p:Pattern
照合するパターンを指定します。
-c:CommandString
指定されたモジュール内の、パターンに一致する各関数に対して実行するデバッガー コマンドを指定します。
CommandString では次のエイリアスを使用できます。
| エイリアス | データの種類 | Value |
|---|---|---|
@#SymbolName |
string |
シンボル名。 |
@#SymbolAddress |
ULONG64 |
シンボルアドレス。 |
@#ModName |
string |
モジュール名。 |
@#FunctionName |
string |
関数名。 |
-?
この拡張機能のヘルプを表示します。
DLL
Ext.dll
解説
次の例は、PCI モジュール内の、パターン *read* に一致するすべての関数名をリストする方法を示しています。
1: kd> !for_each_function -m:pci -p:*read* -c:.echo @#FunctionName
PciReadDeviceConfig
PciReadDeviceSpace
PciReadSlotIdData
PciExternalReadDeviceConfig
PiRegStateReadStackCreationSettingsFromKey
VmProxyReadDevicePathsFromRegistry
PpRegStateReadCreateClassCreationSettings
ExpressRootPortReadConfigSpace
PciReadRomImage
PciDevice_ReadConfig
PciReadDeviceConfigEx
PciReadSlotConfig
エイリアスの前後に空白がない場合は、${}エイリアスインタープリタートークン内にエイリアスを配置する必要があります。
次の例は、関数名がパターン *CreateFile* に一致する、すべてのモジュール内のすべてのシンボルを一覧表示する方法を示しています。 エイリアス @#ModuleName の前に空白スペースはありません。 したがって、これは ${} Alias Interpreter トークン内に置かれます。
注 @#ModuleName エイリアスと @#ModName エイリアスを混同しないでください。 @#ModuleName エイリアスは !for_each_module 拡張機能に属し、@#ModName エイリアスは !for_each_function 拡張機能に属します。
1: kd> !for_each_module !for_each_function -m:${@#ModuleName} -p:*CreateFile* -c:.echo @#SymbolName
nt!BiCreateFileDeviceElement
nt!NtCreateFile
...
Wdf01000!FxFileObject::_CreateFileObject
fltmgr!FltCreateFileEx2$fin$0
fltmgr!FltCreateFileEx2
...
Ntfs!TxfIoCreateFile
Ntfs!NtfsCreateFileLock
...
MpFilter!MpTxfpCreateFileEntryUnsafe
mrxsmb10!MRxSmbFinishLongNameCreateFile
...
srv!SrvIoCreateFile
コマンド シーケンスを 1 つのコマンド ファイルにまとめ、パターンと一致する関数ごとに $$>< (実行スクリプト ファイル) を使用してこれらのコマンドを実行することができます。 Commands.txt という名前のファイルに次のコマンドが含まれているとします。
.echo
.echo @#FunctionName
u @#SymbolAddress L1
次の例では、Commands.text ファイル内のコマンドが、パターン *read* に一致する PCI モジュール内の関数ごとに実行されます。
1: kd> !for_each_function -m:pci -p:*read* -c:$$><Commands.txt
PciReadDeviceConfig
pci!PciReadDeviceConfig [d:\wmm1\drivers\busdrv\pci\config.c @ 349]:
fffff880`00f7b798 48895c2408 mov qword ptr [rsp+8],rbx
PciReadDeviceSpace
pci!PciReadDeviceSpace [d:\wmm1\drivers\busdrv\pci\config.c @ 1621]:
fffff880`00f7c044 48895c2408 mov qword ptr [rsp+8],rbx
...