// // ReadDirectoryHeader: // reads a directory header from the filesystem. a directory // header contains information about a directory. mostly this // is just information about the next and previous blocks in this // directory // // arguments: // 1) CoreDirectoryHeader *de (OUT): a pointer to an allocated CoreDirectoryHeader // object. this will be initialized with the data read from the disc // // return value: // true on success, false otherwise // public bool ReadDirectoryHeader(ref CoreDirectoryHeader dh) { UInt32 bytesRead = 0; bool ret; byte[] buffer = new byte[CoreDirectoryHeaderConsts.DirectoryHeaderSize]; GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); ret = _fileReader.Read(handle.AddrOfPinnedObject(), CoreDirectoryHeaderConsts.DirectoryHeaderSize, ref bytesRead); if (!ret) { return(false); } dh = (CoreDirectoryHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(CoreDirectoryHeader)); handle.Free(); // // make all relevant fields little endian // EndianSwap(ref dh.nextBlock); EndianSwap(ref dh.prevBlock); EndianSwap(ref dh.flags); EndianSwap(ref dh.unusedOffset); EndianSwap(ref dh.directoryOffset); return(true); }
internal Directory(UInt32 firstByte, FileSystem fileSystem, CoreDirectoryHeader coreDirectoryHeader, CoreDirectoryEntry?coreDirectoryEntry, Directory parentDirectory) { _firstByte = firstByte; _coreDirectoryHeader = coreDirectoryHeader; _coreDirectoryEntry = coreDirectoryEntry; _fileSystem = fileSystem; _parentDirectory = parentDirectory; }
private List <IItem> FetchItems() { var returnValue = new List <IItem>(); var coreFileSystem = _fileSystem.CoreFileSystem; var coreDirectoryEntry = new CoreDirectoryEntry(); var coreDirectory = new CoreDirectory(coreFileSystem); coreDirectory.SetCoreDirectoryHeader(_coreDirectoryHeader); coreFileSystem.FileReader.SeekToByte(_firstByte, false); coreFileSystem.FileReader.SeekToByte(_coreDirectoryHeader.directoryOffset, true); var currentByte = coreFileSystem.FileReader.CurrentByte; while (coreDirectory.EnumerateDirectory(ref coreDirectoryEntry)) { IItem newItem; UInt32 itemType = (coreDirectoryEntry.flags & CoreDirectoryEntryConsts.DirectoryEntryTypeMask); if (itemType == CoreDirectoryEntryConsts.DirectoryEntryTypeFolder) { ////////////////////////// // Seek to and read the folder header now! var returnByte = coreFileSystem.FileReader.CurrentByte; coreFileSystem.SeekToBlock(coreDirectoryEntry.FirstCopy, false); var referencedByte = coreFileSystem.FileReader.CurrentByte; var coreDirectoryHeader = new CoreDirectoryHeader(); coreFileSystem.ReadDirectoryHeader(ref coreDirectoryHeader); // Go back into the enumeration position. coreFileSystem.SeekToByte(returnByte, false); ////////////////////////// // Now we're ready to create the directory entry. newItem = new Directory(referencedByte, _fileSystem, coreDirectoryHeader, coreDirectoryEntry, this); } else { newItem = new File(currentByte, _fileSystem, coreDirectoryEntry, this); } returnValue.Add(newItem); currentByte = coreFileSystem.FileReader.CurrentByte; } return(returnValue); }
public FileSystem(IFileReader fileReader) { _fileReader = fileReader; _fileReader.SeekToByte(0, false); _coreFileSystem = new CoreFileSystem(_fileReader); var coreVolumeHeader = new CoreVolumeHeader(); var coreDirectoryHeader = new CoreDirectoryHeader(); _coreFileSystem.ReadVolumeHeader(ref coreVolumeHeader); _coreFileSystem.SeekToBlock(coreVolumeHeader.FirstCopy, false); uint directoryHeaderStart = _coreFileSystem.FileReader.CurrentByte; _coreFileSystem.ReadDirectoryHeader(ref coreDirectoryHeader); _rootVolumeHeader = new VolumeHeader(coreVolumeHeader); _rootDirectory = new Directory(directoryHeaderStart, this, coreDirectoryHeader, null, null); }
public void SetCoreDirectoryHeader(CoreDirectoryHeader header) { _coreDirectoryHeader = header; }