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 值,该值指示进程是否被视为关键。
[!注意]
此值可以从 SP3 的 WINDOWS XP 开始使用。 从 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 ,并包含 GetProcessAffinityMasklpProcessAffinityMask 参数返回的相同值。
BasePriority 包含 计划优先级中所述的进程优先级。
UniqueProcessId 可以强制转换为 DWORD ,并包含此过程的唯一标识符。 最好使用 GetProcessId 函数检索此信息。
InheritedFromUniqueProcessId 可以强制转换为 DWORD ,并包含父进程的唯一标识符。

ULONG_PTR

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

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

UNICODE_STRING

ProcessInformationClass 参数为 ProcessImageFileName 时, ProcessInformation 参数指向的缓冲区应足够大,以便保存 UNICODE_STRING 结构和字符串本身。 缓冲区成员中存储的字符串是映像文件的名称。

如果缓冲区太小,函数将失败并显示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, 可选]

指向函数返回所请求信息大小的变量的指针。 如果函数成功,则这是 由 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