阅读:2717回复:8
PsCreateSystemThread遇到的问题
有一个驱动要写日志,无奈处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); } |
|
沙发#
发布于:2004-11-25 22:10
这个函数也要在PASSIVE_LEVEL调用哟....检查下这个条件...
一般的讲....只是在driverentry里面调用这个函数.... 你也可以用workitem的方式来完成这个功能..... 呵呵.... 其实有个checked build的os会是一件很舒服的事情... |
|
板凳#
发布于:2004-11-25 22:25
那么说如果要在高级别写日志都是在DriverEntry时创建一个日志线程,然后要写日志时,与其通讯即可是吗?
我都没有见过写日志的例子,所以是自己揣测的了,按着sdk写法换成ddk语句了哈哈...不知是不是你说的那样,那么softice下成功了,难道softice情况下就是在PASSIVE_LEVEL级了?那么KeGetCurrentIrql()得到的怎么是2呢? |
|
地板#
发布于:2004-11-25 22:51
windows要求这个函数在PASSIVE_LEVEL调用...并不是说这个函数如果不在这个level调用的话就一定出错...在某些情况下...这个操作是能正常完成的...只是有潜在的bug...明白么...只是说这个函数如果不只这个level调用就可能会有错.....我以前也遇到这个问题的...所以我推荐你有一个checked build 的os..因为...如果你不在passive level调用他...os就会蓝屏...呵呵...
写log嘛..有很多种方式了..用workitem呗..比较容易一点...其实workitem跟自己创建thread是没有什么大的区别的.. |
|
地下室#
发布于:2004-11-25 22:55
ntStatus = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, &oa, NtCurrentProcess(), NULL, (PKSTART_ROUTINE)WriteLog, NULL);
|
|
|
5楼#
发布于:2004-11-26 08:34
按着大佬的方法,还是失败了,但是出错改变了,
IRQL_NOT_LESS_OR_EQUAL 能否解释下,看来是要在PASSIVE_LEVEL调用了. [编辑 - 11/26/04 by pwpwpw123] [编辑 - 11/26/04 by pwpwpw123] |
|
6楼#
发布于:2004-11-26 10:02
ntStatus = PsCreateSystemThread(&hThread, 0, &oa, NtCurrentProcess(), NULL, (PKSTART_ROUTINE)WriteLog, NULL);
|
|
|
7楼#
发布于:2004-11-26 10:30
按着大佬的方法,还是失败了,但是出错改变了, PsCreateSystemThread当然需要在PASSIVE_LEVEL上调用,你在什么地方call的? |
|
|
8楼#
发布于:2004-11-26 11:25
好吧,我还是决定去改到驱动加载时DriverEntry里面创建一个系统线程专门负责记录日志,谢谢各位
|
|