为什么不能通过&nbspQuerySystemInformation'获得超过65535的进程ID?在Win7 64bit?

时间:2014-05-30 09:17:43

标签: windows kernel ntdll

我使用'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?

2 个答案:

答案 0 :(得分: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位下,发现它是正确的。
如有必要,请重新检查,如果您有其他信息,请告知我们。

答案 1 :(得分:0)

来自Raymond Chen的文章Processes, commit, RAM, threads, and how high can you go?

  

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