Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
...