Пример #1
0
        public override Int32 Overwrite(
            Object fileNode,
            Object fileDesc0,
            UInt32 fileAttributes,
            Boolean replaceFileAttributes,
            UInt64 allocationSize,
            out FileInfo fileInfo)
        {
            FileDescriptor fileDesc = (FileDescriptor)fileDesc0;

            MakeWriteable(fileDesc);

            if (replaceFileAttributes)
            {
                fileDesc.SetFileAttributes(fileAttributes | (UInt32)System.IO.FileAttributes.Archive);
            }
            else if (0 != fileAttributes)
            {
                fileDesc.SetFileAttributes(fileDesc.GetFileAttributes() | fileAttributes | (UInt32)System.IO.FileAttributes.Archive);
            }

            fileDesc.WriteStream.SetLength(0);

            return(fileDesc.GetFileInfo(out fileInfo));
        }
Пример #2
0
 public Int32 GetFileInfo(out FileInfo FileInfo)
 {
     if (null != Stream)
     {
         BY_HANDLE_FILE_INFORMATION Info;
         if (!GetFileInformationByHandle(Stream.SafeFileHandle.DangerousGetHandle(),
                                         out Info))
         {
             ThrowIoExceptionWithWin32(Marshal.GetLastWin32Error());
         }
         FileInfo.FileAttributes = Info.dwFileAttributes;
         FileInfo.ReparseTag     = 0;
         FileInfo.FileSize       = (UInt64)Stream.Length;
         FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1)
                                   / ALLOCATION_UNIT * ALLOCATION_UNIT;
         FileInfo.CreationTime   = Info.ftCreationTime;
         FileInfo.LastAccessTime = Info.ftLastAccessTime;
         FileInfo.LastWriteTime  = Info.ftLastWriteTime;
         FileInfo.ChangeTime     = FileInfo.LastWriteTime;
         FileInfo.IndexNumber    = 0;
         FileInfo.HardLinks      = 0;
     }
     else
     {
         GetFileInfoFromFileSystemInfo(DirInfo, out FileInfo);
     }
     return(STATUS_SUCCESS);
 }
Пример #3
0
        public override Int32 Open(
            String FileName,
            UInt32 CreateOptions,
            UInt32 GrantedAccess,
            out Object FileNode0,
            out Object FileDesc,
            out FileInfo FileInfo,
            out String NormalizedName)
        {
            FileNode0      = default(Object);
            FileDesc       = default(Object);
            FileInfo       = default(FileInfo);
            NormalizedName = default(String);

            FileNode FileNode;
            Int32    Result;

            FileNode = FileNodeMap.Get(FileName);
            if (null == FileNode)
            {
                Result = STATUS_OBJECT_NAME_NOT_FOUND;
                FileNodeMap.GetParent(FileName, ref Result);
                return(Result);
            }

            Interlocked.Increment(ref FileNode.OpenCount);
            FileNode0      = FileNode;
            FileInfo       = FileNode.GetFileInfo();
            NormalizedName = FileNode.FileName;

            return(STATUS_SUCCESS);
        }
Пример #4
0
        public override int GetDirInfoByName(
            Object ParentNode0,
            Object FileDesc,
            String FileName,
            out String NormalizedName,
            out FileInfo FileInfo)
        {
            FileNode ParentNode = (FileNode)ParentNode0;
            FileNode FileNode;

            FileName =
                ParentNode.FileName +
                ("\\" == ParentNode.FileName ? "" : "\\") +
                Path.GetFileName(FileName);

            FileNode = FileNodeMap.Get(FileName);
            if (null == FileNode)
            {
                NormalizedName = default(String);
                FileInfo       = default(FileInfo);
                return(STATUS_OBJECT_NAME_NOT_FOUND);
            }

            NormalizedName = Path.GetFileName(FileNode.FileName);
            FileInfo       = FileNode.FileInfo;

            return(STATUS_SUCCESS);
        }
