首页
社区
课程
招聘
[求助] 创建内核线程的一个问题!
发表于: 2009-1-6 00:42 6820

[求助] 创建内核线程的一个问题!

2009-1-6 00:42
6820
在驱动中通过PsCreateSystemThread函数来创建一个内核线程..

如果这个函数用在驱动的入口函数里,那么用PsGetCurrentProcessId()获得的当前进程ID是否是System的进程ID?

如果用在派遣列程里,那么获得的当前进程ID是否就是调用者进程的ID?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
2
1、在ThreadRoutine里面使用PsGetCurrentProcessId()获得的是system这个进程的id
2、否
2009-1-6 12:12
0
雪    币: 400
活跃值: (1524)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
PsCreateSystemThread函数有个可选参数ProcessHandle
ddk定义如下:
Specifies an open handle for the process in whose address space the thread is to be run. The caller’s thread must have PROCESS_CREATE_THREAD access to this process. If this parameter is not supplied, the thread will be created in the initial system process. This value should be NULL for a driver-created thread. Use the NtCurrentProcess macro to specify the current process.
再翻翻wrk看看实现就更清楚了
NTSTATUS PsCreateSystemThread{...
ProcessPointer = NULL;
    if (ARGUMENT_PRESENT(ProcessHandle)) {
        SystemProcess = ProcessHandle;
    } else {
        SystemProcess = NULL;
        ProcessPointer = PsInitialSystemProcess;
    }
PspCreateThread(...)
...}
PspCreateThread再对ProcessHandle(SystemProcess )作检查,如果你给了这个参数,那么就增加这个ps对象的计数,可见你创建的线程就是在 这个ps地址里运行的,如果没给就给ProcessPointer (PsInitialSystemProcess)增加计数,ProcessPointer 就是system process
建议lz先看看ddk再来问问题,很多东西都是能查到的,翻翻wrk什么的就清楚了
2009-1-6 14:27
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的2位..可能你们弄错我的意思了...

我自己试了下..你们可能理解为我的问题是问创建的内核线程是属于哪个进程了吧..

不过还是非常感谢...

之前很白痴,线程创建完以后,在卸载驱动的函数里使用PsTerminateSystemThread来结束线程.
导致蓝屏,黑幕,死机.很不解....

后来看了下PsTerminateSystemThread函数原来是结束当前线程的,哪时没想到什么线程调度什么的.就这样,把系统线程给结束了..   后来把他用在线程内,有自身线程来结束就可以了!
2009-1-6 19:06
0
游客
登录 | 注册 方可回帖
返回