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
相关产品推荐
相关产品推荐

