我枚举了一个进程的所有句柄。我有进程句柄,现在我想知道句柄所用进程的PID。这是我正在使用的结构:
public struct SYSTEM_HANDLE_INFORMATION
{
public int ProcessID;
public byte ObjectTypeNumber;
public byte Flags; // 0x01 = PROTECT_FROM_CLOSE, 0x02 = INHERIT
public ushort Handle;
public int Object_Pointer;
public UInt32 GrantedAccess;
}
我遗弃的所有句柄的ProcessID与我正在运行的程序(主机)的PID相同。 它应该是Object_Pointer,但我不知道如何使用它。现在Object_Pointer和GrantedAccess匹配句柄所针对的进程的对象地址 - picture
虽然很奇怪,因为GrantedAccess应该是进程的访问级别而不是地址的一部分。
答案 0 :(得分:1)
如果我们拥有PROCESS_QUERY_LIMITED_INFORMATION
或PROCESS_QUERY_INFORMATION
访问权限的流程句柄,我们可以通过GetProcessId
函数获取PID
您对SYSTEM_HANDLE_INFORMATION
的定义是错误的。显然Object_Pointer
必须是void*
(64位系统上的8个字节)时不能是int(4个字节)。这个结构的正确定义是
struct SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
USHORT UniqueProcessId;
USHORT CreatorBackTraceIndex;
UCHAR ObjectTypeIndex;
UCHAR HandleAttributes;
USHORT HandleValue;
PVOID Object;
ULONG GrantedAccess;
};
但更好的是使用SystemExtendedHandleInformation
代替SystemHandleInformation
并使用SYSTEM_HANDLE_INFORMATION_EX