ZwQueryInformationProcess 函数

[ZwQueryInformationProcess 在 Windows 的未来版本中可能已更改或不可用。 应用程序应使用本主题中列出的备用函数。]

检索有关指定进程的信息。

语法

NTSTATUS WINAPI ZwQueryInformationProcess(
  _In_      HANDLE           ProcessHandle,
  _In_      PROCESSINFOCLASS ProcessInformationClass,
  _Out_     PVOID            ProcessInformation,
  _In_      ULONG            ProcessInformationLength,
  _Out_opt_ PULONG           ReturnLength
);

参数

ProcessHandle [in]

要为其检索信息的进程句柄。

ProcessInformationClass [in]

要检索的进程信息的类型。 此参数可以是 PROCESSINFOCLASS 枚举中的下列值之一。

含义
ProcessBasicInformation
0
检索指向 PEB 结构的指针,该结构可用于确定是否正在调试指定的进程,以及系统用于标识指定进程的唯一值。
最好使用 CheckRemoteDebuggerPresentGetProcessId 函数来获取此信息。
ProcessDebugPort
7
检索一个 DWORD_PTR 值,该值是进程的调试器的端口号。 非零值指示进程正在环 3 调试器的控制下运行。
最好使用 CheckRemoteDebuggerPresentIsDebuggerPresent 函数。
ProcessWow64Information
26
确定进程是否在 WOW64 环境中运行 (WOW64 是允许基于 Win32 的应用程序在 64 位 Windows) 上运行的 x86 仿真器。
最好使用 IsWow64Process 函数来获取此信息。
ProcessImageFileName
27
检索包含进程的图像文件名称 的UNICODE_STRING 值。
ProcessBreakOnTermination
29
检索一个 ULONG 值,该值指示进程是否被视为关键进程。
注意: 此值可以从 Windows XP SP3 开始使用。 从 Windows 8.1 开始,应改用 IsProcessCritical
ProcessProtectionInformation
61
检索指示受保护进程类型和受保护进程签名者的 BYTE 值。

 

ProcessInformation [out]

指向调用应用程序提供的缓冲区的指针,函数将请求的信息写入其中。 写入的信息的大小因 ProcessInformationClass 参数的值而异:

PROCESS_BASIC_INFORMATION

ProcessInformationClass 参数为 ProcessBasicInformation 时, ProcessInformation 参数指向的缓冲区应足够大,以容纳具有以下布局 的单个PROCESS_BASIC_INFORMATION 结构:

typedef struct _PROCESS_BASIC_INFORMATION {
    NTSTATUS ExitStatus;
    PPEB PebBaseAddress;
    ULONG_PTR AffinityMask;
    KPRIORITY BasePriority;
    ULONG_PTR UniqueProcessId;
    ULONG_PTR InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION;
字段 含义
ExitStatus 包含 GetExitCodeProcess 将返回的相同值。 但是,为了清晰和安全起见,最好使用 GetExitCodeProcess
PebBaseAddress 指向 PEB 结构。
AffinityMask 可以强制转换为 DWORD ,并包含 GetProcessAffinityMask 为参数返回的 lpProcessAffinityMask 相同值。
BasePriority 包含计划优先级中所述的进程 优先级
UniqueProcessId 可以强制转换为 DWORD ,并包含此过程的唯一标识符。 最好使用 GetProcessId 函数来检索此信息。
InheritedFromUniqueProcessId 可以强制转换为 DWORD ,并包含父进程的唯一标识符。

ULONG_PTR

ProcessInformationClass 参数为 ProcessWow64Information 时, ProcessInformation 参数指向的缓冲区应足以容纳 ULONG_PTR。 如果此值不为零,则表示进程在 WOW64 环境中运行;否则,如果值等于零,则表示进程不在 WOW64 环境中运行。

最好使用 IsWow64Process 函数来确定进程是否在 WOW64 环境中运行。

UNICODE_STRING

ProcessInformationClass 参数为 ProcessImageFileName 时, ProcessInformation 参数指向的缓冲区应足够大,以容纳 UNICODE_STRING 结构以及字符串本身。 存储在 Buffer 成员中的字符串是图像文件的名称。

如果缓冲区太小,函数将失败并显示STATUS_INFO_LENGTH_MISMATCH错误代码, 并将 ReturnLength 参数设置为所需的缓冲区大小。

PS_PROTECTION

ProcessInformationClass 参数为 ProcessProtectionInformation 时, ProcessInformation 参数指向的缓冲区应足够大,足以容纳具有以下布局 的单个PS_PROTECTION 结构:

typedef struct _PS_PROTECTION {
    union {
        UCHAR Level;
        struct {
            UCHAR Type   : 3;
            UCHAR Audit  : 1;                  // Reserved
            UCHAR Signer : 4;
        };
    };
} PS_PROTECTION, *PPS_PROTECTION;

前 3 位包含受保护进程的类型:

typedef enum _PS_PROTECTED_TYPE {
    PsProtectedTypeNone = 0,
    PsProtectedTypeProtectedLight = 1,
    PsProtectedTypeProtected = 2
} PS_PROTECTED_TYPE, *PPS_PROTECTED_TYPE;

前 4 位包含受保护的进程签名者:

typedef enum _PS_PROTECTED_SIGNER {
    PsProtectedSignerNone = 0,
    PsProtectedSignerAuthenticode,
    PsProtectedSignerCodeGen,
    PsProtectedSignerAntimalware,
    PsProtectedSignerLsa,
    PsProtectedSignerWindows,
    PsProtectedSignerWinTcb,
    PsProtectedSignerWinSystem,
    PsProtectedSignerApp,
    PsProtectedSignerMax
} PS_PROTECTED_SIGNER, *PPS_PROTECTED_SIGNER;

ProcessInformationLength [in]

ProcessInformation 参数指向的缓冲区的大小(以字节为单位)。

ReturnLength [out, optional]

指向变量的指针,其中函数返回所请求信息的大小。 如果函数成功,则这是 写入 ProcessInformation 参数指向的缓冲区的信息的大小,但如果缓冲区太小,则这是成功接收信息所需的最小缓冲区大小。

返回值

返回 NTSTATUS 成功或错误代码。

NTSTATUS 错误代码的形式和意义列在 DDK 中提供的 Ntstatus.h 头文件中,并在 Kernel-Mode 驱动程序体系结构/设计指南/驱动程序编程技术/日志记录错误下的 DDK 文档中进行了介绍。

备注

ZwQueryInformationProcess 函数及其返回的结构在操作系统内部,并且可能会从一个版本的 Windows 更改为另一个版本。 为了保持应用程序的兼容性,最好改用 ProcessInformationClass 参数的说明中提到的公共函数。

如果使用 ZwQueryInformationProcess,请通过 运行时动态链接访问函数。 这样,代码就有机会在操作系统中更改或删除函数时正常响应。 但是,签名更改可能无法检测到。

此函数没有关联的导入库。 必须使用 LoadLibraryGetProcAddress 函数动态链接到 Ntdll.dll。

要求

要求
最低受支持的客户端
Windows XP [仅限桌面应用]
最低受支持的服务器
Windows Server 2003 [仅限桌面应用]
DLL
Ntdll.dll

另请参阅

CheckRemoteDebuggerPresent

GetProcessId

IsDebuggerPresent

IsWow64Process