Пример #5
0
 public Int32 GetFileInfo(out FileInfo fileInfo)
 {
     if (IsWriteable())
     {
         if (IsFile())
         {
             return(Utils.GetFileInfoFromFileStream(WriteStream, out fileInfo));
         }
         else
         {
             return(Utils.GetFileInfoFromDirectoryInfo(WriteDirInfo, out fileInfo));
         }
     }
     else
     {
         if (IsFile())
         {
             return(Utils.GetFileInfoFromFileStream(ReadOnlyStream, out fileInfo));
         }
         else
         {
             return(Utils.GetFileInfoFromDirectoryInfo(ReadOnlyDirInfo, out fileInfo));
         }
     }
 }
Пример #6
0
        public override Boolean ReadDirectoryEntry(
            Object FileNode,
            Object FileDesc,
            String Pattern,
            String Marker,
            ref Object Context,
            out String FileName,
            out FileInfo FileInfo)
        {
            IEnumerator <String> Enumerator = (IEnumerator <String>)Context;

            if (null == Enumerator)
            {
                List <String> ChildrenFileNames = new List <String>();
                for (int Index = 1, Count = FileCount(); Count >= Index; Index++)
                {
                    ChildrenFileNames.Add(String.Format("{0}", Index));
                }
                Context = Enumerator = ChildrenFileNames.GetEnumerator();
            }

            while (Enumerator.MoveNext())
            {
                FileName = Enumerator.Current;
                FillFileInfo(int.Parse(FileName), out FileInfo);
                return(true);
            }

            FileName = default(String);
            FileInfo = default(FileInfo);
            return(false);
        }
Пример #7
0
        public override Int32 Open(
            String FileName,
            UInt32 CreateOptions,
            UInt32 GrantedAccess,
            out Object FileNode,
            out Object FileDesc0,
            out FileInfo FileInfo,
            out String NormalizedName)
        {
            FileNode       = default;
            NormalizedName = default;

            if (string.IsNullOrEmpty(FileName) || FileName == "\\")
            {
                // No file path? Return some info about the root dir..
                var fileDesc = new FileInstance(null, this);
                FileDesc0 = fileDesc;
                return(fileDesc.GetFileInfo(out FileInfo));
            }

            var foundEntry = FindFile(FileName);

            if (foundEntry == null)
            {
                FileInfo  = default;
                FileDesc0 = null;
                return(STATUS_OBJECT_NAME_NOT_FOUND);
            }

            var fileDesc2 = new FileInstance(foundEntry, this);

            FileDesc0 = fileDesc2;
            return(fileDesc2.GetFileInfo(out FileInfo));
        }
Пример #8
0
        public override Int32 Open(
            String FileName,
            UInt32 CreateOptions,
            UInt32 GrantedAccess,
            out Object FileNode,
            out Object FileDesc,
            out FileInfo FileInfo,
            out String NormalizedName)
        {
            FileNode       = default(Object);
            FileDesc       = default(Object);
            FileInfo       = default(FileInfo);
            NormalizedName = default(String);

            int Index = FileLookup(FileName);

            if (-1 == Index)
            {
                return(STATUS_OBJECT_NAME_NOT_FOUND);
            }

            FileNode = Index;
            FillFileInfo(Index, out FileInfo);

            return(STATUS_SUCCESS);
        }
Пример #9
0
        public override Boolean ReadDirectoryEntry(
            Object FileNode,
            Object FileDesc0,
            String Pattern,
            String Marker,
            ref Object Context,
            out String FileName,
            out FileInfo FileInfo)
        {
            var Instance   = (FileInstance)FileDesc0;
            var Enumerator = (IEnumerator <IFileEntry>)Context;

            if (Enumerator == null)
            {
                var childArr = RootFiles;
                if (Instance.FileEntry != null)
                {
                    childArr = Instance.FileEntry.Children;
                }

                Enumerator = childArr.GetEnumerator();
                Context    = Enumerator;
                int Index = 0;
                if (null != Marker)
                {
                    Index = childArr.FindIndex(s => s.Name == Marker);
                    if (0 <= Index)
                    {
                        Index++;
                    }
                    else
                    {
                        Index = ~Index;
                    }
                }

                if (Index > 0)
                {
                    for (int i = 0; i < Index; i++)
                    {
                        Enumerator.MoveNext();
                    }
                }
            }

            if (Enumerator.MoveNext())
            {
                var entry = Enumerator.Current;
                FileName = entry.Name;
                var desc = new FileInstance(entry, this);
                desc.GetFileInfo(out FileInfo);
                return(true);
            }

            FileName = default;
            FileInfo = default;
            return(false);
        }
