阅读:2507回复:8
[求助]关于ZwTerminateProcess
写了个驱动.中间有以下的代码:
////........... PsCreateSystemThread(); //ThreadProc为线程函数 //// void ThreadProc() { CLIENT_ID id; id.UniqueProcess=(HANDLE)PID; id.UniqueThread=(HANDLE)0; OBJECT_ATTRIBUTES attr={sizeof(OBJECT_ATTRIBUTES), 0,NULL,NULL}; attr.Attributes=0; HANDLE hProcess=NULL; status=NtOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&attr,&id); if(status==STATUS_SUCCESS) { ZwTerminateProcess(hProcess,0); //如果去掉这行,一切正常 ZwClose(hProcess); } } 用这些代码终止进程.往往是终止一个进程后过几秒后BSOD,还有的时候终止2个进程都不会BSOD,但是一终止第三个就蓝了.... 请问各位大师是怎么回事啊? |
|
沙发#
发布于:2007-07-31 22:27
NT* 和 Zw* 可以混着用么? 一个是ring3的一个是ring0的
|
|
板凳#
发布于:2007-08-01 11:00
都是R0的吧....
看看ntoskrnl.exe的导出表. PS:换成ZwOpenProcess也不行 |
|
驱动小牛
|
地板#
发布于:2007-08-01 18:26
NT是R3的,虽然ZW也是调用NT,但是OS经过了自己的处理.
你用全局变量,应该考虑同步的问题. |
地下室#
发布于:2007-08-01 23:15
我觉得还是分开来用比较好,至少在驱动中是不能够混着用的。
|
|
5楼#
发布于:2007-08-23 12:19
ClientIdProcess id and thread id must be fill with valid values.
所以id.UniqueThread 不能填0,这个你如果去看看win2k源码就知道这个值会用来在句柄表索引,之所以填0可以返回成功是因为索引到的值是可以用的,但是通常并不会索引到想要的线程的句柄,所以有时灵有时又BSOD完全取决于索引到的这个值。 所以id.UniqueThread 也要填写正确的值 |
|
6楼#
发布于:2007-08-23 14:01
更正:看了一下,id.UniqueThread 填0是可以的,上面楼主说的问题可能是pid引起的,因为系统进程有的是不能终止的,一旦终止就会重启动
|
|
7楼#
发布于:2007-09-16 11:31
终止taskmgr.exe都会重启的.换用PspTerminateProcess也是同样的问题.
|
|
8楼#
发布于:2007-09-17 01:06
不是很明白
|
|