阅读:1935回复:10
为和在write包里面获取进程对应的完整路径时会死掉?代码如下
NTSTATUS
MyWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { //保存进程完整路径名 PUNICODE_STRING processName = NULL; //偏移值 ULONG offset = 0; PEPROCESS CurrentProcess = NULL; PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp ); //对包作些判断 if(!(irpSp->FileObject->FileName).Buffer) return SfPassThrough(DeviceObject,Irp); if((irpSp->FileObject->FileName).Length<6) return SfPassThrough(DeviceObject,Irp); CurrentProcess = PsGetCurrentProcess(); KeAttachProcess(CurrentProcess); offset = *(PULONG)((ULONG)CurrentProcess + 0x1B0); //得到peb的地址 offset = *(PULONG)((ULONG)offset + 0x10); //得到process_parameters的地址 processName = (PUNICODE_STRING)(offset + 0x38); //获取到imagefile的地址,2k是0x3c,可以在这里判断 DbgPrint("Current Process Full Path Name: %wZ\n",processName); KeDetachProcess(); DbgPrint("写文件"); return SfPassThrough(DeviceObject,Irp); } 有意思的是 这段代码在其他的派遣例程里面可以正常运行 但是在write里面就得死。。。 希望哪个牛人能告诉我,我的代码什么地方出错了 谢谢 |
|
沙发#
发布于:2007-04-26 22:59
难道就没人能解决么?:(
|
|
板凳#
发布于:2007-04-27 08:06
引用第1楼sunway_yin于2007-04-26 22:59发表的“”: FileMon代码摆在那里都是闲置的,自己先把KeAttachProcess和KeDetachProcess搞搞清楚! |
|
|
地板#
发布于:2007-04-28 09:55
谢谢楼上的关注。
非常感谢 楼上的关注,但是您说的比较模糊,首先我keatach函数是应该在dispatch例程里面使用的,而且中断等级也该没有问题,通过dbg跟踪的结果是在第二个 offset=... 的时候出错。 其次,我把keatach函数注释掉,一样会死掉。。。。而且 ,为何 这段代码(不用修改)在 其他的 派遣例程里面跑的很正常。如果能得到你的 细心解答,感激不尽。 谢谢你。 |
|
地下室#
发布于:2007-04-28 10:19
你这样得到进程路径名也太儿戏了,znsoft老大有一个帖子说的就是怎样得到进程全路经,建议你去看一下。
|
|
5楼#
发布于:2007-04-28 11:27
问题依然没有得到解决....znsoft老大的贴子,搜索过了,没有看见相关的内容。 继续郁闷中。。。
|
|
6楼#
发布于:2007-04-28 11:59
这种方法不能在Read\Write例程里面用的,建议在Create例程里取了先保存起来,用完后在Close时释放.
|
|
7楼#
发布于:2007-04-28 13:12
1。WRITE例程中完成“Lazy Write”工作的是System进程(CACHED WRITE情况);
2。如果是“System”进程,那它的ImageFilePath会是什么呢? |
|
|
8楼#
发布于:2007-04-28 16:37
感觉是你切换上下文的问题,为什么要切到当前上下文呢?这样做无意义 原因可能是当前执行write例程的进程上下文不是原始进程上下文
|
|
9楼#
发布于:2007-04-30 13:16
没必要做切换,context根本就没有变过。
|
|
|
10楼#
发布于:2007-05-08 14:32
devi老大说的 是正确的 ,我跟踪过了 每次死都是因为system这个进程的原因,现在问题解决了 。谢谢
|
|