ClientPID 是调用客户端的进程 ID。
它指向一个 DWORD 吗?
没有
是进程句柄吗?
没有
我可以使用 GetProcessId API 获取 PID 吗?
没有。这是 pid 值本身。您可以进行类型转换以用于OpenProcess 调用 - (ULONG)(ULONG_PTR)RpcCallAttributes.ClientPID
谁关闭句柄或删除分配给 DWORD 的内存?
它不能被关闭(这个句柄永远不需要被关闭)或释放(这不是一个指针)
进程和线程 id - 实际上是特殊句柄表 (PspCidTable.) 中的句柄,它本机表示为句柄。本机 (ntdll) api 和内核模式 api 始终使用进程和线程 ID 作为句柄。寻找CLIENT_ID
typedef struct _CLIENT_ID {
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID;
这个活动在不同的原生api中使用,例如ZwOpenProcess
所有内核模式 api 都使用它作为句柄,例如 - PsLookupProcessByProcessId
简单的win32层将HANDLE UniqueProcess;截断为DWORD UniqueProcess
因此,如果您想在 win32 调用 OpenProcess 中使用 RPC_CALL_ATTRIBUTES_V2 结构中的 ClientPID - 您只需将其转换为 DWORD。例如:
RPC_CALL_ATTRIBUTES_V2_W RpcCallAttributes = {
RPC_CALL_ATTRIBUTES_VERSION, RPC_QUERY_CLIENT_PID
};
if (RPC_S_OK == RpcServerInqCallAttributes(0, &RpcCallAttributes))
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE,
(ULONG)(ULONG_PTR)RpcCallAttributes.ClientPID);
}
如果使用原生 api - 不需要类型转换。例如
RPC_CALL_ATTRIBUTES_V2_W RpcCallAttributes = {
RPC_CALL_ATTRIBUTES_VERSION, RPC_QUERY_CLIENT_PID
};
if (RPC_S_OK == RpcServerInqCallAttributes(0, &RpcCallAttributes))
{
HANDLE hProcess;
static OBJECT_ATTRIBUTES zoa = { sizeof(zoa) };
CLIENT_ID cid = { RpcCallAttributes.ClientPID };
ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &zoa, &cid );
}