sunway_yin
驱动牛犊
驱动牛犊
  • 注册日期2006-06-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分312分
  • 威望42点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
阅读:1935回复:10

为和在write包里面获取进程对应的完整路径时会死掉?代码如下

楼主#
更多 发布于:2007-04-26 18:01
  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里面就得死。。。
希望哪个牛人能告诉我,我的代码什么地方出错了 谢谢
sunway_yin
驱动牛犊
驱动牛犊
  • 注册日期2006-06-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分312分
  • 威望42点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-26 22:59
难道就没人能解决么?:(
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
板凳#
发布于:2007-04-27 08:06
引用第1楼sunway_yin2007-04-26 22:59发表的“”:
难道就没人能解决么?:(


FileMon代码摆在那里都是闲置的,自己先把KeAttachProcess和KeDetachProcess搞搞清楚!
人总在矛盾中徘徊。。。
sunway_yin
驱动牛犊
驱动牛犊
  • 注册日期2006-06-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分312分
  • 威望42点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-28 09:55
谢谢楼上的关注。
非常感谢 楼上的关注,但是您说的比较模糊,首先我keatach函数是应该在dispatch例程里面使用的,而且中断等级也该没有问题,通过dbg跟踪的结果是在第二个 offset=... 的时候出错。 其次,我把keatach函数注释掉,一样会死掉。。。。而且 ,为何 这段代码(不用修改)在 其他的 派遣例程里面跑的很正常。
  如果能得到你的 细心解答,感激不尽。 谢谢你。
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-04-28 10:19
你这样得到进程路径名也太儿戏了,znsoft老大有一个帖子说的就是怎样得到进程全路经,建议你去看一下。
sunway_yin
驱动牛犊
驱动牛犊
  • 注册日期2006-06-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分312分
  • 威望42点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-28 11:27
问题依然没有得到解决....znsoft老大的贴子,搜索过了,没有看见相关的内容。 继续郁闷中。。。
nvicly
驱动牛犊
驱动牛犊
  • 注册日期2006-09-12
  • 最后登录2019-01-21
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望158点
  • 贡献值0点
  • 好评度82点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-04-28 11:59
这种方法不能在Read\Write例程里面用的,建议在Create例程里取了先保存起来,用完后在Close时释放.
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
7楼#
发布于:2007-04-28 13:12
1。WRITE例程中完成“Lazy Write”工作的是System进程(CACHED WRITE情况);
2。如果是“System”进程,那它的ImageFilePath会是什么呢?
人总在矛盾中徘徊。。。
z.b.Azy
驱动牛犊
驱动牛犊
  • 注册日期2006-03-11
  • 最后登录2013-04-29
  • 粉丝0
  • 关注0
  • 积分263分
  • 威望95点
  • 贡献值0点
  • 好评度91点
  • 原创分2分
  • 专家分0分
8楼#
发布于:2007-04-28 16:37
感觉是你切换上下文的问题,为什么要切到当前上下文呢?这样做无意义 原因可能是当前执行write例程的进程上下文不是原始进程上下文
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-04-30 13:16
没必要做切换,context根本就没有变过。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
bladellz
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望121点
  • 贡献值0点
  • 好评度120点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-05-08 14:32
devi老大说的 是正确的 ,我跟踪过了 每次死都是因为system这个进程的原因,现在问题解决了 。谢谢
游客

返回顶部