bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
阅读:1105回复:3

构造Irp读文件,为什么得不到数据?请大家帮我分析分析

楼主#
更多 发布于:2007-12-11 09:39
下面是我根据某大牛的代码改写的构造irp读文件,在调试跟踪到IoCallDriver()后,程序进入pending状态,该状态结束之后的stat不成功,无读数据。请大家帮我分析分析。wowocock老牛也赶快献身救我!

NTSTATUS RRead(WCHAR* name,char *buffer)
{
    PFILE_OBJECT fileob;
    HANDLE handle;
    PIRP irp;
    KEVENT event;
    NTSTATUS stat;
    PMDL mdl;
    ULONG  count;
    FSRTL_COMMON_FCB_HEADER* pFCBH;
    PIO_STACK_LOCATION  irpsp;
    IO_STATUS_BLOCK ioStatus;
    
    //文件打开没问题
    handle = openfile(name,FILE_READ_ATTRIBUTES,FILE_SHARE_READ);
    if(handle == 0)
        {
           return STATUS_UNSUCCESSFUL;
        }
     ObReferenceObjectByHandle(handle,GENERIC_READ,*IoFileObjectType,KernelMode,(PVOID*)&fileob,0);
    pFCBH = (FSRTL_COMMON_FCB_HEADER*)fileob->FsContext;
    count = (pFCBH->FileSize).LowPart;
    irp = IoAllocateIrp(fileob->DeviceObject->StackSize, TRUE);
    
       if(fileob->DeviceObject->Flags & DO_BUFFERED_IO)
       {
           irp->AssociatedIrp.SystemBuffer=buffer;//buffered
       }
       else if(fileob->DeviceObject->Flags & DO_DIRECT_IO)
       {
           mdl=IoAllocateMdl(buffer,count,0,0,0);
           MmBuildMdlForNonPagedPool(mdl);
           irp->MdlAddress=mdl;//direct
       }
       else
       {
           irp->UserBuffer=buffer;//neither i/o, use kernel buffer
       }
    
       irpsp = IoGetNextIrpStackLocation(irp);
       irpsp->FileObject=fileob;
       irpsp->MajorFunction=IRP_MJ_READ;
       irpsp->MinorFunction=IRP_MN_NORMAL;
       irpsp->Parameters.Read.ByteOffset.QuadPart=0;
       irpsp->Parameters.Read.Key=0;
       irpsp->Parameters.Read.Length=count;

       KeInitializeEvent(&event,NotificationEvent,FALSE);
       IoSetCompletionRoutine(irp,IoCompletion,&event,1,1,1);

       stat=IoCallDriver(fileob->DeviceObject,irp);
       if(stat==STATUS_PENDING)//程序为pending状态
       {
           KeWaitForSingleObject(&event, Executive,KernelMode,FALSE,NULL);
           stat=irp->IoStatus.Status;
       }
       if(!NT_SUCCESS(stat))//跟踪调试到此不成功
       {
           IoFreeIrp(irp);
        ObDereferenceObject(fileob);
           if(mdl){IoFreeMdl(mdl);}//if DO_DIRECT_IO
           return -1;
       }
       stat=irp->IoStatus.Information;//bytes read
       IoFreeIrp(irp);
       ObDereferenceObject(fileob);
       if(mdl){IoFreeMdl(mdl);}//if DO_DIRECT_IO
       return stat;

    
    
}
实用信息:www.infozobo.com
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-12-11 12:25
IRP信息不全,比如
irpsp->DeviceObject
Irp->Flags = IRP_READ_OPERATION;
.....................
等等都没有设置
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
板凳#
发布于:2007-12-11 13:02
status 是多少?
商务MSN:YanDong_8212@163.com
bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-11 13:40
coolw兄弟说得对,我没有取得fileob的设备,所以没有成功。经过修改后我把设备对象赋给了irpsp就可以了。

谢谢coolw!谢谢大家!
实用信息:www.infozobo.com
游客

返回顶部