Partager via


!list

L’extension !list exécute à plusieurs reprises les commandes du débogueur spécifiées, une fois pour chaque élément d’une liste liée.

!list -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [Options] StartAddress 
!list " -t [Module!]Type.Field -x \"Commands\" [-a \"Arguments\"] [Options] StartAddress " 
!list -h 

Paramètres

Module
Paramètre facultatif spécifiant le module qui définit cette structure. S’il est possible que le paramètre Type corresponde à un symbole valide dans un autre module, vous devez inclure Module pour éliminer l’ambiguïté.

Type
Spécifie le nom d’une structure de données.

Champ
Spécifie le champ contenant le lien de liste. Il peut s’agir en fait d’une séquence de champs séparés par des points (par exemple, Type.Field.Subfield.Subsubfield).

-x "Commandes "
Spécifie les commandes à exécuter. Il peut s’agir de n’importe quelle combinaison de commandes de débogueur. Elle doit être placée entre guillemets. Si plusieurs commandes sont spécifiées, séparez-les par des points-virgules, placez l’ensemble de la collection d’arguments !list entre guillemets et utilisez un caractère d’échappement ( \ ) avant chaque guillemet à l’intérieur de ces guillemets externes. Si Commands est omis, la valeur par défaut est dp (Mémoire d’affichage).

-a "Arguments "
Spécifie les arguments à transmettre au paramètre Commands. Ils doivent être placés entre guillemets. Le paramètre Arguments peut contenir n’importe quelle chaîne d’argument valide qui serait normalement autorisée à suivre cette commande. Cependant, le paramètre Arguments ne peut pas contenir de guillemets. Si le pseudo-registre $extret est inclus dans Commands, le paramètre -a "Arguments" peut être omis.

Options Peut être toute option parmi les suivantes :

-e
Renvoie la commande en cours d’exécution pour chaque élément.

-m Max
Spécifie le nombre maximal d’éléments pour lesquels on exécute cette commande.

StartAddress
Spécifie l’adresse de la première structure de données. Il s’agit de l’adresse située en haut de la structure, qui ne correspond pas nécessairement à l’adresse du champ de liaison.

-h
Affiche un court texte d’aide pour cette extension dans la fenêtre de commande de débogueur.

DLL

Ext.dll

Notes

L’extension !list parcourt la liste liée et émet la commande spécifiée une fois pour chaque élément de la liste.

Le pseudo-registre $extret est défini sur la valeur de l’adresse d’entrée de liste pour chaque élément de la liste. Pour chaque élément, la chaîne de commandes Commands est exécutée. Cette chaîne de commandes peut faire référence au pseudo-registre grâce à la syntaxe $extret. Si cela n’apparaît pas dans la chaîne de commandes, la valeur de l’adresse d’entrée de liste est ajoutée à la fin de la chaîne de commandes avant l’exécution. Si vous devez spécifier l’emplacement où cette valeur doit apparaître dans votre commande, vous devez spécifier explicitement ce pseudo-registre.

Cette séquence de commandes s’exécute jusqu’à ce que la liste se termine sur un pointeur null ou en bouclant de nouveau sur le premier élément. Si la liste forme une boucle vers un élément ultérieur, cette commande ne s’arrête pas. Toutefois, vous pouvez arrêter cette commande à tout moment dans KD et CDB avec CTRL+C, et dans WinDbg avec Debug | Break ou Ctrl+PAUSE.

Chaque fois qu’une commande est exécutée, l’adresse de la structure actuelle est utilisée comme adresse par défaut si la commande utilisée a des paramètres d’adresse facultatifs.

Vous trouverez ci-dessous deux exemples d’utilisation de cette commande en mode utilisateur. Notez que l’utilisation en mode noyau est également possible, mais qu’elle possède une syntaxe différente.

En guise d’exemple simple, supposons que vous disposez d’une structure dont le nom de type est MYTYPE, qui a des liens dans ses champs .links.Flink et .links.Blink. Vous disposez d’une liste liée qui commence avec la structure à 0x6BC000. La commande d’extension suivante passe par la liste et exécute pour chaque élément une commande L2 dd. Étant donné qu’aucune adresse n’est spécifiée dans la commande dd, elle prend l’adresse de la tête de liste comme adresse souhaitée. Cela entraîne l’affichage des deux premiers DWORD dans chaque structure.

0:000> !list -t MYTYPE.links.Flink -x "dd" -a "L2" 0x6bc00 

Pour voir un exemple plus complexe, prenons le cas de l’utilisation de $extret. Il suit la liste du type _LIST_ENTRY de RtlCriticalSectionList. Pour chaque élément, il affiche les quatre premiers DWORD, puis affiche la structure _RTL_CRITICAL_SECTION_DEBUG située à un décalage de huit octets avant l’élément Flink de l’entrée de liste.

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