Debugging Tools for Windows

!lpc

!lpc扩展显示目标系统中的本地过程调用(local procedure call (LPC))端口和信息。

语法

Windows 2000的语法

!lpc message MessageID 
!lpc port Port 
!lpc scan Port 
!lpc thread Thread 
!lpc 

Windows Server 2003和Windows XP的语法

!lpc message MessageID 
!lpc port Port 
!lpc scan Port 
!lpc thread Thread 
!lpc PoolSearch 
!lpc 

参数

message
(仅Windows Server 2003、Windows XP、和Windows 2000)如果有的话,显示某条消息的信息,例如队列中包含该消息的服务器端口(server port)、等待该消息的线程。
MessageID
(仅Windows Server 2003、Windows XP、和Windows 2000)指定要显示的消息的消息ID。如果该参数的值为0或者省略,!lpc message命令显示消息的摘要列表。(在Windows 2000 Service Pack 1 (SP1)中,摘要包括LPC zone 的所有消息。在Windows 2000 Service Pack 2 (SP2)、 Windows XP和之后版本的Windows中,摘要包括系统池中的所有消息。已经被页换出的消息不会包含。)
port
(仅Windows Server 2003、Windows XP、和Windows 2000)显示端口信息,如端口的名字、信号量状态、队列中的消息、裁剪队列(rundown queue)中的线程、句柄数量、引用、以及相关的端口。
scan
(仅Windows Server 2003、Windows XP、和Windows 2000)显示指定端口以及连接到它的所有端口的摘要信息。
Port
(仅Windows Server 2003、Windows XP、和Windows 2000)指定要显示的端口的16进制地址。如果使用!lpc port命令,并且Port为0或省略,则显示所由LPC端口的摘要列表。如果使用!lpc scan命令,Port必须指定一个实际的端口地址。
thread
(仅Windows Server 2003、Windows XP、和Windows 2000)显示在rundown port queue中包含指定线程的所有端口的信息。
Thread
(仅Windows Server 2003、Windows XP、和Windows 2000)指定线程的16进制地址。如果为0或者省略,!lpc thread命令显示所有正在进行LPC操作的线程的摘要列表。
PoolSearch
(仅Windows Server 2003、Windows XP、和Windows 2000)指定!lpc message命令是否在内核池(kernel pool)中搜索消息。每次使用!lpc PoolSearch时,该设置会在打开和关闭之间切换(初始设置是不搜索内核池)。它仅作用于MessageID指定为非0值的!lpc message命令。

DLL

Windows 2000 Kdextx86.dll
Windows XP
Windows Server 2003
Kdexts.dll

注释

该扩展在Windows Vista和之后版本的Windows中不支持。

在Windows Server 2003、Windows XP和Windows 2000中,不带参数使用!lpc会在调试器命令窗口中显示该扩展命令的帮助文本。

如果有某个线程被标记为在等待某条消息返回,可以使用!lpc message命令和这条延迟的消息的ID。命令会显示该消息、包含它的端口、以及所有被延迟的线程。

如果找不到消息,并且没有读取错误(例如"Unable to access zone segment"),则服务器已经接收到了这条消息。

这种情况下,服务器端口一般可以通过!lpc thread命令找到。等待响应的线程连接到服务器通信队列(server communication queue)上。这条命令可以显示所有包含指定线程的端口。知道了端口地址之后,可以使用!lpc port命令。通过使用!lpc thread命令和线程地址,可以获得关于每条线程的更多信息。

下面是扩展命令在Windows XP系统上的输出示例:

这个例子中,显示了所有LPC端口。

kd> !lpc port
Scanning 225 objects
       1  Port: 0xe1405650 Connection: 0xe1405650  Communication: 0x00000000  'SeRmCommandPort' 
       1  Port: 0xe141ef50 Connection: 0xe141ef50  Communication: 0x00000000  'SmApiPort' 
       1  Port: 0xe13c5740 Connection: 0xe13c5740  Communication: 0x00000000  'ApiPort' 
       1  Port: 0xe13d9550 Connection: 0xe13d9550  Communication: 0x00000000  'SbApiPort' 
       3  Port: 0xe13d8830 Connection: 0xe141ef50  Communication: 0xe13d8910  '' 
80000004  Port: 0xe13d8910 Connection: 0xe141ef50  Communication: 0xe13d8830  '' 
       3  Port: 0xe13d8750 Connection: 0xe13d9550  Communication: 0xe13a4030  '' 
       .....

上面例子中,地址e14ae238处的端口没有消息,即所有消息都已经被接收并且没有新消息到达。

kd> !lpc port e14ae238

Server connection port e14ae238  Name: ApiPort
    Handles: 1   References: 107
    Server process  : 84aa0140 (csrss.exe)
    Queue semaphore : 84a96da8
    Semaphore state 0 (0x0)
    The message queue is empty
    The LpcDataInfoChainHead queue is empty

上面例子中,0xe14ae238处的端口有已排队但是还没有被服务器接收的消息。

kd> !lpc port 0xe14ae238

Server connection port e14ae238  Name: ApiPort
    Handles: 1   References: 108
    Server process  : 84aa0140 (csrss.exe)
    Queue semaphore : 84a96da8
    Semaphore state 0 (0x0)
        Messages in queue:
        0000 e20d9b80 - Busy  Id=0002249c  From: 0584.0680  Context=00000021  [e14ae248 . e14ae248]
                   Length=0098007c  Type=00000001 (LPC_REQUEST)
                   Data: 00000000 0002021e 00000584 00000680 002f0001 00000007
    The message queue contains 1 messages
    The LpcDataInfoChainHead queue is empty

剩下的这些Windows XP上的示例是关于可以在这条扩展命令中使用的其它选项的。

kd> !lpc message 222be
Searching message 222be in threads ...
Client thread 842a4db0 waiting a reply from 222be
Searching thread 842a4db0 in port rundown queues ...

Server communication port 0xe114a3c0
    Handles: 1   References: 1
    The LpcDataInfoChainHead queue is empty
        Connected port: 0xe1e7b948      Server connection port: 0xe14ae238

Client communication port 0xe1e7b948
    Handles: 1   References: 3
    The LpcDataInfoChainHead queue is empty

Server connection port e14ae238  Name: ApiPort
    Handles: 1   References: 107
    Server process  : 84aa0140 (csrss.exe)
    Queue semaphore : 84a96da8
    Semaphore state 0 (0x0)
    The message queue is empty
    The LpcDataInfoChainHead queue is empty
Done.

kd> !lpc thread 842a4db0
Searching thread 842a4db0 in port rundown queues ...

Server communication port 0xe114a3c0
    Handles: 1   References: 1
    The LpcDataInfoChainHead queue is empty
        Connected port: 0xe1e7b948      Server connection port: 0xe14ae238

Client communication port 0xe1e7b948
    Handles: 1   References: 3
    The LpcDataInfoChainHead queue is empty

Server connection port e14ae238  Name: ApiPort
    Handles: 1   References: 107
    Server process  : 84aa0140 (csrss.exe)
    Queue semaphore : 84a96da8
    Semaphore state 0 (0x0)
    The message queue is empty
    The LpcDataInfoChainHead queue is empty

kd> !lpc scan e13d8830
Scanning 225 objects
       3  Port: 0xe13d8830 Connection: 0xe141ef50  Communication: 0xe13d8910  '' 
80000004  Port: 0xe13d8910 Connection: 0xe141ef50  Communication: 0xe13d8830  '' 
Scanning 3 objects

附加信息

关于LPC的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon编写的Microsoft Windows Internals

Build machine: CAPEBUILD