!for_each_function

!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

...

関連項目

!for_each_module