You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows内核模式驱动中获取进程的PHANDLE?

Windows内核模式下终止进程的正确姿势

内核驱动开发里确实不能用用户态的OpenProcess(),也绝对不能引入windows.h——那是给用户态程序用的,内核层只需要包含ntddk.h就够了。要终止进程,得用内核原生的API,步骤如下:

  • 第一步:准备打开进程所需的结构体
    内核里打开进程需要OBJECT_ATTRIBUTES和CLIENT_ID两个结构体,这俩在ntddk.h里都有定义,不用额外头文件。

  • 第二步:用ZwOpenProcess获取进程句柄
    这个函数是内核版的“打开进程”,需要指定目标进程的PID,以及所需的权限(比如终止进程需要PROCESS_TERMINATE权限)。

  • 第三步:用ZwTerminateProcess终止进程
    拿到合法的进程句柄后,调用这个函数就能终止目标进程。

  • 第四步:关闭句柄
    内核里打开的句柄必须手动关闭,用ZwClose。

代码示例

#include <ntddk.h>

NTSTATUS TerminateTargetProcess(HANDLE ProcessId)
{
    NTSTATUS status;
    HANDLE hProcess = NULL;
    OBJECT_ATTRIBUTES objAttr;
    CLIENT_ID clientId;

    // 初始化OBJECT_ATTRIBUTES,这里不需要命名对象,所以设为NULL
    InitializeObjectAttributes(&objAttr, NULL, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);

    // 设置目标进程的PID
    clientId.UniqueProcess = ProcessId;
    clientId.UniqueThread = NULL;

    // 打开进程,请求终止权限
    status = ZwOpenProcess(&hProcess, PROCESS_TERMINATE, &objAttr, &clientId);
    if (!NT_SUCCESS(status))
    {
        DbgPrint("ZwOpenProcess failed, status: 0x%X\n", status);
        return status;
    }

    // 终止进程,第二个参数是退出码,一般设为0即可
    status = ZwTerminateProcess(hProcess, 0);
    if (!NT_SUCCESS(status))
    {
        DbgPrint("ZwTerminateProcess failed, status: 0x%X\n", status);
        ZwClose(hProcess);
        return status;
    }

    // 关闭句柄
    ZwClose(hProcess);
    return STATUS_SUCCESS;
}

注意事项

  • 内核驱动里所有Zw开头的API,调用前要确保你了解它的参数要求和返回值含义,比如NT_SUCCESS()宏用来判断操作是否成功。
  • OBJ_KERNEL_HANDLE标志很重要,它表示这个句柄是内核模式句柄,不会被用户态程序访问到,更安全。
  • 要确保驱动有足够的权限去打开和终止目标进程,比如如果目标是系统进程,可能需要更高的权限或者特殊处理。

内容的提问来源于stack exchange,提问作者ZGuardian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:12:17