首页
社区
课程
招聘
[讨论]求解IoAllocateIrp()中Stack之谜
发表于: 2010-4-1 12:03 7774

[讨论]求解IoAllocateIrp()中Stack之谜

2010-4-1 12:03
7774
在使用IoAllocateIrp()创建IRP时,有个有趣的东西:

Irp = IoAllocateIrp (DeviceObject->StackSize, FALSE);

.....

stackPtr = IoGetNextIrpStackLocation(Irp)

stackPtr->MajorFunction = IRP_MJ_READ;

......

IoCallDriver (DeviceObject, Irp);

IoAllocateIrp创建了IO_STACK_LOCATION[DeviceObject->StackSize]数组.在发送IRP之前,由于使用了IoGetNextIrpStackLocation(Irp),那么DeviceObject 使用IoGetCurrentStackLocation的获得的Stack实际上是IO_STACK_LOCATION[DeviceObject->StackSize - 2](向下错移了一个单元),最底层的设备对象的stack对应成IO_STACK_LOCATION[-1],是不是很荒谬.这里的理解肯定是错啦,但错哪了。。

驱动详解根本没提这等咚咚

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
iocalldriver内部会先下移一个单位irpsp
2010-4-1 17:16
0
雪    币: 75
活跃值: (688)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
楼上所言极是
算了,没多少人感兴趣,终结此帖

红色部分是此问题关键所在
IoAllocateIrp(IN CCHAR StackSize,
              IN BOOLEAN ChargeQuota)
{
  ....
  IoInitializeIrp(Irp, Size, StackSize);

IoInitializeIrp(IN PIRP Irp,
                IN USHORT PacketSize,
                IN CCHAR StackSize)
{
    /* Clear it */
    IOTRACE(IO_IRP_DEBUG,
            "%s - Initializing IRP %p\n",
            __FUNCTION__,
            Irp);
    RtlZeroMemory(Irp, PacketSize);

    /* Set the Header and other data */
    Irp->Type = IO_TYPE_IRP;
    Irp->Size = PacketSize;
    Irp->StackCount = StackSize;
    [COLOR="Red"]Irp->CurrentLocation = StackSize + 1[/COLOR];

IofCallDriver(IN PDEVICE_OBJECT DeviceObject,
              IN PIRP Irp)
{
    PDRIVER_OBJECT DriverObject;
    PIO_STACK_LOCATION StackPtr;
    DriverObject = DeviceObject->DriverObject;
    Irp->CurrentLocation--;
2010-4-1 19:20
0
游客
登录 | 注册 方可回帖
返回
//