From: Aleksey Bragin Date: Fri, 16 Oct 2009 18:39:38 +0000 (+0000) Subject: [fastfat_new] X-Git-Tag: ReactOS-0.3.11~451 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=9c31ef380158eadf1e6ec5549c57142b96f54102 [fastfat_new] - Improve FatCreateDcb so that it sets the dir name. - Implement relative file object open. svn path=/trunk/; revision=43517 --- diff --git a/reactos/drivers/filesystems/fastfat_new/create.c b/reactos/drivers/filesystems/fastfat_new/create.c index c71dc1eed32..61cb5bf5df5 100644 --- a/reactos/drivers/filesystems/fastfat_new/create.c +++ b/reactos/drivers/filesystems/fastfat_new/create.c @@ -126,8 +126,7 @@ FatiOpenExistingDir(IN PFAT_IRP_CONTEXT IrpContext, } /* Create a new DCB for this directory */ - Fcb = FatCreateDcb(IrpContext, Vcb, ParentDcb); - Fcb->FatHandle = FileHandle; + Fcb = FatCreateDcb(IrpContext, Vcb, ParentDcb, FileHandle); /* Set share access */ IoSetShareAccess(*DesiredAccess, ShareAccess, FileObject, &Fcb->ShareAccess); @@ -332,9 +331,9 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext, ULONG CreateDisposition; /* Control blocks */ - PVCB Vcb, DecodedVcb; - PFCB Fcb, NextFcb; - PCCB Ccb; + PVCB Vcb, DecodedVcb, RelatedVcb; + PFCB Fcb, NextFcb, RelatedDcb; + PCCB Ccb, RelatedCcb; PFCB ParentDcb; /* IRP data */ @@ -357,6 +356,7 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext, UNICODE_STRING RemainingPart, FirstName, NextName; OEM_STRING AnsiFirstName; FF_ERROR FfError; + TYPE_OF_OPEN TypeOfOpen; Iosb.Status = STATUS_SUCCESS; @@ -533,8 +533,42 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext, /* Check if this is a relative open */ if (RelatedFO) { - // RelatedFO will be a parent directory - UNIMPLEMENTED; + /* Decode the file object */ + TypeOfOpen = FatDecodeFileObject(RelatedFO, + &RelatedVcb, + &RelatedDcb, + &RelatedCcb); + + /* Check open type */ + if (TypeOfOpen != UserFileOpen && + TypeOfOpen != UserDirectoryOpen) + { + DPRINT1("Invalid file object!\n"); + + /* Cleanup and return */ + FatReleaseVcb(IrpContext, Vcb); + return STATUS_OBJECT_PATH_NOT_FOUND; + } + + /* File path must be relative */ + if (FileName.Length != 0 && + FileName.Buffer[0] == L'\\') + { + /* The name is absolute, fail */ + FatReleaseVcb(IrpContext, Vcb); + return STATUS_OBJECT_NAME_INVALID; + } + + /* Make sure volume is the same */ + ASSERT(RelatedVcb == Vcb); + + /* Save VPB */ + FileObject->Vpb = RelatedFO->Vpb; + + /* Set parent DCB */ + ParentDcb = RelatedDcb; + + DPRINT1("Opening file '%wZ' relatively to '%wZ'\n", &FileName, &ParentDcb->FullFileName); } else { @@ -743,7 +777,8 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext, /* Create a DCB for this entry */ ParentDcb = FatCreateDcb(IrpContext, Vcb, - ParentDcb); + ParentDcb, + NULL); /* Set its name */ FatSetFullNameInFcb(ParentDcb, &FirstName); diff --git a/reactos/drivers/filesystems/fastfat_new/dir.c b/reactos/drivers/filesystems/fastfat_new/dir.c index abab2306589..2dd35845053 100644 --- a/reactos/drivers/filesystems/fastfat_new/dir.c +++ b/reactos/drivers/filesystems/fastfat_new/dir.c @@ -127,7 +127,8 @@ PFCB NTAPI FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext, IN PVCB Vcb, - IN PFCB ParentDcb) + IN PFCB ParentDcb, + IN FF_FILE *FileHandle) { PFCB Fcb; @@ -162,6 +163,13 @@ FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext, /* Initialize parent dcb list */ InitializeListHead(&Fcb->Dcb.ParentDcbList); + /* Set FullFAT handle */ + Fcb->FatHandle = FileHandle; + + /* Set names */ + if (FileHandle) + FatSetFcbNames(IrpContext, Fcb); + return Fcb; } diff --git a/reactos/drivers/filesystems/fastfat_new/fastfat.h b/reactos/drivers/filesystems/fastfat_new/fastfat.h index 181aebde6f7..9fec7c0ab75 100644 --- a/reactos/drivers/filesystems/fastfat_new/fastfat.h +++ b/reactos/drivers/filesystems/fastfat_new/fastfat.h @@ -84,7 +84,8 @@ FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext, PFCB NTAPI FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext, IN PVCB Vcb, - IN PFCB ParentDcb); + IN PFCB ParentDcb, + IN FF_FILE *FileHandle); /* -------------------------------------------------------- create.c */