Пример #10
0
        public override Int32 GetFileInfo(
            Object fileNode,
            Object fileDesc0,
            out FileInfo fileInfo)
        {
            FileDescriptor fileDesc = (FileDescriptor)fileDesc0;

            return(fileDesc.GetFileInfo(out fileInfo));
        }
Пример #11
0
        public override Int32 GetFileInfo(
            Object FileNode,
            Object FileDesc0,
            out FileInfo FileInfo)
        {
            var instance = (FileInstance)FileDesc0;

            return(instance.GetFileInfo(out FileInfo));
        }
Пример #12
0
        public override Int32 GetFileInfo(
            Object FileNode,
            Object FileDesc0,
            out FileInfo FileInfo)
        {
            FileDesc FileDesc = (FileDesc)FileDesc0;

            return(FileDesc.GetFileInfo(out FileInfo));
        }
Пример #13
0
        public override Int32 GetFileInfo(
            Object FileNode0,
            Object FileDesc,
            out FileInfo FileInfo)
        {
            FileNode FileNode = (FileNode)FileNode0;

            FileInfo = FileNode.GetFileInfo();

            return(STATUS_SUCCESS);
        }
Пример #14
0
        public override Int32 GetFileInfo(
            Object FileNode,
            Object FileDesc,
            out FileInfo FileInfo)
        {
            int Index = (int)FileNode;

            FillFileInfo(Index, out FileInfo);

            return(STATUS_SUCCESS);
        }
Пример #15
0
        public override Int32 Write(
            Object FileNode0,
            Object FileDesc,
            IntPtr Buffer,
            UInt64 Offset,
            UInt32 Length,
            Boolean WriteToEndOfFile,
            Boolean ConstrainedIo,
            out UInt32 BytesTransferred,
            out FileInfo FileInfo)
        {
            FileNode FileNode = (FileNode)FileNode0;
            UInt64   EndOffset;

            if (ConstrainedIo)
            {
                if (Offset >= FileNode.FileInfo.FileSize)
                {
                    BytesTransferred = default(UInt32);
                    FileInfo         = default(FileInfo);
                    return(STATUS_SUCCESS);
                }
                EndOffset = Offset + Length;
                if (EndOffset > FileNode.FileInfo.FileSize)
                {
                    EndOffset = FileNode.FileInfo.FileSize;
                }
            }
            else
            {
                if (WriteToEndOfFile)
                {
                    Offset = FileNode.FileInfo.FileSize;
                }
                EndOffset = Offset + Length;
                if (EndOffset > FileNode.FileInfo.FileSize)
                {
                    Int32 Result = SetFileSizeInternal(FileNode, EndOffset, false);
                    if (0 > Result)
                    {
                        BytesTransferred = default(UInt32);
                        FileInfo         = default(FileInfo);
                        return(Result);
                    }
                }
            }

            BytesTransferred = (UInt32)(EndOffset - Offset);
            Marshal.Copy(Buffer, FileNode.FileData, (int)Offset, (int)BytesTransferred);

            FileInfo = FileNode.GetFileInfo();

            return(STATUS_SUCCESS);
        }
Пример #16
0
 private static void FillFileInfo(int Index, out FileInfo FileInfo)
 {
     FileInfo = default(FileInfo);
     FileInfo.FileAttributes = 0 == Index ? (UInt32)System.IO.FileAttributes.Directory : 0;
     FileInfo.FileSize       = (UInt64)FileContents(Index).Length;
     FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1)
                               / ALLOCATION_UNIT * ALLOCATION_UNIT;
     FileInfo.CreationTime           =
         FileInfo.LastAccessTime     =
             FileInfo.LastWriteTime  =
                 FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc();
 }
