iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
阅读:1990回复:11

请教:发送IRP创建文件夹的问题( 参考IRP文件操作接口的终极实现)

楼主#
更多 发布于:2008-04-10 11:07
我想在驱动中创建一个文件夹,参考IRP文件操作接口的终极实现里面的代码,但是创建不成功,错误码为C000000D,请大家帮我看看

                    PDEVICE_OBJECT lpDeviceObject;
                    PDEVICE_OBJECT lpRealDevice;
                    UNICODE_STRING Filename;
                    RtlInitUnicodeString(&Filename, L"D:\\user11\\");

                    if (GetDriveObject('D', &lpDeviceObject, &lpRealDevice))
                    {
                        ntstatus = FileCreate(&Filename,  
                                               FILE_LIST_DIRECTORY | SYNCHRONIZE,  
                                               FILE_ATTRIBUTE_NORMAL,
                                               FILE_SHARE_READ | FILE_SHARE_WRITE,
                                               FILE_CREATE,
                                               FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
                                               lpDeviceObject,
                                               lpRealDevice
                                   /*lpFilebOject*/);
                    }





BOOL GetDriveObject(IN DWORD DriveNumber,
                              OUT PDEVICE_OBJECT *DeviceObject,
                              OUT PDEVICE_OBJECT *ReadDevice
                             )
{
    WCHAR driveName[] = L"\\DosDevices\\A:\\";
    UNICODE_STRING deviceName;
    HANDLE deviceHandle;
    OBJECT_ATTRIBUTES objectAttributes;
    IO_STATUS_BLOCK    ioStatus;
    PFILE_OBJECT fileObject;
    NTSTATUS status;

    if (DriveNumber >= 'A' && DriveNumber <= 'Z')
    {
        driveName[12] = (CHAR)DriveNumber;
    }
    else if (DriveNumber >= 'a' && DriveNumber <= 'z')
    {
        driveName[12] = (CHAR)DriveNumber - 'a' + 'A';
    }
    else
    {
        return FALSE;
    }

    RtlInitUnicodeString(&deviceName, driveName);

    InitializeObjectAttributes(    &objectAttributes,
        &deviceName,
        OBJ_CASE_INSENSITIVE,
        NULL,
        NULL);

    status = IoCreateFile(    &deviceHandle,
        SYNCHRONIZE | FILE_ANY_ACCESS,
        &objectAttributes,
        &ioStatus,
        NULL,
        0,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        FILE_OPEN,
        FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE,
        NULL,
        0,
        CreateFileTypeNone,
        NULL,
        0x100);

    if (!NT_SUCCESS(status))
    {
        KdPrint(("Could not open drive %c: %x\n", DriveNumber, status));
        return FALSE;
    }

    status = ObReferenceObjectByHandle(    deviceHandle,
        FILE_READ_DATA,
        *IoFileObjectType,
        KernelMode,
        (PVOID*)&fileObject,
        NULL);

    if (!NT_SUCCESS(status))
    {
        KdPrint(("Could not get fileobject from handle: %c\n", DriveNumber));
        ZwClose(deviceHandle);
        return FALSE;
    }

    if (fileObject->Vpb == 0 || fileObject->Vpb->RealDevice == NULL)
    {
        ObDereferenceObject(fileObject);
        ZwClose(deviceHandle);
        return FALSE;
    }

    *DeviceObject = fileObject->Vpb->DeviceObject;
    *ReadDevice = fileObject->Vpb->RealDevice;

    ObDereferenceObject(fileObject);
    ZwClose(deviceHandle);

    return TRUE;
}
NTSTATUS FileCreate( IN PUNICODE_STRING FileName,
                              IN ACCESS_MASK DesiredAccess,
                              IN ULONG FileAttributes,
                              IN ULONG ShareAccess,
                              IN ULONG CreateDisposition,
                              IN ULONG CreateOptions,
                              IN PDEVICE_OBJECT DeviceObject,
                              IN PDEVICE_OBJECT RealDevice
                              /*OUT PVOID *Object*/)
{
    NTSTATUS status;
    KEVENT event;
    PIRP irp;
    IO_STATUS_BLOCK ioStatus;
    PIO_STACK_LOCATION irpSp;
    IO_SECURITY_CONTEXT securityContext;
    ACCESS_STATE accessState;
    OBJECT_ATTRIBUTES objectAttributes;
    PFILE_OBJECT fileObject;
    AUX_ACCESS_DATA auxData;

    RtlZeroMemory(&auxData, sizeof(AUX_ACCESS_DATA));
    KeInitializeEvent(&event, SynchronizationEvent, FALSE);
    irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
    if (irp == NULL)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    InitializeObjectAttributes(&objectAttributes, NULL, OBJ_CASE_INSENSITIVE, 0, NULL);

    status = ObCreateObject(KernelMode,
        *IoFileObjectType,
        &objectAttributes,
        KernelMode,
        NULL,
        sizeof(FILE_OBJECT),
        0,
        0,
        (PVOID *)&fileObject);

    if (!NT_SUCCESS(status))
    {
        IoFreeIrp(irp);
        return status;
    }

    RtlZeroMemory(fileObject, sizeof(FILE_OBJECT));
    fileObject->Type = IO_TYPE_FILE;
    fileObject->Size = sizeof(FILE_OBJECT);
    fileObject->DeviceObject = RealDevice;
    //    fileObject->RelatedFileObject = NULL;
    fileObject->Flags = FO_SYNCHRONOUS_IO;
    fileObject->FileName.MaximumLength = FileName->MaximumLength;
    fileObject->FileName.Buffer = (PWCHAR)ExAllocatePool(NonPagedPool, FileName->MaximumLength);

    if (fileObject->FileName.Buffer == NULL)
    {
        IoFreeIrp(irp);
        ObDereferenceObject(fileObject);
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    RtlCopyUnicodeString(&fileObject->FileName, FileName);
    KeInitializeEvent(&fileObject->Lock, SynchronizationEvent, FALSE);
    KeInitializeEvent(&fileObject->Event, NotificationEvent, FALSE);

    irp->MdlAddress = NULL;
    irp->Flags |= IRP_CREATE_OPERATION | IRP_SYNCHRONOUS_API;
    irp->RequestorMode = KernelMode;
    irp->UserIosb = &ioStatus;
    irp->UserEvent = &event;
    irp->PendingReturned = FALSE;
    irp->Cancel = FALSE;
    irp->CancelRoutine = NULL;
    irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();
    irp->Tail.Overlay.AuxiliaryBuffer = NULL;
    irp->Tail.Overlay.OriginalFileObject = fileObject;

    status = SeCreateAccessState(    &accessState,
        &auxData,
        DesiredAccess,
        IoGetFileObjectGenericMapping());

    if (!NT_SUCCESS(status))
    {
        IoFreeIrp(irp);
        ExFreePool(fileObject->FileName.Buffer);
        ObDereferenceObject(fileObject);
        return status;
    }

    securityContext.SecurityQos = NULL;
    securityContext.AccessState = &accessState;
    securityContext.DesiredAccess = DesiredAccess;
    securityContext.FullCreateOptions = 0;

    irpSp = IoGetNextIrpStackLocation(irp);
    irpSp->MajorFunction = IRP_MJ_CREATE;
    irpSp->DeviceObject = DeviceObject;
    irpSp->FileObject = fileObject;
    irpSp->Parameters.Create.SecurityContext = &securityContext;
    irpSp->Parameters.Create.Options = (CreateDisposition << 24) | CreateOptions;
    irpSp->Parameters.Create.FileAttributes = (USHORT)FileAttributes;
    irpSp->Parameters.Create.ShareAccess = (USHORT)ShareAccess;
    irpSp->Parameters.Create.EaLength = 0;

    IoSetCompletionRoutine(irp, IoCreateCompletionRoutine, NULL, TRUE, TRUE, TRUE);
    status = IoCallDriver(DeviceObject, irp);

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

    status = ioStatus.Status;

    //if (!NT_SUCCESS(status))
    {
        ExFreePool(fileObject->FileName.Buffer);
        fileObject->FileName.Length = 0;
        fileObject->DeviceObject = NULL;
        ObDereferenceObject(fileObject);
    }
    //else
    //{
    //    InterlockedIncrement(&fileObject->DeviceObject->ReferenceCount);

    //    if (fileObject->Vpb)
    //    {
    //        InterlockedIncrement(&fileObject->Vpb->ReferenceCount);
    //    }
    //    *Object = fileObject;
    //    KdPrint(("Open file success! object = %x\n", fileObject));
    //}

    return status;
}
I Believe I Can Fly,I Believe I Can Touch The sky!
iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-10 11:16
请高手指点一下,在线等
I Believe I Can Fly,I Believe I Can Touch The sky!
geland
驱动牛犊
驱动牛犊
  • 注册日期2003-12-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望251点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-04-10 11:34
RtlInitUnicodeString(&Filename, L"\\DosDevices\\D:\\user11\\");
iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-04-10 11:44
楼上的兄弟 还是不行啊
I Believe I Can Fly,I Believe I Can Touch The sky!
iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-10 12:00
自己顶 !
I Believe I Can Fly,I Believe I Can Touch The sky!
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-04-10 14:13
我能创建文件,创建目录 没有试过。
iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-04-10 14:21
我测试的创建文件也有问题,楼上的兄弟能不能把你的代码贴出来看看啊,谢谢了哈
I Believe I Can Fly,I Believe I Can Touch The sky!
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-04-10 14:41
对不起 我不是用的irp来创建的!我用的是影子设备来避免重入问题的!
iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-04-10 14:48
我再试试 不行我也改用影子设备了
I Believe I Can Fly,I Believe I Can Touch The sky!
iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-04-10 15:59
高手看看哈 顶起      
I Believe I Can Fly,I Believe I Can Touch The sky!
wisebo
驱动小牛
驱动小牛
  • 注册日期2006-04-13
  • 最后登录2012-07-18
  • 粉丝0
  • 关注1
  • 积分825分
  • 威望218点
  • 贡献值0点
  • 好评度80点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-07-03 22:13
楼主可以给个创建文件的例子吗?
我想学习一下,万分感谢!
邮箱:wise_bo@126.com
I love niu
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
11楼#
发布于:2008-07-09 19:29
我也遇到过,但是忘了.安全属性肯定不能那么用.我现在已经不太相信这个例子了,仔细看下别人ZwCreateFile的源代码,别人处理了那么多东西.这个例子考虑的东西太少了.
商务MSN:YanDong_8212@163.com
游客

返回顶部