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

Windows内核驱动:进程加载时PS_CREATE_NOTIFY_INFO的UniqueThread是否稳定?

关于PS_CREATE_NOTIFY_INFO中UniqueThread的一致性问题

首先直接给你结论:完全可以放心使用这个UniqueThread ID,它在进程加载到ntdll完成的整个阶段是绝对一致且有效的,原因如下:

  • 线程ID的本质:PS_CREATE_NOTIFY_INFO里的UniqueThread其实就是进程初始线程的THREAD_ID——Windows内核中每个线程的ID是全局唯一的,并且从线程创建完成到终止回收的整个生命周期里,这个ID不会有任何变化。进程的初始线程是进程启动的核心载体,在ntdll加载完成前,它必然处于活跃状态,不可能提前退出。

  • 进程创建与加载的时序:当PsSetCreateProcessNotifyRoutineEx触发回调时,进程的初始线程已经完成创建(进程创建的逻辑必然伴随初始线程的初始化)。而后续PsSetLoadImageNotifyRoutineEx检测到ntdll加载的时机,是在进程初始化流程中,由这个初始线程负责加载核心模块的阶段。也就是说,从你拿到线程ID到执行APC注入的这段时间,初始线程一直在执行加载操作,绝对不会被销毁。

  • 你的方案优势:相比原示例用ZwQuerySystemInformation枚举线程的方式,你这种在进程创建回调中直接捕获初始线程ID的思路更高效、更可靠——既避免了枚举系统线程的性能开销,也消除了枚举过程中可能出现的线程状态竞争(比如枚举时线程刚好退出的极端情况)。

额外注意事项

  • 保存线程ID的变量要处理好多进程并发创建的场景,建议用自旋锁或者原子操作来保护,避免多个进程回调同时写入导致的ID覆盖问题。
  • 调用PsLookupThreadByThreadId获取ETHREAD后,记得用ObDereferenceObject释放引用,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:27:15