Пример #17
0
        public override Int32 Flush(
            Object FileNode0,
            Object FileDesc,
            out FileInfo FileInfo)
        {
            FileNode FileNode = (FileNode)FileNode0;

            /*  nothing to flush, since we do not cache anything */
            FileInfo = null != FileNode?FileNode.GetFileInfo() : default(FileInfo);

            return(STATUS_SUCCESS);
        }
Пример #18
0
        public override Int32 Overwrite(
            Object FileNode0,
            Object FileDesc,
            UInt32 FileAttributes,
            Boolean ReplaceFileAttributes,
            UInt64 AllocationSize,
            out FileInfo FileInfo)
        {
            FileInfo = default(FileInfo);

            FileNode FileNode = (FileNode)FileNode0;
            Int32    Result;

            List <String> StreamFileNames = new List <String>(FileNodeMap.GetStreamFileNames(FileNode));

            foreach (String StreamFileName in StreamFileNames)
            {
                FileNode StreamNode = FileNodeMap.Get(StreamFileName);
                if (null == StreamNode)
                {
                    continue; /* should not happen */
                }
                if (0 == StreamNode.OpenCount)
                {
                    FileNodeMap.Remove(StreamNode);
                }
            }

            Result = SetFileSizeInternal(FileNode, AllocationSize, true);
            if (0 > Result)
            {
                return(Result);
            }
            if (ReplaceFileAttributes)
            {
                FileNode.FileInfo.FileAttributes = FileAttributes | (UInt32)System.IO.FileAttributes.Archive;
            }
            else
            {
                FileNode.FileInfo.FileAttributes |= FileAttributes | (UInt32)System.IO.FileAttributes.Archive;
            }
            FileNode.FileInfo.FileSize           = 0;
            FileNode.FileInfo.LastAccessTime     =
                FileNode.FileInfo.LastWriteTime  =
                    FileNode.FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc();

            FileInfo = FileNode.GetFileInfo();

            return(STATUS_SUCCESS);
        }
Пример #19
0
        public override Int32 SetBasicInfo(
            Object FileNode,
            Object FileDesc0,
            UInt32 FileAttributes,
            UInt64 CreationTime,
            UInt64 LastAccessTime,
            UInt64 LastWriteTime,
            UInt64 ChangeTime,
            out FileInfo FileInfo)
        {
            FileDesc FileDesc = (FileDesc)FileDesc0;

            FileDesc.SetBasicInfo(FileAttributes, CreationTime, LastAccessTime, LastWriteTime);
            return(FileDesc.GetFileInfo(out FileInfo));
        }
Пример #20
0
        public override Int32 SetFileSize(
            Object FileNode0,
            Object FileDesc,
            UInt64 NewSize,
            Boolean SetAllocationSize,
            out FileInfo FileInfo)
        {
            FileNode FileNode = (FileNode)FileNode0;
            Int32    Result;

            Result   = SetFileSizeInternal(FileNode, NewSize, SetAllocationSize);
            FileInfo = 0 <= Result?FileNode.GetFileInfo() : default(FileInfo);

            return(STATUS_SUCCESS);
        }
Пример #21
0
 public FileInfo GetFileInfo()
 {
     if (null == MainFileNode)
     {
         return(this.FileInfo);
     }
     else
     {
         FileInfo FileInfo = MainFileNode.FileInfo;
         FileInfo.FileAttributes &= ~(UInt32)FileAttributes.Directory;
         /* named streams cannot be directories */
         FileInfo.AllocationSize = this.FileInfo.AllocationSize;
         FileInfo.FileSize       = this.FileInfo.FileSize;
         return(FileInfo);
     }
 }
