Exemple #1
0
        //
        // 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);
        }
Exemple #2
0
 internal Directory(UInt32 firstByte, FileSystem fileSystem, CoreDirectoryHeader coreDirectoryHeader, CoreDirectoryEntry?coreDirectoryEntry, Directory parentDirectory)
 {
     _firstByte           = firstByte;
     _coreDirectoryHeader = coreDirectoryHeader;
     _coreDirectoryEntry  = coreDirectoryEntry;
     _fileSystem          = fileSystem;
     _parentDirectory     = parentDirectory;
 }
Exemple #3
0
        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;
 }