阅读:2668回复:17
从驱动往应用程序传数据的问题
我用DeviceIoControl里面定义的输出buffer的方法从驱动向应用传数据,直接
往输出buffer里面写入数据就没问题,要是从驱动一个变量里面strcpy就蓝屏重起,帮忙看看吧 ResultStatus = ObReferenceObjectByHandle(ProcessHandle,PROCESS_ALL_ACCESS,*PsProcessType,UserMode,(PVOID)&process,(PVOID)&info); DBGPRINT(("%s"),process->ImageFileName ) 这个能打出来,这是个UCHAR[16]的变量 //strcpy(buff,"test") 这样就没问题 , buffer是外面传进来的buffer strcpy(buff,process->ImageFileName); 这个就蓝屏,不止是这样,任何读imagefilename的操作 都会BSOD,这是怎么回事啊 已经蓝了无数次了,各位帮帮忙吧 |
|
沙发#
发布于:2007-07-31 20:14
查了网上一些说法,好像说是需要zwreadvirtualmemory才能读出这个变量阿,不太明白,不过我
的环境是xp,好像这个函数已经不支持了阿,有什么替代的函数吗,谢谢 |
|
板凳#
发布于:2007-08-01 12:23
process->ImageFileName如果不以0结尾,strcpy可能因为越界,而导致蓝屏. 检查一下.
|
|
地板#
发布于:2007-08-01 17:27
不是越界的问题吧
我这样赋值都不行啊 char a; a = process->ImageFileName[0]; |
|
地下室#
发布于:2007-08-02 11:26
if(buffer!=NULL)
|
|
5楼#
发布于:2007-08-02 12:11
没有用debugger跟一下啊?minidump呢?
|
|
6楼#
发布于:2007-08-02 14:02
RtlCopyMemory试试
|
|
|
7楼#
发布于:2007-08-02 16:03
Attach到ProcessHandle进程了吧。。。注意一下DeviceIoControl时的进程上下文,你Attach到其他进程,写DeviceIoControl进程的虚拟地址,肯定会出错
|
|
8楼#
发布于:2007-08-02 17:29
感觉好像就是jackiefzj说的问题,在hook ntcreateprocess的时候,里面的代码似乎是在创建的进程上执行的吧,不太懂,感觉上好像是这样,那怎么解决阿,我见过有人说nwreadvirtualmemory好像管用什么的,但是这个函数在xp的kernel库没有导出阿,jackiefzj有什么办法解决吗
|
|
9楼#
发布于:2007-08-02 17:50
hook NtCreateProcess?没明白。。。取ImageFileName应该在NtCreateProcess()内,应用层读ImageFileName应该在DeviceIoControl内。
你怎么把ImageFileName直接copy到Irp->UserBuffer里的? 中间应该有一个变量临时保存的一下吧?注意分配这个变量时,用NonPagedPool |
|
10楼#
发布于:2007-08-02 17:51
你读的不是eprocess->ImageFileName?这个是在内核中的,不存在你说的问题.
如果要访问,其他进程的用户空间,要attach 到那个进程去,在访问. |
|
11楼#
发布于:2007-08-03 09:53
我说一下目前解决的情况
1.ntcreateprocess里面无论怎么调用这个eprocess,都没问题, 2.ntterminateprocess里面一访问这个eprocess就死掉(dbgprint没问题),而且传入的processid是一个空值,搞不清楚系统是怎么处理这个空值还能找到对应的eprocess的,最后发现用 PsGetCurrentProcess得到的eprocess能读出来。还是有个问题,比如我要是启动notepad.exe在关闭,关闭的时候取出来的是正确的notepad.exe,但是如果在程序里面用api启动关闭notepad.exe,关闭的时候取出来的是调用程序.exe。反正先将就着用吧 |
|
12楼#
发布于:2007-08-03 10:24
对于ntterminateprocess
1.,如果是进程自己退出,exitprocess,调用ntterminateprocess的时候handle为0,表示是当前进程退出,调用PsGetCurrentProcess可以取得eprocess的imagefilename 2.如果是A进程调用TerminateProcess 结束B进程,PsGetCurrentProcess是A进程. 如果想取得B进程的ImageFileName,可以ObReferenceObjectByHandle从handle获得 B的eprocess. |
|
13楼#
发布于:2007-08-03 10:26
ntterminateprocess中,PsGetCurrentProcess取出的父进程,也就是操作进程。你点notepad.exe关闭按钮,实际上是自己关闭自己,取出来虽然还是notepad,但其实意义是不一样的。
再给你总结一下 要取操作进程,直接PsGetCurrentProcess() 要取目标进程,就ObReferenceObjectByHandle -> ProcessHandle,由于你当前进程上下文在操作进程内,所以取出EProcess后,还要KeAttachProcess(EProcess)过去 KeAttachProcess(EProcess); //切换到目标context nameptr = (PCHAR)EProcess + g_ProcessNameOffset; strncpy( ProcessName, nameptr, 16 ); ProcessName[16] = 0; /* NULL at end */ KeDetachProcess(); //切回原context 再多嘴一句,进程监视,PsSetCreateProcessNotifyRoutine是正道 |
|
14楼#
发布于:2007-08-03 11:05
eprocess都在内核空间,不需要KeAttachProcess
|
|
15楼#
发布于:2007-08-03 13:36
![]() ![]() 另外试验的结果如版主所说确实不需要attatch 现在还有一个小问题,就是我从eprocess取出来的imagefilename变量(uchar[16])如果 是中文名称的情况下就不对了,但是这个变量好像又不是unicode的,不知道怎样能正确 地读出来哪。 |
|
16楼#
发布于:2007-08-03 15:57
如何解決的? 不過應該用 RtlCopyMemory.
|
|
17楼#
发布于:2007-08-03 16:40
我只是测试中路过的...
|
|
|