windows - 为什么在Win7 64bit下 'ntQuerySystemInformation'无法获取大于65535的进程id?

标签 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。这个struct中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-s...

例如,请参阅 ProcessExplorer 项目的源文件 ntexapi.h 以获取更多信息。
另请注意,我的结构定义中 SYSTEM_HANDLE_INFORMATION_EX 的字段宽度可能与它们的不同(也就是说,在我的定义中,某些字段宽度因位数而异),但我想我测试过代码在 32 位和 64 位下,发现它是正确的。
如有必要,请重新检查,如果您有其他信息,请告知我们。

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

相关文章:

windows - 在 Unix/Linux 平台上运行的 Perl 脚本是否可以创建 Windows 快捷方式?

javascript - React Native packager.js 错误导致开发服务器崩溃?

windows - 故意使内核崩溃

c - Linux内核模块不自动加载

c# - .Net 应用程序中带有 STATUS_STACK_OVERFLOW 的应用程序崩溃是否意味着堆栈溢出发生在 native 代码中?

Windows 批处理,仅选择用户变量

c - 没有收到 WM_DISPLAYCHANGE

linux - 使用 dmsetup Kernel 3.9.6 创建 dm-cache

windows - Win32 应用程序是否自动链接到 ntdll.dll?

c++ - 使用 NtCreateKey() NTAPI 函数创建新的注册表项 [NtOpenKey() 函数返回 NTSTATUS 错误值 -1073741772]