Author: pschweitzer Date: Mon Dec 8 19:55:56 2014 New Revision: 65594 URL: http://svn.reactos.org/svn/reactos?rev=65594&view=rev Log: [NTFS] Fix the implementation of the reparse point handling. This takes into account our $FILE_NAME attribute not being aware it's a reparse point... We now fully get into Io and fail miserably as it seems I forgot one place where reparse points support has to be added. D'oh!
Modified: trunk/reactos/drivers/filesystems/ntfs/create.c Modified: trunk/reactos/drivers/filesystems/ntfs/create.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/ntfs/create.c?rev=65594&r1=65593&r2=65594&view=diff ============================================================================== --- trunk/reactos/drivers/filesystems/ntfs/create.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/ntfs/create.c [iso-8859-1] Mon Dec 8 19:55:56 2014 @@ -254,33 +254,26 @@ if (NtfsFCBIsReparsePoint(Fcb) && ((RequestedOptions & FILE_OPEN_REPARSE_POINT) != FILE_OPEN_REPARSE_POINT)) { - if (Fcb->Entry.Extended.ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) + PREPARSE_DATA_BUFFER ReparseData = NULL; + + Status = NtfsReadFCBAttribute(DeviceExt, Fcb, + AttributeReparsePoint, L"", 0, + (PVOID *)&Irp->Tail.Overlay.AuxiliaryBuffer); + if (NT_SUCCESS(Status)) { - Status = NtfsReadFCBAttribute(DeviceExt, Fcb, - AttributeReparsePoint, L"", 0, - (PVOID *)&Irp->Tail.Overlay.AuxiliaryBuffer); - if (NT_SUCCESS(Status)) + ReparseData = (PREPARSE_DATA_BUFFER)Irp->Tail.Overlay.AuxiliaryBuffer; + if (ReparseData->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { - PREPARSE_DATA_BUFFER ReparseData; - - ReparseData = (PREPARSE_DATA_BUFFER)Irp->Tail.Overlay.AuxiliaryBuffer; - if (ReparseData->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) - { - Status = STATUS_REPARSE; - } - else - { - Status = STATUS_FILE_CORRUPT_ERROR; - ExFreePoolWithTag(ReparseData, TAG_NTFS); - } + Status = STATUS_REPARSE; + } + else + { + Status = STATUS_NOT_IMPLEMENTED; + ExFreePoolWithTag(ReparseData, TAG_NTFS); } } - else - { - Status = STATUS_NOT_IMPLEMENTED; - } - - Irp->IoStatus.Information = ((Status == STATUS_REPARSE) ? Fcb->Entry.Extended.ReparseTag : 0); + + Irp->IoStatus.Information = ((Status == STATUS_REPARSE) ? ReparseData->ReparseTag : 0); NtfsCloseFile(DeviceExt, FileObject); return Status;