阅读:2688回复:18
请问如何在win2000下在IRP_MJ_READ 中得到 读去数据的内容?
请问如何在win2000下在IRP_MJ_READ 中得到 读去数据的内容?
|
|
沙发#
发布于:2003-01-15 15:44
MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority)
|
|
板凳#
发布于:2003-01-15 17:27
这个函数我试过,但一使用这个函数就自动重启计算机了!pIrp有什么限制?
if (Irp->MdlAddress) { str = (char*) MmGetSystemAddressForMdlSafe( Irp->MdlAddress,NormalPagePriority ); } 未遂! |
|
地板#
发布于:2003-01-15 17:35
不会吧?!
1. 估计你没有过滤一些不该处理的IRP(一般只处理Paging IO) 2. 或者有低级错误? 3. 要么就是获得buffer后做了一些不该做的事情,呵呵 4. 还有就是要等IRP 完成以后才能处理Buffer(必须有个Completion Routine) |
|
地下室#
发布于:2003-01-15 18:14
现在倒是不死机了,(为什么 i don\'t know!)但是我每次都把读出的数据和我文件头的一段数据进行比较,用softice调,读我的文件它却比较不正确,难道读出的数据不对?str读出的数据不是buffer吗?
|
|
5楼#
发布于:2003-01-15 20:44
真的很谢谢你!可能确实是你说的第四种情况(4. 还有就是要等IRP 完成以后才能处理Buffer(必须有个Completion Routine) )
请问如何在Completion Routine之后读去数据呢? |
|
6楼#
发布于:2003-01-15 22:10
faint...........,
处理: 读取的字节一定要用Irp->IoStatus.Information,用Parameters.Read.Length,你会出事的。 1.Irp->AssociatedIrp.SystemBuffer 2.Irp->MdlAddress 3.Irp->UserBuffer A.KernelMode处理 B.UserMode处理 我用上方面解决了.exe,doc,txt的读,但对chm,rar,TMD,解密后hh提示.chm被破坏,解.rar,rar提示也一样,可是可恶。coolice能指点我一下吗? |
|
7楼#
发布于:2003-01-15 22:15
上面我所提到的4种不处理,你会死的很难堪的。
多参考list.osr.com,你会得到答案的。 |
|
8楼#
发布于:2003-01-16 10:09
经vcmfc提醒,正确的应该这样写:
PVOID pUserBuffer = NULL; if (Irp->MdlAddress) { pUserBuffer = MmGetSystemAddressForMdlSafe( Irp->MdlAddress,NormalPagePriority ); } else { pUserBuffer = Irp->UserBuffer; } Irp->AssociatedIrp.SystemBuffer、KernelMode处理、UserMode处理 都不需要 Completion Routine的写法很多DDK的例子或文档都有,你可以搜索STATUS_MORE_PROCESSING_REQUIRED |
|
9楼#
发布于:2003-01-16 17:08
Irp->UserBuffer要分是不是kernelMode与UserMode的处理,否则会bugcheck的.
|
|
10楼#
发布于:2003-01-16 17:24
放心吧,我的驱动用了有两年了,很正常
|
|
11楼#
发布于:2003-01-16 22:06
不解,你的Irp->UserBuffer是不是一得到这个指针就可以进行Decrypt??
如: PVOID pBuffer = Irp->UserBuffer; Decrypt(pBuffer, nDecryptLen, pBuffer); ?????,我试试。 |
|
12楼#
发布于:2003-01-16 23:01
调试发现(IRP_MJ_READ例程):Irp->UserBuffer不能直接使用,否则出现bugcheck!!!
我不解coolice的这段代码的含义: pUserBuffer = Irp->UserBuffer; 得到这个pUserBuffer后,该如何处理处才能真正得到其数据指针并修改??????,希望coolice能说明一下吗? |
|
13楼#
发布于:2003-01-17 10:27
Coolice 说的方法我试了,确实可行!但不是在IRP_MJ_READ下使用,而是放在回调函数的结束前
|
|
14楼#
发布于:2003-01-17 10:37
忘说了,加个标识位进行判断。
不知道有没有更好的实现方法? |
|
15楼#
发布于:2003-01-17 16:06
你的意思是在完成例程里面???
|
|
16楼#
发布于:2003-01-17 16:09
IRP_MJ_READ:
我的做法是:先将操作传给file system,并给出完成例程,在完成例程中返回STATUS_MORE_PROCESSING_REQUIRED,这后再进行处理,结果发现如此时访问Irp->UserBuffer,bugchek. |
|
17楼#
发布于:2003-01-17 16:29
PVOID pUserBuffer = NULL;
if (Irp->MdlAddress) //使用判断 { pUserBuffer = MmGetSystemAddressForMdlSafe( Irp->MdlAddress,NormalPagePriority ); } else { pUserBuffer = Irp->UserBuffer; } |
|
18楼#
发布于:2003-01-18 11:15
TMD,写了N行的回复制,竟然失败,我faint........
我终于明白了为什么,不过还是要说: 如果你只处理pageio,你的Irp->MdlAddress大部分是非null,至少我目前测试是对了。 但pUserBuffer = Irp->UserBuffer;还是不可直接访问,不信你放过非pageio,当你的Irp->UserBuffer为真是,你就知道会不会bugchek,因为它们属于不同的地址空间。 sijun说的是对了,我现在终于明白了,看了自已是太笨了。 |
|