pwpwpw123
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2007-08-20
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2716回复:8

PsCreateSystemThread遇到的问题

楼主#
更多 发布于:2004-11-25 21:56
有一个驱动要写日志,无奈处IRQL=2,
ZwWirteFile 要在PASSIVE_LEVEL,于是我就想用PsCreateSystemThread创建系统线程来实现, 但是总是蓝屏
***STOP: 0x000000005 (0x816Ae200,0x8046c470,0x00000000,0x804706a8)
INVALID_PROCESS_ATTACH_ATTEMPT
*** Address 8046c470 base at 80400000, DateStamp 40d1d183 - ntoskrnl.exe
*** Address 804706a8 base at 80400000, DateStamp 40d1d183 - ntoskrnl.exe
在查错过程中我精简精简再精简到一下程序,还是如此错误,应该是
PsCreateSystemThread,因为一注释掉这一行就没问题.好笑的事,我要是用softice拦截Log函数然后F10一步步运行就不会出错.
NTSTATUS Log(void)
{
     NTSTATUS ntStatus;
HANDLE hThread;
PKTHREAD pKThread;
OBJECT_ATTRIBUTES oa;

InitializeObjectAttributes(&oa, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
ntStatus = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, &oa, NULL, NULL, (PKSTART_ROUTINE)WriteLog, NULL);
if(!NT_SUCCESS(ntStatus))
{
return ntStatus;
}
ZwClose(hThread);
return STATUS_SUCCESS;
}

void WriteLog(void)
{
PsTerminateSystemThread(STATUS_SUCCESS);
}
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
沙发#
发布于:2004-11-25 22:10
这个函数也要在PASSIVE_LEVEL调用哟....检查下这个条件...
一般的讲....只是在driverentry里面调用这个函数....
你也可以用workitem的方式来完成这个功能.....
呵呵....
其实有个checked build的os会是一件很舒服的事情...
pwpwpw123
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2007-08-20
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-25 22:25
那么说如果要在高级别写日志都是在DriverEntry时创建一个日志线程,然后要写日志时,与其通讯即可是吗?
我都没有见过写日志的例子,所以是自己揣测的了,按着sdk写法换成ddk语句了哈哈...不知是不是你说的那样,那么softice下成功了,难道softice情况下就是在PASSIVE_LEVEL级了?那么KeGetCurrentIrql()得到的怎么是2呢?
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
地板#
发布于:2004-11-25 22:51
windows要求这个函数在PASSIVE_LEVEL调用...并不是说这个函数如果不在这个level调用的话就一定出错...在某些情况下...这个操作是能正常完成的...只是有潜在的bug...明白么...只是说这个函数如果不只这个level调用就可能会有错.....我以前也遇到这个问题的...所以我推荐你有一个checked build 的os..因为...如果你不在passive level调用他...os就会蓝屏...呵呵...

写log嘛..有很多种方式了..用workitem呗..比较容易一点...其实workitem跟自己创建thread是没有什么大的区别的..
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-11-25 22:55
ntStatus = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, &oa, NtCurrentProcess(), NULL, (PKSTART_ROUTINE)WriteLog, NULL);
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
pwpwpw123
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2007-08-20
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-26 08:34
按着大佬的方法,还是失败了,但是出错改变了,
IRQL_NOT_LESS_OR_EQUAL
能否解释下,看来是要在PASSIVE_LEVEL调用了.

[编辑 -  11/26/04 by  pwpwpw123]

[编辑 -  11/26/04 by  pwpwpw123]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2004-11-26 10:02
ntStatus = PsCreateSystemThread(&hThread, 0, &oa, NtCurrentProcess(), NULL, (PKSTART_ROUTINE)WriteLog, NULL);
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-26 10:30
按着大佬的方法,还是失败了,但是出错改变了,
IRQL_NOT_LESS_OR_EQUAL
能否解释下,看来是要在PASSIVE_LEVEL调用了.


PsCreateSystemThread当然需要在PASSIVE_LEVEL上调用,你在什么地方call的?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
pwpwpw123
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2007-08-20
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-11-26 11:25
好吧,我还是决定去改到驱动加载时DriverEntry里面创建一个系统线程专门负责记录日志,谢谢各位
游客

返回顶部