首页
社区
课程
招聘
[求助]寒江独钓中的一个问题
发表于: 2009-11-15 12:46 5141

[求助]寒江独钓中的一个问题

2009-11-15 12:46
5141
寒江独钓p49中间有这样一段话:
    这种处理最简单。首先调用IoSkipCurrentIrpStackLocation“跳过当前栈空间”:然后调用IoCallDriver把这个请求发送给真实的设备。

    注意加引号的那句话,通过查wdm.h:
FORCEINLINE
VOID
IoSkipCurrentIrpStackLocation (
    __inout PIRP Irp
)
/*--
Routine Description:

    This routine is invoked to increment the current stack location of
    a given IRP.

    If the caller wishes to call the next driver in a stack, and does not
    wish to change the arguments, nor does he wish to set a completion
    routine, then the caller first calls IoSkipCurrentIrpStackLocation
    and the calls IoCallDriver.

Arguments:

    Irp - Pointer to the I/O Request Packet.

Return Value:

    None
--*/
{
    ASSERT(Irp->CurrentLocation <= Irp->StackCount);
    Irp->CurrentLocation++;
    Irp->Tail.Overlay.CurrentStackLocation++;
}

可以知道skip是让CurrentStackLocation向上跳的,再调用IoCallDriver时,又会使其下跳一个的,所以两个设备驱动使用的当前栈空间是一个,不是说一个驱动对应一个栈空间吗?怎么他们用一个?作者的说法是不是有点欠妥?

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
没有错,正常是一人一个的,但是如果我确实用不到,让下层的设备使用也没什么问题,只要保证IoStackLocation中的参数正确且栈空间够用就可以了,下层的设备感觉不到差别
2009-11-15 13:28
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
因为当前设备通常只和它上层设备的IrpStack打交道,需要把Irp往下传的时候才会和它下层设备IrpStack打交道,就是说只和它的直接上下级相关,不能越权。这样,不管你是SkipCurrentIrpStackLocation,还是CopyCurrentToNextIrpStack,下层设备所看到的内容都是一样的,没有区别,只是省了一个栈空间
2009-11-15 13:36
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上高手的回答,感觉豁然开朗
2009-11-15 14:10
0
雪    币: 202
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
学习下,问下楼主。学这个驱动要看那本书入门比较好。
2009-11-17 21:25
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我用的是《寒江独钓》,感觉还是比较容易上手的。《驱动开发技术详解》也挺不错的。另外只看《寒江》是远远不够的,《寒江》只是引路,要多搜索网络,最还要有《驱动模型》那本书。另外,一定的汇编和硬件知识不可缺。
2009-11-18 17:35
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
那SkipCurrentIrpStackLocation和CopyCurrentToNextIrpStack的区别就是少了个栈空间?
2009-11-18 22:06
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也觉得是。用skilp的话,可能传到最后这个location还不是0

不过如果用到完成例程的话,就只能用copy了
2009-11-18 23:53
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
CurrentLocation不会为0的吧,最小为1!
2009-11-19 09:10
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
achillis的回复:“不管你是SkipCurrentIrpStackLocation,还是CopyCurrentToNextIrpStack,下层设备所看到的内容都是一样的,没有区别,只是省了一个栈空间”

受益了~:)谢谢。
2009-12-3 13:42
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
张帆那本书的21,22章,写得还是挺详细。
2009-12-3 14:20
0
游客
登录 | 注册 方可回帖
返回
//