From fdaf0acd73d07869a5ae30828ffd30c3b507760f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sat, 17 Oct 2009 10:57:48 +0000 Subject: [PATCH] [fastfat_new] - Search FCBs with unicode name too, besides of OEM. - Create an infrastructure for opening existing FCB/DCBs. svn path=/trunk/; revision=43527 --- .../drivers/filesystems/fastfat_new/create.c | 131 +++++++++++++++++- reactos/drivers/filesystems/fastfat_new/dir.c | 20 +++ .../drivers/filesystems/fastfat_new/fastfat.h | 28 ++++ reactos/drivers/filesystems/fastfat_new/fcb.c | 26 ++++ 4 files changed, 200 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/filesystems/fastfat_new/create.c b/reactos/drivers/filesystems/fastfat_new/create.c index 61cb5bf5df5..a92494b9d14 100644 --- a/reactos/drivers/filesystems/fastfat_new/create.c +++ b/reactos/drivers/filesystems/fastfat_new/create.c @@ -353,10 +353,11 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext, IO_STATUS_BLOCK Iosb; PIO_STACK_LOCATION IrpSp; BOOLEAN EndBackslash = FALSE, OpenedAsDos; - UNICODE_STRING RemainingPart, FirstName, NextName; + UNICODE_STRING RemainingPart, FirstName, NextName, FileNameUpcased; OEM_STRING AnsiFirstName; FF_ERROR FfError; TYPE_OF_OPEN TypeOfOpen; + BOOLEAN OplockPostIrp = FALSE; Iosb.Status = STATUS_SUCCESS; @@ -684,10 +685,22 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext, &OpenedAsDos); } - /* Check if we found anything */ + /* If nothing found - try with unicode */ if (!NextFcb && Fcb->Dcb.SplayLinksUnicode) { - ASSERT(FALSE); + FileNameUpcased.Buffer = FsRtlAllocatePool(PagedPool, FirstName.Length); + FileNameUpcased.Length = 0; + FileNameUpcased.MaximumLength = FirstName.Length; + + /* Downcase and then upcase to normalize it */ + Status = RtlDowncaseUnicodeString(&FileNameUpcased, &FirstName, FALSE); + Status = RtlUpcaseUnicodeString(&FileNameUpcased, &FileNameUpcased, FALSE); + + /* Try to find FCB again using unicode name */ + NextFcb = FatFindFcb(IrpContext, + &Fcb->Dcb.SplayLinksUnicode, + (PSTRING)&FileNameUpcased, + &OpenedAsDos); } /* Move to the next FCB */ @@ -729,8 +742,116 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext, /* We have a valid FCB now */ if (!RemainingPart.Length) { - DPRINT1("It's possible to open an existing FCB\n"); - ASSERT(FALSE); + /* Check for target dir open */ + if (OpenTargetDirectory) + { + DPRINT1("Opening target dir is missing\n"); + ASSERT(FALSE); + } + + /* Check this FCB's type */ + if (FatNodeType(Fcb) == FAT_NTC_ROOT_DCB || + FatNodeType(Fcb) == FAT_NTC_DCB) + { + /* Open a directory */ + if (NonDirectoryFile) + { + /* Forbidden */ + Iosb.Status = STATUS_FILE_IS_A_DIRECTORY; + ASSERT(FALSE); + return Iosb.Status; + } + + /* Open existing DCB */ + Iosb = FatiOpenExistingDcb(IrpContext, + FileObject, + Vcb, + Fcb, + DesiredAccess, + ShareAccess, + CreateDisposition, + NoEaKnowledge, + DeleteOnClose); + + /* Save information */ + Irp->IoStatus.Information = Iosb.Information; + + /* Unlock VCB */ + FatReleaseVcb(IrpContext, Vcb); + + /* Complete the request */ + FatCompleteRequest(IrpContext, Irp, Iosb.Status); + + return Iosb.Status; + } + else if (FatNodeType(Fcb) == FAT_NTC_FCB) + { + /* Open a file */ + if (OpenDirectory) + { + /* Forbidden */ + Iosb.Status = STATUS_NOT_A_DIRECTORY; + ASSERT(FALSE); + return Iosb.Status; + } + + /* Check for trailing backslash */ + if (EndBackslash) + { + /* Forbidden */ + Iosb.Status = STATUS_OBJECT_NAME_INVALID; + ASSERT(FALSE); + return Iosb.Status; + } + + Iosb = FatiOpenExistingFcb(IrpContext, + FileObject, + Vcb, + Fcb, + DesiredAccess, + ShareAccess, + AllocationSize, + EaBuffer, + EaLength, + FileAttributes, + CreateDisposition, + NoEaKnowledge, + DeleteOnClose, + OpenedAsDos, + &OplockPostIrp); + + /* Check if it's pending */ + if (Iosb.Status != STATUS_PENDING) + { + /* In case of success set cache supported flag */ + if (NT_SUCCESS(Iosb.Status) && !NoIntermediateBuffering) + { + SetFlag(FileObject->Flags, FO_CACHE_SUPPORTED); + } + + /* Save information */ + Irp->IoStatus.Information = Iosb.Information; + + /* Unlock VCB */ + FatReleaseVcb(IrpContext, Vcb); + + /* Complete the request */ + FatCompleteRequest(IrpContext, Irp, Iosb.Status); + + return Iosb.Status; + } + else + { + /* Queue this IRP */ + UNIMPLEMENTED; + ASSERT(FALSE); + } + } + else + { + /* Unexpected FCB type */ + KeBugCheckEx(/*FAT_FILE_SYSTEM*/0x23, __LINE__, (ULONG_PTR)Fcb, 0, 0); + } } /* During parsing we encountered a part which has no attached FCB/DCB. diff --git a/reactos/drivers/filesystems/fastfat_new/dir.c b/reactos/drivers/filesystems/fastfat_new/dir.c index 2dd35845053..1bb7826ec5a 100644 --- a/reactos/drivers/filesystems/fastfat_new/dir.c +++ b/reactos/drivers/filesystems/fastfat_new/dir.c @@ -173,4 +173,24 @@ FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext, return Fcb; } +IO_STATUS_BLOCK +NTAPI +FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext, + IN PFILE_OBJECT FileObject, + IN PVCB Vcb, + IN PFCB Dcb, + IN PACCESS_MASK DesiredAccess, + IN USHORT ShareAccess, + IN ULONG CreateDisposition, + IN BOOLEAN NoEaKnowledge, + IN BOOLEAN DeleteOnClose) +{ + IO_STATUS_BLOCK Iosb = {{0}}; + + Iosb.Status = STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + + return Iosb; +} + /* EOF */ diff --git a/reactos/drivers/filesystems/fastfat_new/fastfat.h b/reactos/drivers/filesystems/fastfat_new/fastfat.h index 9fec7c0ab75..6f79db7b77e 100644 --- a/reactos/drivers/filesystems/fastfat_new/fastfat.h +++ b/reactos/drivers/filesystems/fastfat_new/fastfat.h @@ -87,6 +87,17 @@ FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext, IN PFCB ParentDcb, IN FF_FILE *FileHandle); +IO_STATUS_BLOCK NTAPI +FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext, + IN PFILE_OBJECT FileObject, + IN PVCB Vcb, + IN PFCB Dcb, + IN PACCESS_MASK DesiredAccess, + IN USHORT ShareAccess, + IN ULONG CreateDisposition, + IN BOOLEAN NoEaKnowledge, + IN BOOLEAN DeleteOnClose); + /* -------------------------------------------------------- create.c */ NTSTATUS NTAPI @@ -296,6 +307,23 @@ FatCreateFcb( IN PFCB ParentDcb, IN FF_FILE *FileHandle); +IO_STATUS_BLOCK NTAPI +FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext, + IN PFILE_OBJECT FileObject, + IN PVCB Vcb, + IN PFCB Fcb, + IN PACCESS_MASK DesiredAccess, + IN USHORT ShareAccess, + IN ULONG AllocationSize, + IN PFILE_FULL_EA_INFORMATION EaBuffer, + IN ULONG EaLength, + IN UCHAR FileAttributes, + IN ULONG CreateDisposition, + IN BOOLEAN NoEaKnowledge, + IN BOOLEAN DeleteOnClose, + IN BOOLEAN OpenedAsDos, + OUT PBOOLEAN OplockPostIrp); + PFCB NTAPI FatFindFcb(PFAT_IRP_CONTEXT IrpContext, PRTL_SPLAY_LINKS *RootNode, diff --git a/reactos/drivers/filesystems/fastfat_new/fcb.c b/reactos/drivers/filesystems/fastfat_new/fcb.c index 5092366e377..b9fe0d88771 100644 --- a/reactos/drivers/filesystems/fastfat_new/fcb.c +++ b/reactos/drivers/filesystems/fastfat_new/fcb.c @@ -172,6 +172,32 @@ FatCreateCcb() return Ccb; } +IO_STATUS_BLOCK +NTAPI +FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext, + IN PFILE_OBJECT FileObject, + IN PVCB Vcb, + IN PFCB Fcb, + IN PACCESS_MASK DesiredAccess, + IN USHORT ShareAccess, + IN ULONG AllocationSize, + IN PFILE_FULL_EA_INFORMATION EaBuffer, + IN ULONG EaLength, + IN UCHAR FileAttributes, + IN ULONG CreateDisposition, + IN BOOLEAN NoEaKnowledge, + IN BOOLEAN DeleteOnClose, + IN BOOLEAN OpenedAsDos, + OUT PBOOLEAN OplockPostIrp) +{ + IO_STATUS_BLOCK Iosb = {{0}}; + + Iosb.Status = STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + + return Iosb; +} + VOID NTAPI FatGetFcbUnicodeName(IN PFAT_IRP_CONTEXT IrpContext,