[
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 結構的指標,可用來判斷指定的進程是否正在偵錯,以及系統用來識別指定進程的唯一值。
最好使用 CheckRemoteDebuggerPresent 和 GetProcessId 函式來取得此資訊。
- ProcessDebugPort
- 7
擷取 DWORD_PTR 值,這個值是進程偵錯工具的埠號碼。 非零值表示進程正在通道 3 偵錯工具的控制下執行。
最好使用 CheckRemoteDebuggerPresent 或 IsDebuggerPresent 函式。
- ProcessWow64Information
- 26
判斷進程是否在 WOW64 環境中執行, (WOW64 是 x86 模擬器,可讓 Win32 型應用程式在 64 位 Windows) 上執行。
最好使用 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;
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,請透過 執行時間動態連結存取函式。 這可讓您的程式碼有機會在函式已變更或從作業系統中移除時正常回應。 不過,無法偵測簽章變更。
此函式沒有相關聯的匯入程式庫。 您必須使用 LoadLibrary 和 GetProcAddress 函式動態連結至 Ntdll.dll。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:https://aka.ms/ContentUserFeedback。
提交並檢視相關的意見反應