!목록

!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
데이터 구조의 이름을 지정합니다.

필드
목록 링크가 포함된 필드를 지정합니다. 실제로 마침표로 구분된 필드 시퀀스일 수 있습니다(즉, Type.Field.Subfield.Subsubfield 등).

-x "명령"
실행할 명령을 지정합니다. 디버거 명령의 조합일 수 있습니다. 따옴표로 묶어야 합니다. 여러 명령을 지정한 경우 세미콜론으로 구분하고 ,!list 인수의 전체 컬렉션을 따옴표로 묶고, 이 외부 따옴표 안에 각 따옴표 앞에 이스케이프 문자(\)를 사용합니다. 명령을 생략하면 기본값은 dp(메모리 표시)입니다.

-a "인수"
Commands 매개 변수에 전달할 인수를 지정합니다 . 따옴표로 묶어야 합니다. 인수 는 인수에 따옴표를 포함할 수 없다는 점을 제외하고 일반적으로 이 명령을 따르도록 허용되는 유효한 인수 문자열일 수 있습니다. 의사 등록 $extret Commands포함된 경우 -a "Arguments" 매개 변수를 생략할 수 있습니다.

옵션은 다음 옵션 중 임의의 수일 수 있습니다.

-e
각 요소에 대해 실행되는 명령을 에코합니다.

-mMax
명령을 실행할 최대 요소 수를 지정합니다.

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