wyhero
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2016-02-02
  • 粉丝0
  • 关注0
  • 积分67分
  • 威望563点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
阅读:2378回复:9

irp写文件的错误

楼主#
更多 发布于:2010-08-04 17:37
各位老大,我用http://bbs.driverdevelop.com/read.php?tid-110036-page-1.html中irpWriteFile测试了一下自己发IRP写文件,发现如果写的数据大于512,则报错,如果循环写的话,第一次写512可以成功,第二次就报错,错误代码:STATUS_FILE_LOCK_CONFICT。各位老大帮忙看看是什么问题?

我把代码贴上:
NTSTATUS
IoCompletionRoutine(
                    IN PDEVICE_OBJECT DeviceObject,
                    IN PIRP Irp,
                    IN PVOID Context)
{
    *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
IrpWriteFile(
             IN PFILE_OBJECT  FileObject,
             OUT PIO_STATUS_BLOCK  IoStatusBlock,
             IN PVOID  Buffer,
             IN ULONG  Length,
             IN PLARGE_INTEGER  ByteOffset  OPTIONAL)
{
    NTSTATUS ntStatus;
    PIRP Irp;
    KEVENT kEvent;
    PIO_STACK_LOCATION IrpSp;

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

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

    Irp = IoAllocateIrp(FileObject->Vpb->DeviceObject->StackSize, FALSE);
    if (Irp == NULL) return STATUS_INSUFFICIENT_RESOURCES;

    if(FileObject->DeviceObject->Flags & DO_BUFFERED_IO)
    {
        Irp->AssociatedIrp.SystemBuffer = Buffer;
    }
    else
    {
        Irp->MdlAddress = IoAllocateMdl(Buffer, Length, 0, 0, 0);
        if (Irp->MdlAddress == NULL)
        {
            IoFreeIrp(Irp);
            return STATUS_INSUFFICIENT_RESOURCES;
        }
        MmBuildMdlForNonPagedPool(Irp->MdlAddress);
    }

    KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE);

    Irp->UserEvent = &kEvent;
    Irp->UserIosb = IoStatusBlock;
    Irp->RequestorMode = KernelMode;
    Irp->Flags = IRP_WRITE_OPERATION;
    Irp->Tail.Overlay.Thread = PsGetCurrentThread();
    Irp->Tail.Overlay.OriginalFileObject = FileObject;

    IrpSp = IoGetNextIrpStackLocation(Irp);
    IrpSp->MajorFunction = IRP_MJ_WRITE;
    IrpSp->MinorFunction = IRP_MN_NORMAL;
    IrpSp->DeviceObject = FileObject->Vpb->DeviceObject;
    IrpSp->FileObject = FileObject;
    IrpSp->Parameters.Write.Length = Length;
    IrpSp->Parameters.Write.ByteOffset = *ByteOffset;

    IoSetCompletionRoutine(Irp, IoCompletionRoutine, NULL, TRUE, TRUE, TRUE);
    ntStatus = IoCallDriver(FileObject->Vpb->DeviceObject, Irp);

    if (ntStatus == STATUS_PENDING)
        KeWaitForSingleObject(&kEvent, Executive, KernelMode, TRUE, NULL);

    return IoStatusBlock->Status;
}

请各位老大指点一下,本人太菜,发现不了问题所在呀
MicroMath
驱动牛犊
驱动牛犊
  • 注册日期2008-01-22
  • 最后登录2013-07-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望169点
  • 贡献值2点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-08-04 19:23
我的就没问题, 你看看你的creat是不是有问题
wyhero
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2016-02-02
  • 粉丝0
  • 关注0
  • 积分67分
  • 威望563点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-08-04 21:20
引用第1楼MicroMath于2010-08-04 19:23发表的  :
我的就没问题, 你看看你的creat是不是有问题


我的create函数如下:

