!for_each_function

L'estensione !for_each_function esegue un comando debugger per ogni funzione, in un modulo specificato, il cui nome corrisponde a un criterio specificato.

!for_each_function -m:ModuleName -p:Pattern -c:CommandString
!for_each_function -?

Parametri

-m:ModuleName
Specifica il nome del modulo. Questo nome è in genere il nome del file senza l'estensione del nome file. In alcuni casi, il nome del modulo differisce in modo significativo dal nome del file.

-p:Pattern
Specifica il criterio di corrispondenza.

-c:CommandString
Specifica il comando del debugger da eseguire per ogni funzione, nel modulo specificato, che corrisponde al modello.

È possibile usare gli alias seguenti in CommandString.

Alias Tipo di dati Valore

@#SymbolName

string

Nome del simbolo.

@#SymbolAddress

ULONG64

Indirizzo del simbolo.

@#ModName

string

Nome del modulo.

@#FunctionName

string

Nome della funzione.

-?
Visualizza la Guida per questa estensione.

DLL

Ext.dll

Osservazioni:

Nell'esempio seguente viene illustrato come elencare tutti i nomi di funzione, nel modulo PCI, che corrispondono al modello *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

Se un alias non è preceduto e seguito da uno spazio vuoto, è necessario inserire l'alias all'interno del token dell'interprete ${} Alias.

Nell'esempio seguente viene illustrato come elencare tutti i simboli, in tutti i moduli, i cui nomi di funzione corrispondono al modello *CreateFile*. L'alias @#ModuleName non è preceduto da uno spazio vuoto. Pertanto, viene inserito all'interno del token dell'interprete ${} Alias .

Nota Non confondere l'alias @#ModuleName con l'alias @#ModName. L'alias @#ModuleName appartiene all'estensione !for_each_module e l'alias @#ModName appartiene all'estensione !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

È possibile inserire una sequenza di comandi in un file di comando e usare $$>< (Esegui file script) per eseguire questi comandi per ogni funzione che corrisponde al modello. Si supponga che un file denominato Commands.txt contenga i comandi seguenti:

.echo
.echo @#FunctionName
u @#SymbolAddress L1

Nell'esempio seguente i comandi nel file Commands.text vengono eseguiti per ogni funzione, nel modulo PCI, che corrisponde al modello *read*.

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

...

Vedi anche

!for_each_module