rong1028
驱动牛犊
驱动牛犊
  • 注册日期2008-04-29
  • 最后登录2018-04-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望62点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1439回复:3

在 IRP_MJ_CREATE 读档出问题

楼主#
更多 发布于:2008-08-08 11:10
各位大牛
小弟想在IRP_MJ_CREATE中透过自定义IRP去读档,可是读到的资料都是空的
我的程序代码如下
NTSTATUS
IoCompletionRoutine(
    IN PDEVICE_OBJECT  DeviceObject,
    IN PIRP  Irp,
    IN PVOID  Context
    )
{
    DbgPrint(("IoCompletionRoutine!\n"));
    *Irp->UserIosb = Irp->IoStatus;

    if (Irp->UserEvent)
        KeSetEvent(Irp->UserEvent, IO_NO_INCREMENT, 0);

    if (Irp->MdlAddress)
    {
        IoFreeMdl(Irp->MdlAddress);
        Irp->MdlAddress = NULL;
    }

    IoFreeIrp(Irp);

    return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS
IrpFileRead(
    IN PFILE_OBJECT FileObject,
    IN PLARGE_INTEGER ByteOffset OPTIONAL,
    IN ULONG Length,
    OUT PVOID Buffer,
    OUT PIO_STATUS_BLOCK IoStatusBlock
    )
{
    NTSTATUS status;
    KEVENT event;
    PIRP irp;
    PIO_STACK_LOCATION irpSp;
    PDEVICE_OBJECT deviceObject;

    if (ByteOffset == NULL)
    {
        if (!(FileObject->Flags & FO_SYNCHRONOUS_IO))
            return STATUS_INVALID_PARAMETER;

        ByteOffset = &FileObject->CurrentByteOffset;
    }

    if (FileObject->Vpb == 0 || FileObject->Vpb->RealDevice == NULL)
        return STATUS_UNSUCCESSFUL;

    deviceObject = FileObject->Vpb->DeviceObject;
    irp = IoAllocateIrp(deviceObject->StackSize, FALSE);

    if (irp == NULL)
        return STATUS_INSUFFICIENT_RESOURCES;

    irp->MdlAddress = IoAllocateMdl(Buffer, Length, FALSE, TRUE, NULL);

    if (irp->MdlAddress == NULL)
    {
        IoFreeIrp(irp);
        return STATUS_INSUFFICIENT_RESOURCES;;
    }

    MmBuildMdlForNonPagedPool(irp->MdlAddress);

    irp->Flags = IRP_READ_OPERATION;
    irp->RequestorMode = KernelMode;
    irp->UserIosb = IoStatusBlock;
    irp->UserEvent = &event;
    irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();
    irp->Tail.Overlay.OriginalFileObject = FileObject;

    irpSp = IoGetNextIrpStackLocation(irp);
    irpSp->MajorFunction = IRP_MJ_READ;
    irpSp->MinorFunction = IRP_MN_NORMAL;
    irpSp->DeviceObject = deviceObject;
    irpSp->FileObject = FileObject;
    irpSp->Parameters.Read.Length = Length;
    irpSp->Parameters.Read.ByteOffset = *ByteOffset;

    KeInitializeEvent(&event, SynchronizationEvent, FALSE);
    IoSetCompletionRoutine(irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE);
    status = IoCallDriver(deviceObject, irp);

    if (status == STATUS_PENDING)
        status = KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);

    return status;
}

NTSTATUS
SpyCreate(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
)
{
    PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
PFILE_OBJECT FileObject = IrpSp->FileObject;
PVOID ReadBuffer;
    IO_STATUS_BLCOK iosb;
… 
If(MyFile){
    ReadBuffer = ExAllocatePoolWithTag(NonPagedPool, 8, FALSE, TRUE, 0);
    If(!ReadBuffer) 
        Return STATUS_INSUFFICIENT_RESOURCES;
    IrpFileRead(FileObject, 0 ,8 ,ReadBuffer , &iosb);
    DbgPrint(“Data:%s”,(PUCHAR)ReadBuffer) ; // 这里印出来变成 Data: 后面没有值
....
}
    
}

请问我哪里少做,或是做错了? 请各位前辈指教
似乎都没有进去IoCompletionRoutine的样子
rong1028
驱动牛犊
驱动牛犊
  • 注册日期2008-04-29
  • 最后登录2018-04-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望62点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-08-09 21:59
问题解决了! 要先PreCreate
然后在PreCreate 读就可以了
chrysanth
驱动牛犊
驱动牛犊
  • 注册日期2007-05-02
  • 最后登录2010-02-02
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望129点
  • 贡献值0点
  • 好评度61点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-10-22 11:52
引用第1楼rong1028于2008-08-09 21:59发表的  :
问题解决了! 要先PreCreate
然后在PreCreate 读就可以了



PreCreate 什么意思呢,不太懂??
chrysanth
驱动牛犊
驱动牛犊
  • 注册日期2007-05-02
  • 最后登录2010-02-02
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望129点
  • 贡献值0点
  • 好评度61点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-10-25 23:31
那位大哥能解释下什么意思的么 ?
游客

返回顶部