!lista
L'estensione !list esegue ripetutamente i comandi del debugger specificati, una volta per ogni elemento di un elenco collegato.
!list -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [Options] StartAddress
!list " -t [Module!]Type.Field -x \"Commands\" [-a \"Arguments\"] [Options] StartAddress "
!list -h
Parametri
Modulo
Parametro facoltativo che specifica il modulo che definisce questa struttura. Se è possibile che Type corrisponda a un simbolo valido in un modulo diverso, è necessario includere Module per eliminare l'ambiguità.
Digitare
Specifica il nome di una struttura di dati.
Campo
Specifica il campo contenente il collegamento elenco. Può trattarsi di una sequenza di campi separati da punti (in altre parole, Type.Field.Subfield.Subsubfield e così via).
-x "Comandi"
Specifica i comandi da eseguire. Può trattarsi di qualsiasi combinazione di comandi del debugger. Deve essere racchiuso tra virgolette. Se vengono specificati più comandi, separarli con punti e virgola, racchiudere l'intera raccolta di argomenti !list tra virgolette e usare un carattere di escape ( \ ) prima di ogni virgoletta all'interno di queste virgolette esterne. Se i comandi vengono omessi , il valore predefinito è dp (display memory).
-a "Argomenti"
Specifica gli argomenti da passare al parametro Commands . Deve essere racchiuso tra virgolette. Gli argomenti possono essere qualsiasi stringa di argomento valida che normalmente può seguire questo comando, ad eccezione del fatto che gli argomenti non possono contenere virgolette. Se il $extret di pseudoregistro è incluso in Commands, il parametro -a "Arguments" può essere omesso.
Le opzioni possono essere un numero qualsiasi delle opzioni seguenti:
-e
Esegue l'eco del comando da eseguire per ogni elemento.
-m Max
Specifica il numero massimo di elementi per cui eseguire il comando.
StartAddress
Specifica l'indirizzo della prima struttura di dati. Questo è l'indirizzo nella parte superiore della struttura, non necessariamente l'indirizzo del campo di collegamento.
-h
Visualizza un breve testo della Guida per questa estensione nella finestra Comando debugger.
DLL
Ext.dll
Osservazioni:
L'estensione !list passa attraverso l'elenco collegato e rilascia il comando specificato una volta per ogni elemento dell'elenco.
Il $extret di pseudoregistro viene impostato sul valore dell'indirizzo di immissione dell'elenco per ogni elemento dell'elenco. Per ogni elemento, viene eseguita la stringa di comando Commands . Questa stringa di comando può fare riferimento a questo pseudoregistro usando la sintassi $extret . Se questa operazione non viene visualizzata nella stringa di comando, il valore dell'indirizzo della voce di elenco viene aggiunto alla fine della stringa di comando prima dell'esecuzione. Se è necessario specificare dove deve essere visualizzato questo valore nel comando, è necessario specificare questo pseudoregistro in modo esplicito.
Questa sequenza di comandi verrà eseguita fino a quando l'elenco termina in un puntatore Null o termina eseguendo un ciclo indietro sul primo elemento. Se l'elenco esegue un ciclo in un elemento successivo, questo comando non verrà arrestato. Tuttavia, è possibile arrestare questo comando in qualsiasi momento usando CTRL+C in KD e CDB o Debug | Interrompere o PREMERE CTRL+INTERR in WinDbg.
Ogni volta che viene eseguito un comando, l'indirizzo della struttura corrente verrà usato come indirizzo predefinito se il comando usato ha parametri di indirizzo facoltativi.
Di seguito sono riportati due esempi di come usare questo comando in modalità utente. Si noti che l'utilizzo della modalità kernel è anche possibile, ma segue una sintassi diversa.
Come esempio semplice, si supponga di avere una struttura il cui nome di tipo è MYTYPE e che include collegamenti all'interno dei relativi collegamenti. Flink e .links. Lampeggiare i campi. Si dispone di un elenco collegato che inizia con la struttura in 0x6BC000. Il comando di estensione seguente scorrerà l'elenco e per ogni elemento eseguirà un comando dd L2. Poiché non viene specificato alcun indirizzo al comando dd , accetta l'indirizzo dell'intestazione dell'elenco come indirizzo desiderato. In questo modo vengono visualizzati i primi due DWORD in ogni struttura.
0:000> !list -t MYTYPE.links.Flink -x "dd" -a "L2" 0x6bc00
Come esempio più complesso, considerare il caso dell'uso di $extret. Segue l'elenco di tipo _LIST_ENTRY in RtlCriticalSectionList. Per ogni elemento, visualizza i primi quattro DWORDS e quindi visualizza la struttura _RTL_CRITICAL_SECTION_DEBUG che si trova in corrispondenza di un offset di otto byte prima dell'elemento Flink della voce dell'elenco.
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