Пример #22
0
 public static Int32 GetFileInfoFromFileSystemInfo(FileSystemInfo Info, out FileInfo FileInfo)
 {
     FileInfo.FileAttributes = (UInt32)Info.Attributes;
     FileInfo.ReparseTag     = 0;
     FileInfo.FileSize       = Info is System.IO.FileInfo ?
                               (UInt64)((System.IO.FileInfo)Info).Length : 0;
     FileInfo.AllocationSize = (FileInfo.FileSize + ALLOCATION_UNIT - 1)
                               / ALLOCATION_UNIT * ALLOCATION_UNIT;
     FileInfo.CreationTime   = (UInt64)Info.CreationTimeUtc.ToFileTimeUtc();
     FileInfo.LastAccessTime = (UInt64)Info.LastAccessTimeUtc.ToFileTimeUtc();
     FileInfo.LastWriteTime  = (UInt64)Info.LastWriteTimeUtc.ToFileTimeUtc();
     FileInfo.ChangeTime     = FileInfo.LastWriteTime;
     FileInfo.IndexNumber    = 0;
     FileInfo.HardLinks      = 0;
     return(FileSystemBase.STATUS_SUCCESS);
 }
Пример #23
0
        public override Int32 Flush(
            Object FileNode,
            Object FileDesc0,
            out FileInfo FileInfo)
        {
            FileDesc FileDesc = (FileDesc)FileDesc0;

            if (null == FileDesc)
            {
                /* we do not flush the whole volume, so just return SUCCESS */
                FileInfo = default(FileInfo);
                return(STATUS_SUCCESS);
            }
            FileDesc.Stream.Flush(true);
            return(FileDesc.GetFileInfo(out FileInfo));
        }
Пример #24
0
        public override Int32 SetBasicInfo(
            Object fileNode,
            Object fileDesc0,
            UInt32 fileAttributes,
            UInt64 creationTime,
            UInt64 lastAccessTime,
            UInt64 lastWriteTime,
            UInt64 changeTime,
            out FileInfo fileInfo)
        {
            FileDescriptor fileDesc = (FileDescriptor)fileDesc0;

            MakeWriteable(fileDesc);
            fileDesc.SetBasicInfo(fileAttributes, creationTime, lastAccessTime, lastWriteTime);

            return(fileDesc.GetFileInfo(out fileInfo));
        }
Пример #25
0
        public override Int32 Flush(
            Object fileNode,
            Object fileDesc0,
            out FileInfo fileInfo)
        {
            FileDescriptor fileDesc = (FileDescriptor)fileDesc0;

            if (null == fileDesc)
            {
                /* we do not flush the whole volume, so just return SUCCESS */
                fileInfo = default(FileInfo);
                return(STATUS_SUCCESS);
            }

            fileDesc.Flush();

            return(fileDesc.GetFileInfo(out fileInfo));
        }
Пример #26
0
        public override Int32 Open(
            String FileName,
            UInt32 CreateOptions,
            UInt32 GrantedAccess,
            out Object FileNode,
            out Object FileDesc0,
            out FileInfo FileInfo,
            out String NormalizedName)
        {
            FileDesc FileDesc = null;

            try
            {
                FileName = ConcatPath(FileName);
                if (!Directory.Exists(FileName))
                {
                    FileDesc = new FileDesc(
                        new FileStream(
                            FileName,
                            FileMode.Open,
                            (FileSystemRights)GrantedAccess,
                            FileShare.Read | FileShare.Write | FileShare.Delete,
                            4096,
                            0));
                }
                else
                {
                    FileDesc = new FileDesc(
                        new DirectoryInfo(FileName));
                }
                FileNode       = default(Object);
                FileDesc0      = FileDesc;
                NormalizedName = default(String);
                return(FileDesc.GetFileInfo(out FileInfo));
            }
            catch
            {
                if (null != FileDesc && null != FileDesc.Stream)
                {
                    FileDesc.Stream.Dispose();
                }
                throw;
            }
        }
