/// <summary>
        /// Refreshes the logical device.
        /// </summary>
        public void Refresh()
        {
            bootSector = null;
            data       = new UInt16[0];

            // Jump to FAT partition
            DeviceStream.Seek(partition.RelativeSector * PhysicalDevice.SectorSize, SeekOrigin.Begin);
            if (!partition.IsFAT)
            {
                return;
            }

            // Boot sector
            bootSector = (BootSector)StreamActivator.CreateInstance(typeof(BootSector), DeviceStream);
            DeviceStream.Seek(448, SeekOrigin.Current);

            // Failsafe .. be sure FAT partition table is valid
            if ((DeviceStream.ReadByte() != 0x55) || (DeviceStream.ReadByte() != 0xAA))
            {
                bootSector = null;
                return;
            }

            // Get FAT sector
            BinaryReader br = new BinaryReader(DeviceStream);

            data = new UInt16[bootSector.NumberOfFATs * ((bootSector.SectorsPerFAT * PhysicalDevice.SectorSize) / 2)];
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = br.ReadUInt16();
            }
        }
Example #2
0
        /// <summary>
        /// Refreshes the device.
        /// </summary>
        public void Refresh()
        {
            if (deviceStream == null)
            {
                return;
            }

            logicalDevices = null;
            ArrayList logicalDeviceList = new ArrayList();

            deviceStream.Seek(0, SeekOrigin.Begin);
            BinaryReader br = new BinaryReader(deviceStream);

            // Read the MBR
            byte[] sector = br.ReadBytes(SectorSize);
            // Failsafe .. be sure MBR is vaild
            if ((sector[0x01FE] != 0x55) || (sector[0x01FF] != 0xAA))
            {
                Console.WriteLine("Corrupt MBR; exiting");
                return;
            }

            // Partition table
            int p = 0x01BE;   // Beginning of partition table

            for (int i = 0; i < 4; i++, p += 16)
            {
                PartitionTable partition = (PartitionTable)StreamActivator.CreateInstance(typeof(PartitionTable), sector, p);
                if (partition.SysId == 0)
                {
                    continue;
                }
                logicalDeviceList.Add(new LogicalDevice(this, partition));
            }

            logicalDevices = (LogicalDevice[])logicalDeviceList.ToArray(typeof(LogicalDevice));
        }
Example #3
0
        /// <summary>
        /// Enumerates the file entries contained in the current directory.
        /// </summary>
        private FileEntry[] EnumerateFileEntries(uint clusterNumber, bool includeFiles, bool includeDirectories, bool deleted, bool currentOnly, bool parentOnly)
        {
            ArrayList files  = new ArrayList();
            uint      sector = (uint)(device.RootDirectorySector + ((((clusterNumber == 0) ? (0) : (clusterNumber + 2))) * device.BootSector.SectorsPerCluster));

            // Jump to next directory sector
            DeviceStream.Seek((device.Partition.RelativeSector + sector) * device.BootSector.BytesPerSector, SeekOrigin.Begin);
            while (true)
            {
                FileEntry file = (FileEntry)StreamActivator.CreateInstance(typeof(FileEntry), DeviceStream);
                if (file.FileAttributes == FileAttributes.LongFileName)
                {
                    continue;
                }
                if (file.Name[0] == 0x00)
                {
                    break;  // No more entries
                }
                if (currentOnly)
                {
                    if ((clusterNumber == 0) && ((file.FileAttributes & FileAttributes.VolumeId) != 0))
                    {
                        files.Add(file);
                    }
                    else if (file.Name == ".          ")
                    {
                        files.Add(file);
                    }
                    continue;
                }
                if (parentOnly)
                {
                    if (file.Name == "..         ")
                    {
                        files.Add(file);
                    }
                    continue;
                }
                // Skip the volume id
                if ((file.FileAttributes & FileAttributes.VolumeId) != 0)
                {
                    continue;
                }

                // Skip deleted/non-deleted entries
                if ((file.Name[0] == '?') != deleted)
                {
                    continue;
                }

                // Show info
                bool isDirectory = ((file.FileAttributes & FileAttributes.Directory) != 0);
                if ((isDirectory) && (!includeDirectories))
                {
                    continue;
                }
                if ((!isDirectory) && (!includeFiles))
                {
                    continue;
                }
                files.Add(file);
            }
            return((FileEntry[])files.ToArray(typeof(FileEntry)));
        }