首页
社区
课程
招聘
[讨论]IoSkipCurrentIrpStackLocation IoCopyCurrentIrpStackLocationToNext
发表于: 2014-9-2 18:21 5058

[讨论]IoSkipCurrentIrpStackLocation IoCopyCurrentIrpStackLocationToNext

2014-9-2 18:21
5058
今天和一个一起初学内核的朋友讲这部分东西,感觉自己也不是特别清楚,故来看雪,希望我讲的有错,大家提出来。
首先想要讲清楚,IoSkipCurrentIrpStackLocation,IoCopyCurrentIrpStackLocationToNext这些,我想先大概说下IRP这个结构
和这几个函数有关的是,IRP有两个成员: CurrentLocation ,CurrentStackLocation
char CurrentLocation :当前I/O堆栈单元的索引。
struct _IO_STACK_LOCATION *CurrentStackLocation: 指向这个I/O堆栈单元的指针。
I/O堆栈: 同样是IRP的一个成员,是个IO_STACK_LOCATION类型的数组。存储了要处理这个IRP的设备的xx。//不清楚这里说设备,还是说设备驱动,还是说驱动程序。我感觉可能是驱动程序,因为我们的回调函数同样是存储在这个I/O设备栈中。

目前我真正开始学内核,大概一周,以前学过半个月但是步子太大,扯到蛋了,决定一步步来。
初学的时候经常遇到这样的代码:
IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(pDeviceObj, Irp);
关于IoSkipCurrentIrpStackLocation,网上就是这样解释,调用后CurrentStackLocation加1,再调用IoCallDriver令CurrentStackLocation减一,这样Irp传递给下一层驱动后,CurrentStackLocation还是当前正在用的IO_STACK_LOCATION,使用的是同一个IO_STACK_LOCATION。
查了下帮助文档, If you call IoSkipCurrentIrpStackLocation before calling IoCallDriver, the next-lower driver receives the same IO_STACK_LOCATION that your driver received.
翻译过来,就是这伙计的目的就是修改 IO_STACK_LOCATION array pointer,我想应该是修改CurrentStackLocation成员。

当我写另外一个程序,通过绑定过滤设备的形式,拦截键盘输入的时候,编写DispatchRead的时候。
有这样的代码:
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine(Irp,ReadComplete,pDeviceObj,TRUE,TRUE,TRUE); //设置完成例程。
return IoCallDriver(devExt->pLowerDeviceObject,Irp);
继续看IoSkipCurrentIrpStackLocation的帮助文档
If you intend to provide an IoCompletion routine for the IRP, your driver should call IoCopyCurrentIrpStackLocationToNext instead of IoSkipCurrentIrpStackLocation.
//如果你想要提供一个完成例程给这个IRP,就应该调用IoCopyCurrentIrpStackLocationToNext代替IoSkipCurrentIrpStackLocation。
继续。。。
If a badly written driver makes the mistake of calling IoSkipCurrentIrpStackLocation and then setting a completion routine, this driver might overwrite a completion routine set by the driver below it.
//如果你很2的IoSkipCurrentIrpStackLocation并设置完成例程,在下一层驱动,可能会重写这个完成例程,但是如果IoSkipCurrentIrpStackLocation+IoCallDriver组合的话一直用的是同一个IO_STACK_LOCATION。

IoCopyCurrentIrpStackLocationToNext:
copies the IRP stack parameters from the current I/O stack location to the stack location of the next-lower driver
//拷贝当前IRP CurrentLocation对应的I/O栈中的参数,到下一层。
这个参数,具体是IO_STACK_LOCATION结构体中的Parameters成员,还是?所有的成员都复制,求解释下。
这里并没有操作CurrentStackLocation。
紧接着调用IoCallDriver才把将CurrentStackLocation减1,这样正好Irp传递到下一层驱动的时候,Irp的CurrentStackLocation正好指向复制之后的那个IO_STACK_LOCATION.

之所以上面IoSkipCurrentIrpStackLocation ,IoCallDriver这样配套,原因也很显然,直接修改一个成员就能达到效果,何乐而不为,更高效,有效。
主要是有些细节,我自己不明白,希望大家指出我的内容中的错误

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//