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); }
public override Int32 GetFileInfo( Object FileNode0, Object FileDesc, out FileInfo FileInfo) { FileNode FileNode = (FileNode)FileNode0; FileInfo = FileNode.GetFileInfo(); return(STATUS_SUCCESS); }
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); }
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); }
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); }
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); }
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); }
public override Boolean ReadDirectoryEntry( Object FileNode0, Object FileDesc, String Pattern, String Marker, ref Object Context, out String FileName, out FileInfo FileInfo) { FileNode FileNode = (FileNode)FileNode0; IEnumerator <String> Enumerator = (IEnumerator <String>)Context; if (null == Enumerator) { List <String> ChildrenFileNames = new List <String>(); if ("\\" != FileNode.FileName) { /* if this is not the root directory add the dot entries */ if (null == Marker) { ChildrenFileNames.Add("."); } if (null == Marker || "." == Marker) { ChildrenFileNames.Add(".."); } } ChildrenFileNames.AddRange(FileNodeMap.GetChildrenFileNames(FileNode, "." != Marker && ".." != Marker ? Marker : null)); Context = Enumerator = ChildrenFileNames.GetEnumerator(); } while (Enumerator.MoveNext()) { String FullFileName = Enumerator.Current; if ("." == FullFileName) { FileName = "."; FileInfo = FileNode.GetFileInfo(); return(true); } else if (".." == FullFileName) { Int32 Result = STATUS_SUCCESS; FileNode ParentNode = FileNodeMap.GetParent(FileNode.FileName, ref Result); if (null != ParentNode) { FileName = ".."; FileInfo = ParentNode.GetFileInfo(); return(true); } } else { FileNode ChildFileNode = FileNodeMap.Get(FullFileName); if (null != ChildFileNode) { FileName = Path.GetFileName(FullFileName); FileInfo = ChildFileNode.GetFileInfo(); return(true); } } } FileName = default(String); FileInfo = default(FileInfo); return(false); }
public override Int32 Create( String FileName, UInt32 CreateOptions, UInt32 GrantedAccess, UInt32 FileAttributes, Byte[] SecurityDescriptor, UInt64 AllocationSize, 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; FileNode ParentNode; Int32 Result = STATUS_SUCCESS; FileNode = FileNodeMap.Get(FileName); if (null != FileNode) { return(STATUS_OBJECT_NAME_COLLISION); } ParentNode = FileNodeMap.GetParent(FileName, ref Result); if (null == ParentNode) { return(Result); } if (0 != (CreateOptions & FILE_DIRECTORY_FILE)) { AllocationSize = 0; } if (FileNodeMap.Count() >= MaxFileNodes) { return(STATUS_CANNOT_MAKE); } if (AllocationSize > MaxFileSize) { return(STATUS_DISK_FULL); } if ("\\" != ParentNode.FileName) { /* normalize name */ FileName = ParentNode.FileName + "\\" + Path.GetFileName(FileName); } FileNode = new FileNode(FileName); FileNode.MainFileNode = FileNodeMap.GetMain(FileName); FileNode.FileInfo.FileAttributes = 0 != (FileAttributes & (UInt32)System.IO.FileAttributes.Directory) ? FileAttributes : FileAttributes | (UInt32)System.IO.FileAttributes.Archive; FileNode.FileSecurity = SecurityDescriptor; if (0 != AllocationSize) { Result = SetFileSizeInternal(FileNode, AllocationSize, true); if (0 > Result) { return(Result); } } FileNodeMap.Insert(FileNode); Interlocked.Increment(ref FileNode.OpenCount); FileNode0 = FileNode; FileInfo = FileNode.GetFileInfo(); NormalizedName = FileNode.FileName; return(STATUS_SUCCESS); }