Пример #27
0
            public Int32 GetFileInfo(out FileInfo FileInfo)
            {
                FileInfo = new FileInfo();
                FileInfo.FileAttributes = (uint)FileAttributes.Directory;

                if (FileEntry != null)
                {
                    FileInfo.CreationTime   = (ulong)FileEntry.CreationTime.ToFileTimeUtc();
                    FileInfo.LastWriteTime  = FileInfo.ChangeTime = (ulong)FileEntry.LastWriteTime.ToFileTimeUtc();
                    FileInfo.LastAccessTime = (ulong)FileEntry.LastAccessTime.ToFileTimeUtc();
                    FileInfo.FileSize       = FileEntry.Size;
                    FileInfo.AllocationSize = Utility.RoundToPages(FileEntry.Size, (ulong)FileSystem.SectorSize) * (ulong)FileSystem.SectorSize;
                    FileInfo.FileAttributes = FileEntry.IsDirectory ? (uint)FileAttributes.Directory : 0;
                }

                FileInfo.FileAttributes |= (uint)FileAttributes.ReadOnly;

                return(STATUS_SUCCESS);
            }
Пример #28
0
        public override Int32 Write(
            Object fileNode,
            Object fileDesc0,
            IntPtr buffer,
            UInt64 offset,
            UInt32 length,
            Boolean writeToEndOfFile,
            Boolean constrainedIo,
            out UInt32 pBytesTransferred,
            out FileInfo fileInfo)
        {
            FileDescriptor fileDesc = (FileDescriptor)fileDesc0;

            MakeWriteable(fileDesc);

            FileStream stream = fileDesc.WriteStream;

            if (constrainedIo)
            {
                if (offset >= (UInt64)stream.Length)
                {
                    pBytesTransferred = default(UInt32);
                    fileInfo          = default(FileInfo);
                    return(STATUS_SUCCESS);
                }
                if (offset + length > (UInt64)stream.Length)
                {
                    length = (UInt32)((UInt64)stream.Length - offset);
                }
            }
            Byte[] bytes = new byte[length];
            Marshal.Copy(buffer, bytes, 0, bytes.Length);
            if (!writeToEndOfFile)
            {
                stream.Seek((Int64)offset, SeekOrigin.Begin);
            }

            stream.Write(bytes, 0, bytes.Length);
            pBytesTransferred = (UInt32)bytes.Length;

            return(fileDesc.GetFileInfo(out fileInfo));
        }
Пример #29
0
        public override Int32 SetBasicInfo(
            Object FileNode0,
            Object FileDesc,
            UInt32 FileAttributes,
            UInt64 CreationTime,
            UInt64 LastAccessTime,
            UInt64 LastWriteTime,
            UInt64 ChangeTime,
            out FileInfo FileInfo)
        {
            FileNode FileNode = (FileNode)FileNode0;

            if (null != FileNode.MainFileNode)
            {
                FileNode = FileNode.MainFileNode;
            }

            if (unchecked ((UInt32)(-1)) != FileAttributes)
            {
                FileNode.FileInfo.FileAttributes = FileAttributes;
            }
            if (0 != CreationTime)
            {
                FileNode.FileInfo.CreationTime = CreationTime;
            }
            if (0 != LastAccessTime)
            {
                FileNode.FileInfo.LastAccessTime = LastAccessTime;
            }
            if (0 != LastWriteTime)
            {
                FileNode.FileInfo.LastWriteTime = LastWriteTime;
            }
            if (0 != ChangeTime)
            {
                FileNode.FileInfo.ChangeTime = ChangeTime;
            }

            FileInfo = FileNode.GetFileInfo();

            return(STATUS_SUCCESS);
        }
Пример #30
0
        public override Int32 SetFileSize(
            Object FileNode,
            Object FileDesc0,
            UInt64 NewSize,
            Boolean SetAllocationSize,
            out FileInfo FileInfo)
        {
            FileDesc FileDesc = (FileDesc)FileDesc0;

            if (!SetAllocationSize || (UInt64)FileDesc.Stream.Length > NewSize)
            {
                /*
                 * "FileInfo.FileSize > NewSize" explanation:
                 * Ptfs does not support allocation size. However if the new AllocationSize
                 * is less than the current FileSize we must truncate the file.
                 */
                FileDesc.Stream.SetLength((Int64)NewSize);
            }
            return(FileDesc.GetFileInfo(out FileInfo));
        }