首页
社区
课程
招聘
[原创]使用PsCreateSystemTread需要注意的地方
发表于: 2009-9-13 17:35 3306

[原创]使用PsCreateSystemTread需要注意的地方

2009-9-13 17:35
3306
我是个新手,俗称小菜
这两天在尝试着inline hook系统内核,遇到的问题比较多,不过现在要说的这个问题是这两天困扰我最大的一个!

看这篇帖子前建议菜鸟同学们先看一下我另两个帖子
http://bbs.pediy.com/showthread.php?t=97582
http://bbs.pediy.com/showthread.php?t=97613
这两个帖子里有我所遇到的情况,以及各路大牛们的热心解答,相信对菜鸟应该还是有一定作用的!

言规正传
看了上面两篇帖子的,应该清楚我使用的等待线程结束的方法,是设置一个事件,然后在主线程里通过等待事件激活,来判断线程结束而进行最终的驱动卸载的.
在此郑重声明,此方法存在重大问题,,即当时有位大牛已经提出来的, 如果事件被激活的瞬间,CPU进行线程调试,主线程抢先执行,驱动卸载后,再调度回应该结束的线程进行结束操作时,即会发生BSOD

代码:0000000CE   DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
微软的介绍:
http://msdn.microsoft.com/en-us/library/ms797129.aspx

说是有IRP没有被取消, 菜菜我实在是不知道在哪个操作里进行过IRP的设置 经过两天的来回测试,终于发现,唯一可能是,驱动已经被卸就是线程调度到这里时,找不到相应代码.,所以产生了蓝屏.

然后尝试着在卸载时改成下面的写法:

    ntStatus = ObReferenceObjectByHandle(hThread, (ACCESS_MASK)THREAD_ALL_ACCESS, NULL, KernelMode, &pEthreead, NULL);
     ZwClose(hThread);
    ntStatus = KeWaitForSingleObject(pEthreead, Executive, KernelMode, TRUE, 0);
    UnHook();

再不停的安装卸载驱动,没有发生过线程未结束时被调度的现象,也没有再出过那该死的BSOD

写的很烂,只是一些小小的经验,别的版块不敢发了,实在太糗,,,,只好在新手版块来卖弄卖弄!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//