macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2258回复:18

irp->userbuffer的内容怎么改呀?

楼主#
更多 发布于:2002-04-18 22:21
用户被禁言,该主题自动屏蔽!

最新喜欢:

ljmmaryljmmar...
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-19 00:29
没错啊!Length里面的就是长度
为什么蓝屏我就不知道了!因为你的程序我不知道!不过你要清楚的是当前运行的IRQL和你访问的那部分内存到底是不是分页内存!以及你要保证irp->userbuffer不为空,还有就是这个你要保证确定是数据的缓冲区,还有就是要看你的这个设备设置到底是以DO_DIRECT还是DO_BUFFER方式
因为这两个方式确定了数据缓冲区的指针会放在不同的地方
AChen
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2002-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-19 01:22
是不是在改动前后还要做什么?直接改会兰屏。
还有,在filemon的filemonhookroutine的IRP_MJ_READ里IrpSp->Parameters.Read.Length是文件长度吗?怎么这个数字那么大?


不是什么时候改都会出错的吧,上回一个程序我就是直接通过写UserBuffer给应用程序数据的,(当然本来是用Irp->AssociatedIrp->SystemBuffer的),发现很正常。估计是由于我
的那个Driver位于Toppest Layer,运行在App Context中。

你是用Filemon的吧,过虑的,Context不一定能行。但是记得我也直接在调试时Softice中改了,没事。

第二个问题,我也觉得怪,为什么这么大呢,好不容易跟踪到一个小的,(打开一个文本文件,4字节),而且就是直接改了UserBuffer,结果还真改了。

哥们,做的东西差不多呀!!
This posting is provided "AS IS" with no warranties, and confers no rights.
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-04-19 09:04
用户被禁言,该主题自动屏蔽!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-04-19 09:09
用户被禁言,该主题自动屏蔽!
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-04-19 09:21
用户被禁言,该主题自动屏蔽!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-04-19 09:58
用户被禁言,该主题自动屏蔽!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-19 10:19
访问缓冲区的三种方式:
在buffered方式中,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。而你的驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。
在direct方式中,I/O管理器锁定了包含用户模式缓冲区的物理内存页,并创建一个称为MDL(内存描述符表)的辅助数据结构来描述锁定页。因此你的驱动程序将使用MDL工作。
在neither方式中,I/O管理器仅简单地把用户模式的虚拟地址传递给你。而使用用户模式地址的驱动程序应十分小心。

去看看waltoney的那本书的第七章的第二节寻址数据缓冲区,那儿讲得很清楚,或许你会得到你想要的答案

[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-04-19 12:45
用户被禁言,该主题自动屏蔽!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-19 15:27
看你的情况,象是第三种,
我没有做过
你可以先将缓冲区锁定后,再试着改动。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
zhch111
驱动小牛
驱动小牛
  • 注册日期2002-02-04
  • 最后登录2003-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-19 15:39
你把那段代码贴出来,看你用的是什么方式,然后就可以提建议了嘛
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-04-19 16:11
用户被禁言,该主题自动屏蔽!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-19 17:14
你还是把你的那部分代码贴出来吧!这样比较好找错误!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-04-19 17:46
用户被禁言,该主题自动屏蔽!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-19 21:40
错误地方用???代表
你的偏移声明不对啊!因为偏移是LARGE_INTEGER类型的
filemonhookroutine(......)
{
  ...
  PCHAR pBuffer;
???  ULONG offset, Length;
  ...
  switch( currentIrpStack->MajorFunction ) {
    ...
    case IRP_MJ_WRITE:
    if(是我指定的目录)
    {
???      offset = currentIrpStack->Parameters.Read.ByteOffset;
      pBuffer= Irp->UserBuffer;
      pBuffer += offset.LowPart;
      Length = currentIrpStack->Parameters.Read.Length;
      if(pBuffer)
      {
        for(i=0;i<Length;i++)
        {
          *(pBuffer+i) = *(pBuffer+i)+2;
        }
      }
    }
    ...
  }
}
pBuffer里就是写文件的内容,写文件文件时没问题,其它的就不行了。
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-04-19 21:47
还有一个就是你访问的地方是缓冲区之外的了!我怎么看都看不懂
pBuffer= Irp->UserBuffer;
pBuffer += offset.LowPart;
Length = currentIrpStack->Parameters.Read.Length;
if(pBuffer)
{
     for(i=0;i<Length;i++)
     {
          *(pBuffer+i) = *(pBuffer+i)+2;
     }
}
你这么做到底干什么
上层传下来的缓冲区是由Irp->UserBuffer开始的!并且缓冲区长度是Length,而你修改的是缓冲区之后的东西,因为一般上面读写的文件长度很少用到高三十二位!除非上层一次分配的内存是大于2GB BYTE
就象这样的一段代码
CHAR DATABUFFER[512];
WRITEFILE();
结果经过了你的处理之后把上层应用程序的代码都改掉了,一般上面你这个代码要么引起应用程序的异常错误,要么就是蓝屏
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-04-19 21:51
还有就是你的这个代码不严格,因为你处理的是写,而使用的是读的结构
虽然在_IO_STACK_LOCATION结构里面这两个极其其他一些结构是一个联合
但是这样的代码不严格!
当你要拦截读的时候要使用到的是_IO_STACK_LOCATION里面的Parameters里面的Read结构的东西
而写的时候要使用到的是_IO_STACK_LOCATION里面的Parameters里面的Write结构的东西
建议你去看看DDK头文件里面的一些结构
一般上面都是在WDM。H或NTDDK。H里面
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-04-20 08:14
使用UserBuffer必须在调用者应用的线程环境中,只有你的驱动在最顶层并且使用处是在Dispatch例程中才能得到这个保证。
若你的程序满足以上条件,才是编程中出的错。
good luck
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2002-04-20 14:43
用户被禁言,该主题自动屏蔽!
游客

返回顶部