Microsoft MVP성태의 닷넷 이야기
디버깅 기술: 55. Windbg - 윈도우 핸들 테이블 (2) [링크 복사], [링크+제목 복사]
조회: 28838
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 5개 있습니다.)
디버깅 기술: 28. Windbg - 윈도우 핸들 테이블
; https://www.sysnet.pe.kr/2/0/935

디버깅 기술: 55. Windbg - 윈도우 핸들 테이블 (2)
; https://www.sysnet.pe.kr/2/0/1476

디버깅 기술: 151. Windows 10 - Process Explorer로 확인한 Handle 정보를 windbg에서 조회
; https://www.sysnet.pe.kr/2/0/12099

디버깅 기술: 168. windbg - 필터 드라이버 확인하는 확장 명령어(!fltkd)
; https://www.sysnet.pe.kr/2/0/12283

디버깅 기술: 194. Windbg - x64 가상 주소를 물리 주소로 변환
; https://www.sysnet.pe.kr/2/0/13500




Windbg - 윈도우 핸들 테이블 (2)

지난번 글에서 부모/자식 간에 상속되는 핸들 문제를 살펴보았는데요.

프로세스가 종료된 후에도 소켓이 살아있다면?
; https://www.sysnet.pe.kr/2/0/1475

실습 겸 해서 이것을 windbg/Process Explorer를 통해서 확인해 보았습니다. 우선, 소켓의 핸들값은 Socket.Handle 속성으로부터 쉽게 구할 수 있습니다.

Socket srvSocket =
    new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

Console.WriteLine("Socket Handle: 0x" + srvSocket.Handle.ToString("X"));

실제로 이 값을 Process Explorer에서 살펴보면 File 타입의 \Device\Afd 항목으로 확인이 가능합니다.

socket_inherit_1.png

Type: File
Name: \Device\Afd
Handle: 0x298
Object Address: 0xFFFFFA8020907330
Acces: 0x0016019F

자... 그럼, 이걸 windbg로 탐험해 볼까요? 다음은 User-mode에서 소켓 핸들 정보를 얻어온 결과입니다.

0:003> !handle 0x298 f
Handle 298
  Type          File
  Attributes    0
  GrantedAccess 0x16019f:
         ReadControl,WriteDac,Synch
         Read/List,Write/Add,Append/SubDir/CreatePipe,ReadEA,WriteEA,ReadAttr,WriteAttr
  HandleCount   3
  PointerCount  786420
  No Object Specific Information available

아쉽게도 소켓이라는 것을 알 수 있는 방법이 없군요. ^^ 자식 프로세스로 내려와서 핸들을 살펴보면 상속을 받았기 때문에 예상했던 대로 부모 프로세스의 핸들값과 동일한 값이 나오는 것을 확인할 수 있습니다.

socket_inherit_2.png

Type, Name, Handle, Object Address, Access 값이 모두 똑같습니다.




실습하다 보니 예전에 써놓은 글이 생각났습니다. ^^

Windbg - 윈도우 핸들 테이블
; https://www.sysnet.pe.kr/2/0/935

커널 모드로 확인해 보면 좀 더 많은 정보를 얻을 수 있을까요? (아래의 실습에서는 프로세스를 새로 실행했기 때문에 pid == 0x1274가 되었습니다.)

우선, windbg에서 Live 커널 디버깅으로 진입합니다.

0:004> .attach -k
Attach will occur on next execution

