!목록
!list 확장은 연결된 목록의 모든 요소에 대해 한 번씩 지정된 디버거 명령을 반복적으로 실행합니다.
!list -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [Options] StartAddress
!list " -t [Module!]Type.Field -x \"Commands\" [-a \"Arguments\"] [Options] StartAddress "
!list -h
매개 변수
모듈
이 구조를 정의하는 모듈을 지정하는 선택적 매개 변수입니다. 형식이 다른 모듈의 유효한 기호와 일치할 수 있는 경우 모호성을 제거하기 위해 모듈을 포함해야 합니다.
형
데이터 구조의 이름을 지정합니다.
밭
목록 링크가 포함된 필드를 지정합니다. 실제로 마침표로 구분된 필드 시퀀스일 수 있습니다(즉, Type.Field.Subfield.Subsubfield 등).
-x "명령"
실행할 명령을 지정합니다. 디버거 명령의 조합일 수 있습니다. 따옴표로 묶어야 합니다. 여러 명령을 지정한 경우 세미콜론으로 구분하고 ,!list 인수의 전체 컬렉션을 따옴표로 묶고, 이 외부 따옴표 안에 각 따옴표 앞에 이스케이프 문자(\)를 사용합니다. 명령을 생략하면 기본값은 dp(메모리 표시)입니다.
-a "인수"
Commands 매개 변수에 전달할 인수를 지정합니다 . 따옴표로 묶어야 합니다. 인수 는 인수에 따옴표를 포함할 수 없다는 점을 제외하고 일반적으로 이 명령을 따르도록 허용되는 유효한 인수 문자열일 수 있습니다. 의사 등록 $extret Commands에 포함된 경우 -a "Arguments" 매개 변수를 생략할 수 있습니다.
옵션은 다음 옵션 중 임의의 수일 수 있습니다.
-e
각 요소에 대해 실행되는 명령을 에코합니다.
-m Max
명령을 실행할 최대 요소 수를 지정합니다.
StartAddress
첫 번째 데이터 구조의 주소를 지정합니다. 이 주소는 구조체 맨 위에 있는 주소이며 반드시 링크 필드의 주소는 아닙니다.
-h
디버거 명령 창에 이 확장에 대한 몇 가지 간단한 도움말 텍스트를 표시합니다.
DLL
Ext.dll
설명
!list 확장은 연결된 목록을 통과하고 각 목록 요소에 대해 지정된 명령을 한 번 실행합니다.
의사 등록 $extret 각 목록 요소의 목록 항목 주소 값으로 설정됩니다. 각 요소에 대해 명령 문자열 명령이 실행됩니다. 이 명령 문자열은 $extret 구문을 사용하여 이 의사 레지스터를 참조할 수 있습니다. 명령 문자열에 표시되지 않으면 실행 전에 목록 항목 주소의 값이 명령 문자열의 끝에 추가됩니다. 명령에 이 값이 표시되어야 하는 위치를 지정해야 하는 경우 이 의사 레지스터를 명시적으로 지정해야 합니다.
이 명령 순서는 목록이 null 포인터에서 종료되거나 첫 번째 요소로 다시 반복하여 종료될 때까지 실행됩니다. 목록이 이후 요소로 다시 반복되면 이 명령은 중지되지 않습니다. 그러나 KD 및 CDB에서 Ctrl+C를 사용하거나 | 디버그를 사용하여 언제든지 이 명령을 중지할 수 있습니다. WinDbg에서 중단 또는 CTRL+BREAK
명령이 실행될 때마다 사용 중인 명령에 선택적 주소 매개 변수가 있는 경우 현재 구조체의 주소가 기본 주소로 사용됩니다.
다음은 사용자 모드에서 이 명령을 사용하는 방법에 대한 두 가지 예입니다. 커널 모드 사용도 가능하지만 다른 구문을 따릅니다.
간단한 예제에서는 형식 이름이 MYTYPE이고 해당 .links 내에 링크가 있는 구조체가 있다고 가정합니다. Flink 및 .links. 필드를 깜박입니다. 0x6BC000 구조로 시작하는 연결된 목록이 있습니다. 다음 확장 명령은 목록을 살펴보고 각 요소에 대해 dd L2 명령을 실행합니다. dd 명령에 지정된 주소가 없으므로 목록 머리의 주소를 원하는 주소로 사용합니다. 이렇게 하면 각 구조체의 처음 두 DWORD가 표시됩니다.
0:000> !list -t MYTYPE.links.Flink -x "dd" -a "L2" 0x6bc00
더 복잡한 예제로 $extret 사용하는 경우를 고려해 보세요. RtlCriticalSectionList의 _LIST_ENTRY 형식 목록을 따릅니다. 각 요소에 대해 처음 4개의 DWORDS를 표시한 다음 목록 항목의 Flink 요소 앞에 8바이트의 오프셋에 있는 _RTL_CRITICAL_SECTION_DEBUG 구조를 표시합니다.
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