Bagikan melalui


!daftar

Ekstensi !list menjalankan perintah debugger yang ditentukan berulang kali, sekali untuk setiap elemen dalam daftar tertaut.

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

Parameter

Modul
Parameter opsional yang menentukan modul yang menentukan struktur ini. Jika ada kemungkinan Jenis dapat mencocokkan simbol yang valid dalam modul yang berbeda, Anda harus menyertakan Modul untuk menghilangkan ambiguitas.

Jenis
Menentukan nama struktur data.

Kebun
Menentukan bidang yang berisi tautan daftar. Ini sebenarnya bisa menjadi urutan bidang yang dipisahkan oleh titik (dengan kata lain, Type.Field.Subfield.Subsubfield, dan sebagainya).

-x "Perintah"
Menentukan perintah yang akan dijalankan. Ini bisa berupa kombinasi perintah debugger apa pun. Ini harus diapit dalam tanda kutip. Jika beberapa perintah ditentukan, pisahkan dengan titik koma, sertakan seluruh kumpulan argumen !list dalam tanda kutip, dan gunakan karakter escape ( \ ) sebelum setiap tanda kutip di dalam tanda kutip luar ini. Jika Perintah dihilangkan, defaultnya adalah dp (Memori Tampilan).

-a "Argumen"
Menentukan argumen yang akan diteruskan ke parameter Perintah . Ini harus diapit dalam tanda kutip. Argumen dapat berupa string argumen valid apa pun yang biasanya diizinkan untuk mengikuti perintah ini, kecuali bahwa Argumen tidak boleh berisi tanda kutip. Jika $extret pseudo-register disertakan dalam Perintah, parameter -a "Argumen" dapat dihilangkan.

Opsi Bisa berupa sejumlah opsi berikut:

-e
Menggemakan perintah yang dijalankan untuk setiap elemen.

-m Maks
Menentukan jumlah maksimum elemen untuk menjalankan perintah.

StartAddress
Menentukan alamat struktur data pertama. Ini adalah alamat di bagian atas struktur, belum tentu alamat bidang tautan.

-h
Menampilkan beberapa teks Bantuan singkat untuk ekstensi ini di jendela Perintah Debugger.

DLL

Ext.dll

Keterangan

Ekstensi !list akan melalui daftar tertaut dan mengeluarkan perintah yang ditentukan sekali untuk setiap elemen daftar.

$extret pseudo-register diatur ke nilai alamat entri daftar untuk setiap elemen daftar. Untuk setiap elemen, perintah string perintah dijalankan. String perintah ini dapat mereferensikan pseudo-register ini menggunakan sintaks $extret . Jika ini tidak muncul dalam string perintah, nilai alamat entri daftar ditambahkan ke akhir string perintah sebelum eksekusi. Jika Anda perlu menentukan di mana nilai ini akan muncul dalam perintah Anda, Anda harus menentukan pseudo-register ini secara eksplisit.

Urutan perintah ini akan berjalan hingga daftar berakhir dalam pointer null, atau berakhir dengan mengulang kembali ke elemen pertama. Jika daftar mengulang kembali ke elemen selanjutnya, perintah ini tidak akan berhenti. Namun, Anda dapat menghentikan perintah ini kapan saja dengan menggunakan CTRL+C di KD dan CDB, atau Debug | Break atau CTRL+BREAK di WinDbg.

Setiap kali perintah dijalankan, alamat struktur saat ini akan digunakan sebagai alamat default jika perintah yang digunakan memiliki parameter alamat opsional.

Berikut adalah dua contoh cara menggunakan perintah ini dalam mode pengguna. Perhatikan bahwa penggunaan mode kernel juga dimungkinkan tetapi mengikuti sintaks yang berbeda.

Sebagai contoh sederhana, asumsikan bahwa Anda memiliki struktur yang nama jenisnya adalah MYTYPE, dan yang memiliki tautan dalam .links-nya . Flink dan .links. Bidang blink . Anda memiliki daftar tertaut yang dimulai dengan struktur di 0x6BC000. Perintah ekstensi berikut akan melalui daftar dan untuk setiap elemen akan menjalankan perintah dd L2. Karena tidak ada alamat yang ditentukan ke perintah dd , alamat kepala daftar akan diambil sebagai alamat yang diinginkan. Ini menyebabkan dua DWORD pertama di setiap struktur ditampilkan.

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

Sebagai contoh yang lebih kompleks, pertimbangkan kasus penggunaan $extret. Ini mengikuti daftar jenis _LIST_ENTRY di RtlCriticalSectionList. Untuk setiap elemen, ini menampilkan empat DWORDS pertama, lalu menampilkan struktur _RTL_CRITICAL_SECTION_DEBUG yang terletak di offset delapan byte sebelum elemen Flink dari entri daftar.

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