首页
社区
课程
招聘
[求助](已解决)使用PsCreateSystemThread创建内核线程,卸载驱动时蓝屏
发表于: 2009-9-11 10:08 16604

[求助](已解决)使用PsCreateSystemThread创建内核线程,卸载驱动时蓝屏

2009-9-11 10:08
16604
我在驱动入口处通过调用    ntStatus = PsCreateSystemThread(&hThread, (ACCESS_MASK)THREAD_ALL_ACCESS, NULL, NULL, NULL, (PKSTART_ROUTINE)WatchKiAttachProcessThread, NULL) 创建一个属于System进程的线程

线程函数:
void WatchKiAttachProcessThread(IN PVOID pContext)
{
    LARGE_INTEGER liInterval;
    liInterval.QuadPart = - 10 * 1000 * 1000; ////延迟1秒钟运行  ;

    while(1)
    {
        KeDelayExecutionThread(KernelMode,TRUE,&liInterval);
        DbgPrint("Thread Is Still Alive");

        if(((PUCHAR)g_OirginalKiAttachProcesssAddress)[1] != g_JmpMyKiAttachProcesssBytes[1] &&
           ((PUCHAR)g_OirginalKiAttachProcesssAddress)[2] != g_JmpMyKiAttachProcesssBytes[2] &&
           ((PUCHAR)g_OirginalKiAttachProcesssAddress)[3] != g_JmpMyKiAttachProcesssBytes[3] &&
           ((PUCHAR)g_OirginalKiAttachProcesssAddress)[4] != g_JmpMyKiAttachProcesssBytes[4] )
        {
            HookKiAttachProcesss();
        }
    }
}

卸载驱动时,蓝屏代码:stop:0x000000ce
请各位牛人帮忙解答一下我的几个问题:
1. 使用PsCreateSysteThread 创建的线程,当卸载驱动时,会不会自己关闭?
2. 假设不会自己关闭,那我要如何来手动关闭?可以在Unload中使用PsTerminateSystemThread吗?
3. 使用PsTerminateSystemThread关闭线程时,是强制关闭指定的线程还是会将线程流程完全走完后再关闭?即:如果我使用自旋锁,在线程结束时自旋锁计数减1,而我使用PsTerminateSystemThread结束该线程后,自旋锁减1操作会被执行吗?

牛人们帮帮忙解答下,能清晰一些最好,嘿嘿,小弟在此先行谢过!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
BOOLEAN g_bExit=FALSE;

void WatchKiAttachProcessThread(IN PVOID pContext)
{
    LARGE_INTEGER liInterval;
    liInterval.QuadPart = - 10 * 1000 * 1000; ////延迟1秒钟运行  ;

    while(1)
    {
        if (g_bExit)
        {
                PsTerminateSystemThread(...);
        }
        else
        {
                KeDelayExecutionThread(KernelMode,TRUE,&liInterval);
                DbgPrint("Thread Is Still Alive");

                if(((PUCHAR)g_OirginalKiAttachProcesssAddress)[1] != g_JmpMyKiAttachProcesssBytes[1] &&
                   ((PUCHAR)g_OirginalKiAttachProcesssAddress)[2] != g_JmpMyKiAttachProcesssBytes[2] &&
                   ((PUCHAR)g_OirginalKiAttachProcesssAddress)[3] != g_JmpMyKiAttachProcesssBytes[3] &&
                   ((PUCHAR)g_OirginalKiAttachProcesssAddress)[4] != g_JmpMyKiAttachProcesssBytes[4] )
                {
                            HookKiAttachProcesss();
                }
        }
    }
}

//使用时
g_bExit=TRUE;
KeWaitForxxx(...);
2009-9-11 10:25
0
雪    币: 77
活跃值: (17)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢LS的兄弟
//使用时
g_bExit=TRUE;
KeWaitForxxx(...);

是不是说我可以在UNLOAD的时候使用这个方法来等待线程的结束?
也就是说驱动卸载时,系统线程并不会自己结束或者可以说是结束的时间与驱动卸载时的时间并不相同对吧
2009-9-11 10:52
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
不会自动结束,动下脑子就能想出结果的啊
2009-9-11 11:01
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
貌似系统线程只能自杀
2009-9-11 11:35
0
雪    币: 77
活跃值: (17)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我在OnUnLoad里加入了
VOID OnUnload(IN PDRIVER_OBJECT DriverObject){
    NTSTATUS ntStatus;
    g_bExit = TRUE;
    ntStatus = KeWaitForSingleObject(hThread, Executive, KernelMode, TRUE, 0);
    KdPrint(("NTSTATUS:%X\n", ntStatus));
    UnHook();
}

卸载时蓝屏代码:irql_not_less_or_equal  
调试的时候如果把断点下在了线程函数上,怎么样能运行回主线程上?
2009-9-11 13:33
0
雪    币: 77
活跃值: (17)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
上面这问题解决了,第一个参数传的不对,汗~~~~
应该是把线程句柄的指针传进去

不过现在有另一个问题,跟踪到这之后,并没有进行等待而是直接一路执行下去,所以又导致了蓝屏
应该是KeWaitForSingleObject使用的不正确吧,,再查查看看
2009-9-11 13:59
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
8
KeWaitForSingleObject,第一个参数是对象地址,要先从pslookupthreadbythreadid获取
2009-9-11 14:04
0
雪    币: 77
活跃值: (17)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
不是传HANDLE吗?
真晕,再试!!!
2009-9-11 14:13
0
雪    币: 77
活跃值: (17)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
果然,这次不蓝了

哈哈,感谢感谢,多谢各位的热心解答
2009-9-11 14:27
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
我在给你写那个KeWaitxxx的时候就想到有可能你会这样子用果不然,忘记提醒你了
2009-9-11 14:43
0
雪    币: 77
活跃值: (17)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
2009-9-11 18:10
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
膜拜楼主,学习了
2009-9-11 22:37
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
线程函数怎么在Write操作中调用呀?
2018-5-10 10:42
0
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
queue  apc  杀线程
2018-5-11 21:40
0
雪    币: 12
活跃值: (691)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
考下古  留个言
2022-7-7 17:49
0
游客
登录 | 注册 方可回帖
返回
//