RPC 状态信息的内部结构

本部分提供 RPC 运行时收集的状态信息的内部结构的详细信息。

所有 RPC 运行时状态信息都包含在单元格中。 单元格是可以单独查看和更新的最小信息单位。

RPC Run-Time 中的每个键对象都将维护一个或多个有关其状态的信息单元格。 每个单元格都有一个单元格 ID。 当对象引用另一个对象时,它通过指定该对象的单元格 ID 来执行此操作。 RPC Run-Time 可以维护信息的关键对象包括终结点、线程、连接对象、服务器调用(SCALL)对象和客户端调用(CCALL)对象。

RPC 服务器运行时,RPC Run-Time 使用一个或多个工作线程侦听一组终结点。 每当数据传输到服务器时,线程会选取数据并确定传入请求是什么。 如果请求是创建连接,则会创建 Connection 对象,然后此对象将服务对连接的所有调用。 当对连接进行 RPC 调用时,Connection 对象将实例化与客户端调用 (CCALL) 对象相对应的服务器调用 (SCALL) 对象。 然后,此服务器调用对象处理此特定调用。

RPC 客户端运行时,RPC Run-Time 每次调用时都会创建客户端调用对象。 此客户端调用对象包含有关此特定调用的信息。

端点单元

从 RPC 运行时的角度来看,终结点是一个入口点,可通过该入口点联系特定服务器。 终结点始终与给定的 RPC 传输相关联。 终结点状态信息用于将客户端调用与服务器上的特定进程相关联。

终端单元格中的字段包括:

ProtseqType
此终结点的协议序列。

Status
状态值:分配活动未激活。 大多数终结点处于活动状态。 当创建过程已启动但尚未完成时,终结点会被分配状态。 终结点如果不再使用(例如,已卸载协议),则为非活动

EndpointName
终结点名称的前 28 个字符。

线程单元格

服务器线程是工作线程(用于 RPC 的标准 Win32 线程)。

线程单元中的字段包括:

Status
状态值:处理已发出分配空闲处理 线程是位于 Run-Time 内,并正在处理信息。 已经调度的 线程 已经被调度(调用)到服务器提供的管理器例程(通常仅称为 服务器例程)。 已缓存分配的线程。 空闲线程可用于服务请求。

LastUpdateTime
距设备启动后的毫秒数,上次更新信息的时间。

TID
此线程的线程 ID。 尝试与调试器中的线程列表相关联时,这非常有用。

连接对象单元格

连接对象单元格中的字段包括:

标记
标志值包括 独占/非独占身份验证级别身份验证服务

LastTransmitFragmentSize
通过连接传输的最后一个片段的大小。

终结点
该连接取自的终结点的单元格 ID。

LastSendTime
上次通过连接发送数据的时间。

LastReceiveTime
上次通过连接接收数据的时间。

服务器调用对象单元格

服务器调用 (SCALL) 对象单元格中的字段包括:

Status
状态值:分配激活调度分配的调用处于非活动状态并缓存。 当呼叫正在进行时,RPC Run-Time 正在处理与该呼叫相关的信息。 当调用调度时,已调用管理器例程(服务器例程),并且尚未返回。

ProcNum
此调用的过程编号(操作编号,在 NetMon 捕获文件中)。 RPC Run-Time 通过按 IDL 文件中的位置对接口中的单个例程进行编号来标识各个例程。 接口中的第一个例程将被编号为零,第二个例程为一,依此类推。

InterfaceUUIDStart
接口 UUID 的第一个 DWORD。

ServicingTID
处理此调用的线程的单元格 ID。 如果调用未激活调度,则包含过时的信息。

CallFlags
这些标志值指示这是独占连接的缓存调用、这是异步调用、这是管道调用,以及这是 LRPC 还是 OSF 调用。

LastUpdateTime
上次更新调用对象状态信息的时间(从启动后,以毫秒为单位)。

PID
调用方的进程 ID。 仅适用于 LRPC 调用。

TID
调用者的线程 ID。 仅适用于 LRPC 调用。

客户端调用对象单元格

客户端调用 (CCALL) 对象分为两个单元格,因为有关客户端调用的信息太大,无法容纳在一个单元格中。 第一个单元格称为客户端呼叫信息,第二个单元格是呼叫目标信息。 大多数工具将一起显示信息,因此无需区分它们。

除非您收集完整的状态信息,否则不会保留关于客户调用的信息。 此规则有一个例外:即使仅收集服务器状态信息,也会保留有关服务器调用中客户端调用的信息。 这样您就可以跟踪跨越多个跃点的调用。

客户端呼叫信息单元格中的字段包括:

ProcNum
正在调用的方法的过程编号(操作编号,在 Netmon 捕获文件中)。 RPC Run-Time 通过按 IDL 文件中的位置对接口中的单个例程进行编号来标识各个例程。 接口中的第一个例程将是数字零,第二个例程将是数字一,以此类推。

ServicingThread
对此调用的线程的单元 ID。

IfStart
进行调用的接口 UUID 的第一个 DWORD。

终结点
调用到的服务器上的终结点的前 12 个字符。

“呼叫目标信息”单元格中的字段包括:

协议序列
此调用的协议序列。

LastUpdateTime
更新有关客户端调用或调用目标的信息的时间(以开机后经过的毫秒数为单位)。

TargetServer
调用到的服务器名称的前 24 个字符。