joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
阅读:1411回复:4

自己创建的IRP也会重入吗?

楼主#
更多 发布于:2005-03-18 09:43
研究了以下前面的关于IRP重入的帖子,关于重入的问题已经讨论很多了,避免的 方法就是自己构造IRP,call 下层驱动,今天自己创建了一个读IRP,可是调试的 时候发现这个读请求被我自己的ReadDispatch处理了,请问各位大虾怎么回事?
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-18 12:22
怎么构造的IRP把代码发上来,理论上自己构造IRP包然后发给底层驱动是不可能重入的。一定是你在什么地方出了问题。
Ideas for life!
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-21 09:47
    irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

    if (!irp) {

        //
        // Failure!
        //
        return FALSE;
    }

    //
    // Build the IRP\'s main body
    //  
    irp->UserEvent = &event;
    irp->UserIosb = &IoStatusBlock;
    irp->Tail.Overlay.Thread = PsGetCurrentThread();
    irp->Tail.Overlay.OriginalFileObject = FileObject;
    irp->Tail.Overlay.AuxiliaryBuffer = (PVOID) NULL;
    irp->RequestorMode = ExGetPreviousMode();
    irp->PendingReturned = FALSE;
    irp->Cancel = FALSE;
    irp->CancelRoutine = (PDRIVER_CANCEL) NULL;

    //
    // Set up the I/O stack location.
    //
    irpSp = IoGetNextIrpStackLocation(irp);
    irpSp->MajorFunction = MajorFunction;
    irpSp->DeviceObject = DeviceObject;
    irpSp->FileObject = FileObject;

    //在这里将我自己创建的缓冲区交给IRP
    if(直接IO)
       //创建MDL,将FileBuffer作为MDL的buffer

    else
       //irp->UserBuffer = FileBuffer;

    //
    // Set the completion routine.
    //
    IoSetCompletionRoutine(irp, ReadFileCompleted, 0, TRUE, TRUE, TRUE);

    //
    // Send it to the FSD
    //
    (void) IoCallDriver(DeviceObject, irp);

    //
    // Wait for the I/O
    //
    KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);

读取文件是正确的,但是用filemon仍然能够看到我自己发的IRP_MJ_READ,请问这是怎么回事儿呢,自己向下层文件系统驱动程序发送的IRP应该不会被filemon拦截到吧,请各位大虾指教。
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-21 10:30
你的代码太少,提示的信息也不清楚,例如DeviceObject指向的是哪个设备对象??等等。
Ideas for life!
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-21 12:19
BOOLEAN
CreateIRPAndReadFile(
PDEVICE_OBJECT DeviceObject,
PFILE_OBJECT FileObject,
PVOID FileQueryBuffer,
ULONG FileQueryBufferLength
){
//这就是我上面贴的代码
}

调用:
//FileBufferSize为一个特定长度,例如512字节
//FileBuffer为文件缓冲区,负责存放读出的数据
FileBuffer = ExAllocatePool(NonPagedPool, FileBufferSize);

//hookExt就是filemon创建的设备对象的扩展,它指向的FileSystem应该是hook的下层文件系统设备对象吧。
Success = CreateIRPAndReadFile(
hookExt->FileSystem,
fileObject,
FileBuffer,
FileBufferSize);
if(!Success){
ExFreePool(FileBuffer);
return CompleteRequest(Irp, Irp->IoStatus.Status, Irp->IoStatus.Information);
}
游客

返回顶部