我使用了“ntQuerySystemInformation”来获取所有句柄信息,例如:

NtQuerySystemInformation(SystemHandleInformation, pHandleInfor, ulSize,NULL);//SystemHandleInformation = 16

pHandleInfor的结构是:
typedef struct _SYSTEM_HANDLE_INFORMATION
{
  ULONG ProcessId;
  UCHAR ObjectTypeNumber;
    UCHAR Flags;
    USHORT Handle;
    PVOID Object;
    ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

它在xp 32位上运行良好,但在Win7 64位中只能获得小于65535的正确pid。此结构中的processId类型为ULONG,我认为它可以超过65535。这是什么问题?还有其他API吗?

最佳答案

NtQuerySystemInformation有两个枚举值来获取句柄信息:

    CNST_SYSTEM_HANDLE_INFORMATION = 16
    CNST_SYSTEM_EXTENDED_HANDLE_INFORMATION = 64

并相应地有两个结构:SYSTEM_HANDLE_INFORMATIONSYSTEM_HANDLE_INFORMATION_EX
这些结构的定义是:
    struct SYSTEM_HANDLE_INFORMATION
    {
        short UniqueProcessId;
        short CreatorBackTraceIndex;
        char ObjectTypeIndex;
        char HandleAttributes; // 0x01 = PROTECT_FROM_CLOSE, 0x02 = INHERIT
        short HandleValue;
        size_t Object;
        int GrantedAccess;
    }

    struct SYSTEM_HANDLE_INFORMATION_EX
    {
        size_t Object;
        size_t UniqueProcessId;
        size_t HandleValue;
        int GrantedAccess;
        short CreatorBackTraceIndex;
        short ObjectTypeIndex;
        int HandleAttributes;
        int Reserved;
    }

如您所见,第一个结构实际上只能包含16位进程ID。

有关更多信息,请参见例如ProcessExplorer项目的源文件ntexapi.h。
还要注意,我的结构定义中SYSTEM_HANDLE_INFORMATION_EX的字段宽度可能与它们的不同(也就是说,在我的定义中,某些字段宽度取决于位),但是我认为我在32位和64位下都对代码进行了测试并发现它是正确的。
如有必要,请重新检查,并让我们知道您是否还有其他信息。

关于windows - 在Win7 64bit中,为什么 'ntQuerySystemInformation'无法获得超过65535的进程ID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23951043/

10-11 15:23