C# - 获取PID或进程句柄的名称

时间:2017-11-06 13:21:51

标签: c# winapi handles memory-editing

我枚举了一个进程的所有句柄。我有进程句柄,现在我想知道句柄所用进程的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应该是进程的访问级别而不是地址的一部分。

1 个答案:

答案 0 :(得分:1)

如果我们拥有PROCESS_QUERY_LIMITED_INFORMATIONPROCESS_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