NTSTATUS fuCreateFile(__in PUNICODE_STRING fileName,
                      __in PDEVICE_OBJECT deviceObject,
                      __in PFILE_OBJECT refFileObject,
                      __out PHANDLE  * handle,
                      __out PFILE_OBJECT * pFileObject)
{

    NTSTATUS status;
    OBJECT_ATTRIBUTES attributes ;
    IO_STATUS_BLOCK   iosb;
    PFILE_OBJECT pvfileObject = NULL;
    UNICODE_STRING backupTest = RTL_CONSTANT_STRING(L"\\??\\E:\\backupText.txt");
    HANDLE tmpHandle ;
    InitializeObjectAttributes(
        &attributes,
        &backupTest,
        OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
        NULL,
        NULL );

    status = IoCreateFileSpecifyDeviceObjectHint(
        &tmpHandle,    // File Handle
        GENERIC_READ|GENERIC_WRITE| SYNCHRONIZE ,    // Desired Access
        &attributes,    // Attributes
        &iosb,        // IO Status Block
        NULL,        // Allocation size
        FILE_ATTRIBUTE_NORMAL,  // File attributes
        FILE_SHARE_READ|FILE_SHARE_WRITE, //ShareAccess
        FILE_OPEN_IF,           // Create disposition
        FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT ,    // Create options
        NULL,                   // EA buffer
        0,                      // EA size
        CreateFileTypeNone,     // CreateFileType
        NULL,                   // Extra create parameters
        0,                      // Options
        deviceObject  // Device object to use for open
        );

    if (status == STATUS_INVALID_DEVICE_OBJECT_PARAMETER  ||
        status == STATUS_MOUNT_POINT_NOT_RESOLVED ||
        status == STATUS_OBJECT_PATH_SYNTAX_BAD )
    {
        KdPrint(("%wZ",。。。。)); //错误信息
        return status;
    }

    status = ObReferenceObjectByHandle(tmpHandle,
        GENERIC_READ|GENERIC_WRITE,
        NULL,
        KernelMode,
        &pvfileObject,
        NULL);
    if (!NT_SUCCESS(status))
    {
        ZwClose(handle);
        return status;
    }

    *pFileObject = (PFILE_OBJECT)pvfileObject;
    *handle = (PHANDLE)(&tmpHandle);

    return status;

}

我打开的文件deviceobject和测试文件在同一个盘上。
帮我看看生成函数有什么问题吗?
我是在IRP_MJ_WRITE中生成的,生成时判断该文件是否已经生成过,否则调用该创建函数创建文件,获取fileobject,将测试文件的内容写到生成的文件中,有什么问题吗?
wyhero
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2016-02-02
  • 粉丝0
  • 关注0
  • 积分67分
  • 威望563点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-08-04 21:24
写少于512的数据,可以正常生成文件并保存,但就是大于512时有问题了
wyhero
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2016-02-02
  • 粉丝0
  • 关注0
  • 积分67分
  • 威望563点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-08-05 09:09
大家帮忙呀,给点建议
wanghui219
禁止发言
禁止发言
  • 注册日期2007-08-28
  • 最后登录2019-07-29
  • 粉丝4
  • 关注3
  • 积分101166分
  • 威望505351点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分4分
  • 社区居民
5楼#
发布于:2010-08-05 09:24
用户被禁言,该主题自动屏蔽!
wyhero
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2016-02-02
  • 粉丝0
  • 关注0
  • 积分67分
  • 威望563点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-08-05 16:14
wanghui219,谢谢了,不报错了,能讲讲原因吗?但是文件对象中的当前偏移值CurrentByteOffset不自动修改了,为什么?
wyhero
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2016-02-02
  • 粉丝0
  • 关注0
  • 积分67分
  • 威望563点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-08-06 12:42
继续求助
wanghui219
禁止发言
禁止发言
  • 注册日期2007-08-28
  • 最后登录2019-07-29
  • 粉丝4
  • 关注3
  • 积分101166分
  • 威望505351点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分4分
  • 社区居民
8楼#
发布于:2010-08-06 13:25
用户被禁言,该主题自动屏蔽!
wyhero
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2016-02-02
  • 粉丝0
  • 关注0
  • 积分67分
  • 威望563点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2010-08-06 16:39
谢谢wanghui219!
游客

返回顶部