||0:0:004> g
Connected to Windows 7 9200 x64 target at (Tue Aug 13 00:22:35.078 2013 (UTC + 9:00)), ptr64 TRUE
Symbol search path is: SRV*d:\Symbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
Windows 7 Kernel Version 9200 MP (2 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 9200.16628.amd64fre.win8_gdr.130531-1504
Machine Name:
Kernel base = 0xfffff800`7627b000 PsLoadedModuleList = 0xfffff800`76547a20
Debug session time: Tue Aug 13 00:22:35.438 2013 (UTC + 9:00)
System Uptime: 0 days 1:15:52.418

위의 메시지에서는 "Windows 7"이라고 나왔지만, 실제로 테스트 머신은 Windows 8 x64였습니다.

다음으로, EPROCESS 주소를 얻기 위해 !process 명령을 수행하고,

||1:lkd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fffffa8001888040
    SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 00187000  ObjectTable: fffff8a000003000  HandleCount: <Data Not Accessible>
    Image: System

... [생략] ...

PROCESS fffffa800425e940
    SessionId: 2  Cid: 0888    Peb: 7f5ffeed000  ParentCid: 03e4
    DirBase: 5b7eb000  ObjectTable: fffff8a00571a580  HandleCount: <Data Not Accessible>
    Image: ConsoleApplication3.exe

PROCESS fffffa800426d600
    SessionId: 2  Cid: 0344    Peb: 7f694e7a000  ParentCid: 0888
    DirBase: 5c090000  ObjectTable: fffff8a005397f00  HandleCount: <Data Not Accessible>
    Image: notepad.exe

기본 디버깅 프로세스를 ConsoleApplication3.exe로 변경합니다.

||1:lkd> .process fffffa800425e940
Implicit process is now fffffa80'0425e940

"!process 0 0"의 결과에서 출력된 ObjectTable을 주소를 통해 _HANDLE_TABLE을 덤프하고,

||1:lkd> dt _HANDLE_TABLE fffff8a00571a580
nt!_HANDLE_TABLE
   +0x000 NextHandleNeedingPool : 0x400
   +0x004 ExtraInfoPages   : 0n0
   +0x008 TableCode        : 0xfffff8a0`05884000
   +0x010 QuotaProcess     : 0xfffffa80`0425e940 _EPROCESS
   +0x018 HandleTableList  : _LIST_ENTRY [ 0xfffff8a0`05397f18 - 0xfffff8a0`03ef3758 ]
   +0x028 UniqueProcessId  : 0x888
   +0x02c Flags            : 8
   +0x02c StrictFIFO       : 0y0
   +0x02c EnableHandleExceptions : 0y0
   +0x02c Rundown          : 0y0
   +0x02c Duplicated       : 0y1
   +0x030 HandleContentionEvent : _EX_PUSH_LOCK
   +0x038 HandleTableLock  : _EX_PUSH_LOCK
   +0x040 FreeLists        : [1] _HANDLE_TABLE_FREE_LIST
   +0x040 ActualEntry      : [32]  ""
   +0x060 DebugInfo        : (null) 

TableCode 속성 값이 핸들 테이블 주소이므로 이를 덤프해 봅니다.

||1:lkd> dq 0xfffff8a0`05884000
fffff8a0`05884000  00000000`00000000 00000000`00000000
fffff8a0`05884010  d400212c`2407fff9 0000001f`0012019f
fffff8a0`05884020  c50003b0`1207ffd9 00000003`00000003
fffff8a0`05884030  d400210d`aa87fff7 0000001f`00100020
fffff8a0`05884040  d40013fc`f787ffe9 0000001f`0012019f
fffff8a0`05884050  c5002ba8`c887fff7 00000026`00020019
fffff8a0`05884060  d4001326`4a07fff5 00000027`001f0001
fffff8a0`05884070  d400211e`1707fffb 0000000e`001f0001
... [생략] ...
fffff8a0`058848c0  d40013fc`6ea7ffef 0000001f`0016019f
fffff8a0`058848d0  00000000`00000000 fffff8a0`05884930
fffff8a0`058848e0  d4002136`ae87fff9 00000007`001fffff
fffff8a0`058848f0  00000000`00000000 fffff8a0`05884940
fffff8a0`05884900  00000000`00000000 fffff8a0`058848f0
fffff8a0`05884910  c5002b9d`a807fff9 00000026`00000008
fffff8a0`05884920  c5002942`4c07fff9 00000026`00000008
fffff8a0`05884930  00000000`00000000 00000000`00000000

비교를 위해 pid == 2184(0x888)에 포함된 핸들을 나열해 볼까요?

||1:lkd> !handle 0 f 888

Searching for Process with Cid == 888
PROCESS fffffa800425e940
    SessionId: 2  Cid: 0888    Peb: 7f5ffeed000  ParentCid: 03e4
    DirBase: 5b7eb000  ObjectTable: fffff8a00571a580  HandleCount: <Data Not Accessible>
    Image: ConsoleApplication3.exe

Handle table at fffff8a005884000 with 0 entries in use

0004: Object: 1a800425878  GrantedAccess: 0012019f (Locked) Entry: fffff8a005884010
     (object paged out)

0008: Object: 18a00076050  GrantedAccess: 00000003 (Locked) (Audit) Entry: fffff8a005884020
     (object paged out)

... [생략] ...

0230: Object: 1a80027f908  GrantedAccess: 0016019f (Audit) Entry: fffff8a0058848c0
     (object paged out)

... [생략] ...

보시는 바와 같이 dq 결과값의 한 줄은 !handle 0 f 888 출력 하나와 매핑되는 것을 볼 수 있습니다.

fffff8a0`05884010  d400212c`2407fff9 0000001f`0012019f

0004: Object: 1a800425878  GrantedAccess: 0012019f (Locked) Entry: fffff8a005884010
     (object paged out)


fffff8a0`058848c0  d40013fc`6ea7ffef 0000001f`0016019f

0230: Object: 1a80027f908  GrantedAccess: 0016019f (Audit) Entry: fffff8a0058848c0
     (object paged out)

문제는 출력 결과에 ObjectHeader 값이 아닌, Object 값이 나온다는 점입니다. 게다가 그나마 출력되는 Object의 값이 64비트 주소가 아닌 1a800425878 같은 식별자에 해당하는데요. 이 정보만으로는 어떻게 ObjectHeader를 접근해야 하는지 알 수가 없습니다. (2020-01-03 업데이트: Object Header는 _OBJECT_HEADER 커널 구조체의 크기가 0x30이므로 "Object Address"로부터 "- 0x30" 연산을 하면 구할 수 있습니다.)

윈도우 7에서 수행했던 지난번 실습(Windbg - 윈도우 핸들 테이블: https://www.sysnet.pe.kr/2/0/935)에서는 "dq [TableCode]"로 출력된 덤프를 통해 _OBJECT_HEADER를 구할 수 있었지만, 윈도우 8에서는 해당 주솟값으로 알 수 없었습니다.

||1:lkd> dq 0xfffff8a0`05884000
fffff8a0`05884000  00000000`00000000 00000000`00000000
fffff8a0`05884010  d400212c`2407fff9 0000001f`0012019f
fffff8a0`05884020  c50003b0`1207ffd9 00000003`00000003
fffff8a0`05884030  d400210d`aa87fff7 0000001f`00100020
fffff8a0`05884040  d40013fc`f787ffe9 0000001f`0012019f
fffff8a0`05884050  c5002ba8`c887fff7 00000026`00020019
fffff8a0`05884060  d4001326`4a07fff5 00000027`001f0001
fffff8a0`05884070  d400211e`1707fffb 0000000e`001f0001

||1:lkd> dt _OBJECT_HEADER (d400212c`2407fff9 - 1)
nt!_OBJECT_HEADER
   +0x000 PointerCount     : ??
   +0x008 HandleCount      : ??
   +0x008 NextToFree       : ???? 
   +0x010 Lock             : _EX_PUSH_LOCK
   +0x018 TypeIndex        : ??
   +0x019 TraceFlags       : ??
   +0x019 DbgRefTrace      : ??
   +0x019 DbgTracePermanent : ??
   +0x01a InfoMask         : ??
   +0x01b Flags            : ??
   +0x01c Spare            : ??
   +0x020 ObjectCreateInfo : ???? 
   +0x020 QuotaBlockCharged : ???? 
   +0x028 SecurityDescriptor : ???? 
   +0x030 Body             : _QUAD
Memory read error d400212c`24080024

원인은 저도 모르겠습니다. ^^; 혹시 windbg를 통해 TableCode 덤프에서 _OBJECT_HEADER를 구할 수 있는 방법을 아시는 분은 덧글 부탁드립니다.




windbg에서 _OBJECT_HEADER 주소를 알 수는 없었지만, Process Explorer의 핸들 목록을 보면 "Object Address"라는 필드로 핸들 주소가 제공됩니다. 예제의 경우 0x230 소켓 핸들에 대한 "Object Address" 주솟값은 fffffa80027f8e00로 확인이 되었습니다. 이 값으로 windbg에서 !object 명령을 내려 보면 다음과 같은 출력 결과를 얻을 수 있습니다.

||1:lkd> !object fffffa80027f8e00
Object: fffffa80027f8e00  Type: (fffffa80018abf20) File
    ObjectHeader: fffffa80027f8dd0 (new version)
    HandleCount: 2  PointerCount: 524280
    Directory Object: 00000000  Name: \Endpoint {Afd}

출력값을 통해서 이제서야 _OBJECT_HEADER를 조사할 수 있게 되었습니다.

||1:lkd> dt nt!_OBJECT_HEADER fffffa80027f8dd0
   +0x000 PointerCount     : 0n524280
   +0x008 HandleCount      : 0n2
   +0x008 NextToFree       : 0x00000000`00000002 Void
   +0x010 Lock             : _EX_PUSH_LOCK
   +0x018 TypeIndex        : 0x1f ''
   +0x019 TraceFlags       : 0 ''
   +0x019 DbgRefTrace      : 0y0
   +0x019 DbgTracePermanent : 0y0
   +0x01a InfoMask         : 0xc ''
   +0x01b Flags            : 0 ''
   +0x01c Spare            : 0x5c003a
   +0x020 ObjectCreateInfo : 0xfffffa80`037698c0 _OBJECT_CREATE_INFORMATION
   +0x020 QuotaBlockCharged : 0xfffffa80`037698c0 Void
   +0x028 SecurityDescriptor : (null) 
   +0x030 Body             : _QUAD

아래의 글을 읽어 보면,

ObCreateObjectType & ObjectType
; http://ezbeat.tistory.com/421

Windows 7부터 _OBJECT_HEADER 구조체에 OBJECT_TYPE 멤버가 없다고 해서 OBJECT_TYPE_INITIALIZER 추적을 멈추고 있는데요. "Windbg - 윈도우 핸들 테이블" 글에 보면 프로세스의 모든 핸들을 나열하는 "!handle 0 2 [pid]" 명령을 통해 출력되는 결과에서 Type 필드를 통해 _OBJECT_TYPE_INITIALIZER까지 추적할 수 있습니다. 하지만, 이번에 제가 실습한 윈도우 8 x64의 경우에는 "!handle 0 f 888" 명령어를 수행한 결과에서 Type 필드마저도 보이지 않았습니다.

그래서 다른 방법을 찾아야 했는데, 마침 이에 대해 상세하게 설명한 글을 발견할 수 있었습니다.

Windows 7 Object Headers
; http://www.codemachine.com/article_objectheader.html

즉, Type 정보가 _OBJECT_HEADER의 TypeIndex 필드로 대체되었고 이 값을 통해 ObTypeIndexTable 커널 변수가 가리키고 있는 타입 정보 목록에서 _OBJECT_TYPE 정보를 구할 수가 있습니다.

따라서, "dt nt!_OBJECT_HEADER fffffa80027f8dd0"를 통해 덤프한 결과의 TypeIndex가 0x1f이므로 그와 관련된 타입 정보는 다음의 명령어로 찾아낼 수 있습니다.

||1:lkd> dt nt!_OBJECT_TYPE poi(nt!ObTypeIndexTable + (1f * @$ptrsize ))
   +0x000 TypeList         : _LIST_ENTRY [ 0xfffffa80`018abf20 - 0xfffffa80`018abf20 ]
   +0x010 Name             : _UNICODE_STRING "File"
   +0x020 DefaultObject    : 0x00000000`0000009b Void
   +0x028 Index            : 0x1f ''
   +0x02c TotalNumberOfObjects : 0x1761
   +0x030 TotalNumberOfHandles : 0x5f6
   +0x034 HighWaterNumberOfObjects : 0x17a3
   +0x038 HighWaterNumberOfHandles : 0x634
   +0x040 TypeInfo         : _OBJECT_TYPE_INITIALIZER
   +0x0b8 TypeLock         : _EX_PUSH_LOCK
   +0x0c0 Key              : 0x656c6946
   +0x0c8 CallbackList     : _LIST_ENTRY [ 0xfffffa80`018abfe8 - 0xfffffa80`018abfe8 ]

따라서 _OBJECT_TYPE_INITIALIZER를 확인할 수 있게 되었습니다.

||1:lkd> dt !_OBJECT_TYPE_INITIALIZER (poi(nt!ObTypeIndexTable + (1f * @$ptrsize )) + 0x40)
nt!_OBJECT_TYPE_INITIALIZER
   +0x000 Length           : 0x78
   +0x002 ObjectTypeFlags  : 0x11 ''
   +0x002 CaseInsensitive  : 0y1
   +0x002 UnnamedObjectsOnly : 0y0
   +0x002 UseDefaultObject : 0y0
   +0x002 SecurityRequired : 0y0
   +0x002 MaintainHandleCount : 0y1
   +0x002 MaintainTypeList : 0y0
   +0x002 SupportsObjectCallbacks : 0y0
   +0x002 CacheAligned     : 0y0
   +0x004 ObjectTypeCode   : 1
   +0x008 InvalidAttributes : 0x130
   +0x00c GenericMapping   : _GENERIC_MAPPING
   +0x01c ValidAccessMask  : 0x1f01ff
   +0x020 RetainAccess     : 0
   +0x024 PoolType         : 200 ( NonPagedPoolNx )
   +0x028 DefaultPagedPoolCharge : 0x400
   +0x02c DefaultNonPagedPoolCharge : 0x180
   +0x030 DumpProcedure    : (null) 
   +0x038 OpenProcedure    : (null) 
   +0x040 CloseProcedure   : 0xfffff800`9fc438c0     void  nt!IopCloseFile+0
   +0x048 DeleteProcedure  : 0xfffff800`9fc3a200     void  nt!IopDeleteFile+0
   +0x050 ParseProcedure   : 0xfffff800`9fc8f380     long  nt!IopParseFile+0
   +0x058 SecurityProcedure : 0xfffff800`9fc831b8     long  nt!IopGetSetSecurityObject+0
   +0x060 QueryNameProcedure : 0xfffff800`9fc6f14c     long  nt!IopQueryName+0
   +0x068 OkayToCloseProcedure : (null) 
   +0x070 WaitObjectFlagMask : 0x10000000
   +0x074 WaitObjectFlagOffset : 0x50
   +0x076 WaitObjectPointerOffset : 0x20

다시 _OBJECT_TYPE으로 돌아가 Type == File이기 때문에 _OBJECT_HEADER의 _QUAD Body는 _FILE_OBJECT 형식을 따르므로 보다 상세한 정보를 다음과 같이 구할 수 있습니다.

||1:lkd> dt !_FILE_OBJECT (fffffa80027f8dd0 + 0x30)
ntdll!_FILE_OBJECT
   +0x000 Type             : 0n5
   +0x002 Size             : 0n216
   +0x008 DeviceObject     : 0xfffffa80`02c7da20 _DEVICE_OBJECT
   +0x010 Vpb              : (null) 
   +0x018 FsContext        : 0xfffffa80`0263e370 Void
   +0x020 FsContext2       : (null) 
   +0x028 SectionObjectPointer : (null) 
   +0x030 PrivateCacheMap  : 0xffffffff`ffffffff Void
   +0x038 FinalStatus      : 0n0
   +0x040 RelatedFileObject : (null) 
   +0x048 LockOperation    : 0 ''
   +0x049 DeletePending    : 0 ''
   +0x04a ReadAccess       : 0 ''
   +0x04b WriteAccess      : 0 ''
   +0x04c DeleteAccess     : 0 ''
   +0x04d SharedRead       : 0 ''
   +0x04e SharedWrite      : 0 ''
   +0x04f SharedDelete     : 0 ''
   +0x050 Flags            : 0x40000
   +0x058 FileName         : _UNICODE_STRING "\Endpoint"
   +0x068 CurrentByteOffset : _LARGE_INTEGER 0x0
   +0x070 Waiters          : 0
   +0x074 Busy             : 0
   +0x078 LastLock         : (null) 
   +0x080 Lock             : _KEVENT
   +0x098 Event            : _KEVENT
   +0x0b0 CompletionContext : (null) 
   +0x0b8 IrpListLock      : 0
   +0x0c0 IrpList          : _LIST_ENTRY [ 0xfffffa80`027f8ec0 - 0xfffffa80`027f8ec0 ]
   +0x0d0 FileObjectExtension : (null) 




이하 나머지는 실습 삼아서 좀 더 해본 것입니다.

ObTypeIndexTable 커널 변수에 대한 덤프를 ^^ 할 일 없이 떠봤습니다.

||1:lkd> dq nt!ObTypeIndexTable
fffff800`76516d80  00000000`00000000 00000000`bad0b0b0
fffff800`76516d90  fffffa80`01904390 fffffa80`019014d0
fffff800`76516da0  fffffa80`019203d0 fffffa80`01903080
fffff800`76516db0  fffffa80`0190ab40 fffffa80`01920da0
fffff800`76516dc0  fffffa80`0191fea0 fffffa80`0191d480
fffff800`76516dd0  fffffa80`018edf20 fffffa80`0186c990
fffff800`76516de0  fffffa80`018b0800 fffffa80`0190e080
fffff800`76516df0  fffffa80`0186c830 fffffa80`01916a10

그리고, Process Explorer에 나타난 소켓의 Name == "\Device\Afd"을 기준으로 !object 출력을 살펴봤는데요.

||1:lkd> !object \Device\Afd
Object: fffffa8002c7da20  Type: (fffffa80018f6080) Device
    ObjectHeader: fffffa8002c7d9f0 (new version)
    HandleCount: 0  PointerCount: 3
    Directory Object: fffff8a000011670  Name: Afd

||1:lkd> !object fffffa8002c7da20
Object: fffffa8002c7da20  Type: (fffffa80018f6080) Device
    ObjectHeader: fffffa8002c7d9f0 (new version)
    HandleCount: 0  PointerCount: 3
    Directory Object: fffff8a000011670  Name: Afd

원래의 0x230 소켓 핸들은 Type이 File이었지만 위의 결과에서는 Device로 나옵니다. 즉, 다른 결과라는 이야기인데 양쪽이 어떻게 매칭이 되는지는 현재로써는 잘 모르겠습니다.

검색하다가 다음의 글을 보게 되었는데,

WinDbg 명령] !object
; http://greemate.tistory.com/entry/WinDbg-%EB%AA%85%EB%A0%B9-object

아래는 그와 관련해서 실습해 본 것입니다.

||1:lkd> !object \
Object: fffff8a0000092e0  Type: (fffffa80018f05b0) Directory
    ObjectHeader: fffff8a0000092b0 (new version)
    HandleCount: 0  PointerCount: 50
    Directory Object: 00000000  Name: \

    Hash Address          Type          Name
    ---- -------          ----          ----
     01  fffffa8002cc3810 Mutant        PendingRenameMutex
         fffff8a00000c060 Directory     ObjectTypes
     03  fffffa8003949c40 Event         NETLOGON_SERVICE_STARTED
         fffffa800254b820 FilterConnectionPort MicrosoftMalwareProtectionRemoteIoPortWD
     05  fffff8a000012a90 SymbolicLink  SystemRoot
     06  fffff8a000640080 Directory     Sessions
         fffffa800254c820 FilterConnectionPort MicrosoftMalwareProtectionVeryLowIoPortWD
     08  fffff8a0000161a0 Directory     ArcName
     09  fffff8a0000865f0 Directory     NLS
     10  fffffa800387d3b0 Event         LanmanServerAnnounceEvent
         fffffa8002ad6560 ALPC Port     ThemeApiPort
         fffffa8002bc7520 Device        UdfsCdRom
         fffff8a00060bb90 Directory     Windows
         fffff8a00000c840 Directory     GLOBAL??
     11  fffff8a000671eb0 Directory     RPC Control
         fffffa8001da0e40 ALPC Port     PdcPort
     13  fffffa8002ef95e0 Event         EFSInitEvent
     14  fffff8a000134650 SymbolicLink  Dfs
         fffffa8002551060 Device        clfs
     15  fffffa8002e2bc60 Event         DSYSDBG.Debug.Trace.Memory.284
         fffffa80033f1c00 Event         CsrSbSyncEvent
         fffffa8002cd72e0 ALPC Port     SeRmCommandPort
     16  fffff8a00000ce10 SymbolicLink  DosDevices
     17  fffff8a00e333670 Directory     KnownDlls32
     18  fffff8a0000107a0 Key           \REGISTRY
     19  fffff8a00124bc90 Directory     BaseNamedObjects
     20  fffffa8001900070 ALPC Port     PowerPort
     21  fffffa80019c4db0 ALPC Port     SmSsWinStationApiPort
         fffffa8002fe6fe0 Event         UniqueInteractiveSessionIdEvent
         fffff8a00005cd00 Directory     UMDFCommunicationPorts
     22  fffff8a00075dd10 Directory     KnownDlls
         fffffa8001915070 ALPC Port     PowerMonitorPort
     23  fffffa80025556b0 Device        Ntfs
         fffff8a00005c630 Directory     FileSystem
         fffff8a000009a30 Directory     KernelObjects
     24  fffffa800251f820 FilterConnectionPort MicrosoftMalwareProtectionControlPortWD
     26  fffffa8002ebb9b0 ALPC Port     SeLsaCommandPort
         fffff8a00000d820 Directory     Callback
     28  fffff8a00000eeb0 Directory     Security
     29  fffffa8002bc9520 Device        UdfsDisk
     30  fffffa800254a820 FilterConnectionPort MicrosoftMalwareProtectionAsyncPortWD
         fffff8a0000105a0 Directory     Device
     34  fffff8a0005aa420 Section       LsaPerformance
         fffffa80037341a0 Event         UniqueSessionIdEvent
         fffffa8002cc38e0 ALPC Port     SmApiPort
     35  fffffa800254e820 FilterConnectionPort MicrosoftMalwareProtectionPortWD
     36  fffffa8002e96fe0 Event         SAM_SERVICE_STARTED
         fffff8a00005c7e0 Directory     Driver

위의 결과에서 Type == Directory로 나온 항목은 다음과 같이 열람하는 것을 반복할 수 있다고 합니다. ^^

||1:lkd> !object \ObjectTypes
Object: fffff8a00000c060  Type: (fffffa80018f05b0) Directory
    ObjectHeader: fffff8a00000c030 (new version)
    HandleCount: 0  PointerCount: 49
    Directory Object: fffff8a0000092e0  Name: ObjectTypes

    Hash Address          Type          Name
    ---- -------          ----          ----
     00  fffffa80018b6f20 Type          TmTm
     01  fffffa8001892080 Type          Desktop
         fffffa80018fbf20 Type          Process
     03  fffffa80018d7f20 Type          DebugObject
     04  fffffa8001881da0 Type          TpWorkerFactory
     05  fffffa8001919080 Type          Adapter
         fffffa80018ef5c0 Type          Token
     06  fffffa8002be8600 Type          DxgkSharedResource
     08  fffffa80018f8f20 Type          EventPair
     09  fffffa80025c6580 Type          PcwObject
         fffffa80018edcf0 Type          WmiGuid
     11  fffffa80018ab600 Type          EtwRegistration
     12  fffffa80018a1670 Type          Session
         fffffa800191dea0 Type          Timer
     13  fffffa800189bf20 Type          Mutant
     14  fffffa8001896f20 Type          IRTimer
     16  fffffa800190f080 Type          IoCompletion
     17  fffffa8002be0600 Type          DxgkSharedSyncObject
         fffffa80018e4670 Type          WindowStation
         fffffa80018b7f20 Type          Profile
     18  fffffa800191d500 Type          File
     21  fffffa8001908740 Type          Semaphore
     23  fffffa80018ef110 Type          EtwConsumer
         fffffa8001903480 Type          CompositionSurface
     25  fffffa8001916bb0 Type          TmTx
         fffffa8001901550 Type          SymbolicLink
     26  fffffa800252f510 Type          FilterConnectionPort
         fffffa8001903750 Type          Key
         fffffa80018b5080 Type          KeyedEvent
         fffffa80018b5550 Type          Callback
     27  fffffa8001915840 Type          WaitCompletionPacket
     28  fffffa80018a6080 Type          UserApcReserve
         fffffa8001919e00 Type          Job
     29  fffffa8001919490 Type          Controller
         fffffa80018b29c0 Type          IoCompletionReserve
     30  fffffa80018ecf20 Type          Device
         fffffa80018f05b0 Type          Directory
     31  fffffa80018efaa0 Type          Section
         fffffa8001913f20 Type          TmEn
         fffffa800191dc50 Type          Thread
     32  fffffa800189f080 Type          Type
     33  fffffa8002543d00 Type          FilterCommunicationPort
         fffffa80018b25d0 Type          PowerRequest
     35  fffffa80019099c0 Type          TmRm
         fffffa8001910490 Type          Event
     36  fffffa80018829e0 Type          ALPC Port
         fffffa80018f5f20 Type          Driver

끝~~~~!




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13605정성태4/23/2024203닷넷: 2246. C# - Python.NET을 이용한 파이썬 소스코드 연동파일 다운로드1
13604정성태4/22/2024226오류 유형: 901. Visual Studio - Unable to set the next statement. Set next statement cannot be used in '[Exception]' call stack frames.
13603정성태4/21/2024308닷넷: 2245. C# - IronPython을 이용한 파이썬 소스코드 연동파일 다운로드1
13602정성태4/20/2024659닷넷: 2244. C# - PCM 오디오 데이터를 연속(Streaming) 재생 (Windows Multimedia)파일 다운로드1
13601정성태4/19/2024750닷넷: 2243. C# - PCM 사운드 재생(NAudio)파일 다운로드1
13600정성태4/18/2024760닷넷: 2242. C# - 관리 스레드와 비관리 스레드
13599정성태4/17/2024807닷넷: 2241. C# - WAV 파일의 PCM 사운드 재생(Windows Multimedia)파일 다운로드1
13598정성태4/16/2024835닷넷: 2240. C# - WAV 파일 포맷 + LIST 헤더파일 다운로드2
13597정성태4/15/2024802닷넷: 2239. C# - WAV 파일의 PCM 데이터 생성 및 출력파일 다운로드1
13596정성태4/14/20241037닷넷: 2238. C# - WAV 기본 파일 포맷파일 다운로드1
13595정성태4/13/20241047닷넷: 2237. C# - Audio 장치 열기 (Windows Multimedia, NAudio)파일 다운로드1
13594정성태4/12/20241064닷넷: 2236. C# - Audio 장치 열람 (Windows Multimedia, NAudio)파일 다운로드1
13593정성태4/8/20241074닷넷: 2235. MSBuild - AccelerateBuildsInVisualStudio 옵션
13592정성태4/2/20241215C/C++: 165. CLion으로 만든 Rust Win32 DLL을 C#과 연동
13591정성태4/2/20241187닷넷: 2234. C# - WPF 응용 프로그램에 Blazor App 통합파일 다운로드1
13590정성태3/31/20241078Linux: 70. Python - uwsgi 응용 프로그램이 k8s 환경에서 OOM 발생하는 문제
13589정성태3/29/20241150닷넷: 2233. C# - 프로세스 CPU 사용량을 나타내는 성능 카운터와 Win32 API파일 다운로드1
13588정성태3/28/20241247닷넷: 2232. C# - Unity + 닷넷 App(WinForms/WPF) 간의 Named Pipe 통신 [2]파일 다운로드1
13587정성태3/27/20241168오류 유형: 900. Windows Update 오류 - 8024402C, 80070643
13586정성태3/27/20241320Windows: 263. Windows - 복구 파티션(Recovery Partition) 용량을 늘리는 방법
13585정성태3/26/20241105Windows: 262. PerformanceCounter의 InstanceName에 pid를 추가한 "Process V2"
13584정성태3/26/20241058개발 환경 구성: 708. Unity3D - C# Windows Forms / WPF Application에 통합하는 방법파일 다운로드1
13583정성태3/25/20241175Windows: 261. CPU Utilization이 100% 넘는 경우를 성능 카운터로 확인하는 방법
13582정성태3/19/20241433Windows: 260. CPU 사용률을 나타내는 2가지 수치 - 사용량(Usage)과 활용률(Utilization)파일 다운로드1
13581정성태3/18/20241606개발 환경 구성: 707. 빌드한 Unity3D 프로그램을 C++ Windows Application에 통합하는 방법
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...