3

我使用“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 32bit下运行良好,但是在Win7 64bit下只能得到小于65535的正确pid。这个结构中processId的类型是ULONG,我认为它可以得到大于65535的。它有什么问题?有没有其他 API 代替?

4

2 回答 2

3

有两个枚举值用于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-s...

有关更多信息,请参见 ProcessExplorer 项目的源文件 ntexapi.h。
另请注意,SYSTEM_HANDLE_INFORMATION_EX我的结构定义中的字段宽度可能与他们的不同(即,在我的定义中,某些字段宽度因位数而异),但我认为我在 32 位和 64 位下测试了代码,并且发现它是正确的。
如有必要,请重新检查,如果您有其他信息,请告诉我们。

于 2014-05-30T21:16:08.157 回答
0

来自 Raymond Chen 的文章Processes、commit、RAM、threads,你能走多高?

后来我了解到,Windows NT 的人确实试图防止进程 ID 的数值变得太大。本世纪初,内核团队尝试让数字变得非常大,以降低进程 ID 被重用的速度,但他们不得不回到小数字,不是出于任何技术原因,而是因为人们抱怨说大型进程 ID 在任务管理器中看起来很难看。(一位客户甚至问他的电脑是否有问题。)

于 2014-05-30T09:33:13.080 回答