阅读:2258回复:18
irp->userbuffer的内容怎么改呀?用户被禁言,该主题自动屏蔽! |
|
最新喜欢:ljmmar... |
沙发#
发布于:2002-04-19 00:29
没错啊!Length里面的就是长度
为什么蓝屏我就不知道了!因为你的程序我不知道!不过你要清楚的是当前运行的IRQL和你访问的那部分内存到底是不是分页内存!以及你要保证irp->userbuffer不为空,还有就是这个你要保证确定是数据的缓冲区,还有就是要看你的这个设备设置到底是以DO_DIRECT还是DO_BUFFER方式 因为这两个方式确定了数据缓冲区的指针会放在不同的地方 |
|
板凳#
发布于:2002-04-19 01:22
是不是在改动前后还要做什么?直接改会兰屏。 不是什么时候改都会出错的吧,上回一个程序我就是直接通过写UserBuffer给应用程序数据的,(当然本来是用Irp->AssociatedIrp->SystemBuffer的),发现很正常。估计是由于我 的那个Driver位于Toppest Layer,运行在App Context中。 你是用Filemon的吧,过虑的,Context不一定能行。但是记得我也直接在调试时Softice中改了,没事。 第二个问题,我也觉得怪,为什么这么大呢,好不容易跟踪到一个小的,(打开一个文本文件,4字节),而且就是直接改了UserBuffer,结果还真改了。 哥们,做的东西差不多呀!! |
|
|
地板#
发布于:2002-04-19 09:04
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-04-19 09:09
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2002-04-19 09:21
用户被禁言,该主题自动屏蔽! |
|
6楼#
发布于:2002-04-19 09:58
用户被禁言,该主题自动屏蔽! |
|
7楼#
发布于:2002-04-19 10:19
访问缓冲区的三种方式:
在buffered方式中,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。而你的驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。 在direct方式中,I/O管理器锁定了包含用户模式缓冲区的物理内存页,并创建一个称为MDL(内存描述符表)的辅助数据结构来描述锁定页。因此你的驱动程序将使用MDL工作。 在neither方式中,I/O管理器仅简单地把用户模式的虚拟地址传递给你。而使用用户模式地址的驱动程序应十分小心。 去看看waltoney的那本书的第七章的第二节寻址数据缓冲区,那儿讲得很清楚,或许你会得到你想要的答案 |
|
|
8楼#
发布于:2002-04-19 12:45
用户被禁言,该主题自动屏蔽! |
|
9楼#
发布于:2002-04-19 15:27
看你的情况,象是第三种,
我没有做过 你可以先将缓冲区锁定后,再试着改动。 |
|
|
10楼#
发布于:2002-04-19 15:39
你把那段代码贴出来,看你用的是什么方式,然后就可以提建议了嘛
|
|
11楼#
发布于:2002-04-19 16:11
用户被禁言,该主题自动屏蔽! |
|
12楼#
发布于:2002-04-19 17:14
你还是把你的那部分代码贴出来吧!这样比较好找错误!
|
|
13楼#
发布于:2002-04-19 17:46
用户被禁言,该主题自动屏蔽! |
|
14楼#
发布于:2002-04-19 21:40
错误地方用???代表
你的偏移声明不对啊!因为偏移是LARGE_INTEGER类型的 filemonhookroutine(......) |
|
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(); 结果经过了你的处理之后把上层应用程序的代码都改掉了,一般上面你这个代码要么引起应用程序的异常错误,要么就是蓝屏 |
|
16楼#
发布于:2002-04-19 21:51
还有就是你的这个代码不严格,因为你处理的是写,而使用的是读的结构
虽然在_IO_STACK_LOCATION结构里面这两个极其其他一些结构是一个联合 但是这样的代码不严格! 当你要拦截读的时候要使用到的是_IO_STACK_LOCATION里面的Parameters里面的Read结构的东西 而写的时候要使用到的是_IO_STACK_LOCATION里面的Parameters里面的Write结构的东西 建议你去看看DDK头文件里面的一些结构 一般上面都是在WDM。H或NTDDK。H里面 |
|
17楼#
发布于:2002-04-20 08:14
使用UserBuffer必须在调用者应用的线程环境中,只有你的驱动在最顶层并且使用处是在Dispatch例程中才能得到这个保证。
若你的程序满足以上条件,才是编程中出的错。 good luck |
|
18楼#
发布于:2002-04-20 14:43
用户被禁言,该主题自动屏蔽! |
|