Debugging Tools for Windows

!handle

!handle 扩展显示目标系统中一个或所有进程拥有的句柄的信息。

语法

用户模式

!handle [Handle [UMFlags [TypeName]]] 
!handle -? 

内核模式

!handle [Handle [KMFlags [Process [TypeName]]]] 

参数

Handle
指定要显示的句柄序号。如果Handle是-1或者省略,调试器显示当前进程关联的所有句柄的数据。如果Handle 是0,调试器显示所有句柄的数据。
UMFlags
(仅用户模式) 指定显示中应该包括的内容。该参数可以是任意的下面这些位值的和(默认值为1。)
Bit 0 (0x1)
显示句柄类型信息。
Bit 1 (0x2)
显示基本的句柄信息。
Bit 2 (0x4)
显示句柄名信息。
Bit 3 (0x8)
如果可能的话,显示对象相关的句柄信息。
KMFlags
(仅内核模式) 指定显示中应该包含的内容。该参数可以是任意的下面这些位值的和。(默认值是0x3。)
Bit 0 (0x1)
显示基本句柄信息。
Bit 1 (0x2)
显示对象的信息。
Bit 2 (0x4)
显示free handle条目。如果不设置这一位或者Handle省略或为0,则显示出来的句柄列表不包括free handle。如果Handle指定了单个free handle,则即使没有设置这一位也会显示出来。
Bit 4 (0x10)
(Windows XP 和之后) 显示内核句柄表中的句柄而不是当前进程的。
Bit 5 (0x20)
(Windows XP 和之后) 将句柄当作线程ID或进程ID,并且显示相应的内核对象的信息。
Process
(仅内核模式) 指定一个进程。可以使用进程ID或者进程对象的16进制地址。该参数必须指定目标系统中正在运行的进程。如果设置为-1或者省略,则使用当前进程。
TypeName
指定要确认的句柄类型。只有匹配该类型的句柄才会显示出来。TypeName 是区分大小写的。合法的类型有Event、Section、File、Port、Directory、SymbolLink、Mutant、WindowStation、Semaphore、Key、Token、Process 、Thread、Desktop、IoCompletion、Timer、Job和WaitablePort。
-?
(仅用户模式) 调试器命令窗口中显示该扩展的帮助文本。

DLL

Windows 2000 Kdextx86.dll
Uext.dll
Ntsdexts.dll
Windows XP和之后 Kdexts.dll
Uext.dll
Ntsdexts.dll

注释

可以在用户模式和内核模式活动调试时使用!handle 扩展。也可以在内核模式dump文件上使用它。但如果创建时没包含句柄信息,则不能在调试用户模式dump文件时使用。(可以通过.dump /mh (Create Dump File)命令来创建这种dump文件。)

用户模式活动调试时,可以使用.closehandle (Close Handle)命令关闭一个或多个句柄。

下面是用户模式下使用!handle 的示例。这条命令显示句柄列表。

0:000> !handle
Handle 4
  Type          Section
Handle 8
  Type          Event
Handle c
  Type          Event
Handle 10
  Type          Event
Handle 14
  Type          Directory
Handle 5c
  Type          File
6 Handles
Type            Count
Event           3
Section         1
File            1
Directory       1

下面的命令显示句柄0x8的详细信息。

0:000> !handle 8 f
Handle 8
  Type          Event
  Attributes    0
  GrantedAccess 0x100003:
         Synch
         QueryState,ModifyState
  HandleCount   2
  PointerCount  3
  Name          <none>
  Object Specific Information
    Event Type Auto Reset
    Event is Waiting

下面是内核模式下使用!handle的示例。这条命令列举所有句柄,包括free handle。

kd> !handle 0 4
processor number 0
PROCESS 80559800  SessionId: 0  Cid: 0000    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1000d60  TableSize: 380.
    Image: Idle

New version of handle table at e1002000 with 380 Entries in use

0000: free handle, Entry address e1002000, Next Entry fffffffe
0004: Object: 80ed5238  GrantedAccess: 001f0fff
0008: Object: 80ed46b8  GrantedAccess: 00000000
000c: Object: e1281d00  GrantedAccess: 000f003f
0010: Object: e1013658  GrantedAccess: 00000000
......
0168: Object: ffb6c748  GrantedAccess: 00000003 (Protected)
016c: Object: ff811f90  GrantedAccess: 0012008b
0170: free handle, Entry address e10022e0, Next Entry 00000458
0174: Object: 80dfd5c8  GrantedAccess: 001f01ff
......

下面的命令显示内核句柄表中的0x14句柄的详细信息。

kd> !handle 14 13
processor number 0
PROCESS 80559800  SessionId: 0  Cid: 0000    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1000d60  TableSize: 380.
    Image: Idle

Kernel New version of handle table at e1002000 with 380 Entries in use
0014: Object: e12751d0  GrantedAccess: 0002001f
Object: e12751d0  Type: (80ec8db8) Key
    ObjectHeader: e12751b8
        HandleCount: 1  PointerCount: 1
        Directory Object: 00000000  Name: \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\SESSION MANAGER\EXECUTIVE

附加信息

关于句柄的更多信息,查看!htrace扩展、Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

Build machine: CAPEBUILD