我使用'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的types是ULONG,我认为它可以得到超过65535.有什么问题呢? 还有其他的API吗?
NtQuerySystemInformation
有两个枚举值来获取句柄信息:
CNST_SYSTEM_HANDLE_INFORMATION = 16 CNST_SYSTEM_EXTENDED_HANDLE_INFORMATION = 64
并相应地有两个结构: SYSTEM_HANDLE_INFORMATION
和SYSTEM_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位并发现它是正确的。
如有需要请重新检查,如果您有其他信息,请告知我们。
从Raymond Chen的文章进程,提交,内存,线程,你可以走多高? :
后来我才知道Windows NT的人会尽量保持进程ID的数值变得太大。 本世纪初,内核团队尝试让数字变得非常庞大,以便降低进程ID被重用的速度,但是他们不得不回到小数目,而不是出于任何技术原因,而是因为人们抱怨说大进程ID在任务管理器中看起来很难看。 (有一位客户甚至问他的电脑是否有问题。)