Beispiel #1
0
        public bool GetInformation(IMediaImage imagePlugin, out List <CommonTypes.Partition> partitions,
                                   ulong sectorOffset)
        {
            partitions = new List <CommonTypes.Partition>();

            if (42 + sectorOffset >= imagePlugin.Info.Sectors)
            {
                return(false);
            }

            byte[] tblsector = imagePlugin.ReadSector(42 + sectorOffset);

            GCHandle handle = GCHandle.Alloc(tblsector, GCHandleType.Pinned);
            Partable xnxtbl = (Partable)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Partable));

            handle.Free();

            DicConsole.DebugWriteLine("XENIX plugin", "xnxtbl.p_magic = 0x{0:X4} (should be 0x{1:X4})", xnxtbl.p_magic,
                                      PAMAGIC);

            if (xnxtbl.p_magic != PAMAGIC)
            {
                return(false);
            }

            for (int i = 0; i < MAXPARTS; i++)
            {
                DicConsole.DebugWriteLine("XENIX plugin", "xnxtbl.p[{0}].p_off = {1}", i, xnxtbl.p[i].p_off);
                DicConsole.DebugWriteLine("XENIX plugin", "xnxtbl.p[{0}].p_size = {1}", i, xnxtbl.p[i].p_size);
                if (xnxtbl.p[i].p_size <= 0)
                {
                    continue;
                }

                CommonTypes.Partition part = new CommonTypes.Partition
                {
                    Start =
                        (ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) / imagePlugin.Info.SectorSize +
                        sectorOffset,
                    Length = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE) / imagePlugin.Info.SectorSize,
                    Offset =
                        (ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) +
                        imagePlugin.Info.SectorSize * sectorOffset,
                    Size     = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE),
                    Sequence = (ulong)i,
                    Type     = "XENIX",
                    Scheme   = Name
                };

                if (part.End < imagePlugin.Info.Sectors)
                {
                    partitions.Add(part);
                }
            }

            return(partitions.Count > 0);
        }
Beispiel #2
0
        public bool GetInformation(IMediaImage imagePlugin, out List <CommonTypes.Partition> partitions,
                                   ulong sectorOffset)
        {
            partitions = new List <CommonTypes.Partition>();

            if (42 + sectorOffset >= imagePlugin.Info.Sectors)
            {
                return(false);
            }

            byte[] tblsector = imagePlugin.ReadSector(42 + sectorOffset);

            Partable xnxtbl = Marshal.ByteArrayToStructureLittleEndian <Partable>(tblsector);

            AaruConsole.DebugWriteLine("XENIX plugin", "xnxtbl.p_magic = 0x{0:X4} (should be 0x{1:X4})", xnxtbl.p_magic,
                                       PAMAGIC);

            if (xnxtbl.p_magic != PAMAGIC)
            {
                return(false);
            }

            for (int i = 0; i < MAXPARTS; i++)
            {
                AaruConsole.DebugWriteLine("XENIX plugin", "xnxtbl.p[{0}].p_off = {1}", i, xnxtbl.p[i].p_off);
                AaruConsole.DebugWriteLine("XENIX plugin", "xnxtbl.p[{0}].p_size = {1}", i, xnxtbl.p[i].p_size);

                if (xnxtbl.p[i].p_size <= 0)
                {
                    continue;
                }

                var part = new CommonTypes.Partition
                {
                    Start = ((ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) / imagePlugin.Info.SectorSize) +
                            sectorOffset,
                    Length = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE) / imagePlugin.Info.SectorSize,
                    Offset = (ulong)((xnxtbl.p[i].p_off + XENIX_OFFSET) * XENIX_BSIZE) +
                             (imagePlugin.Info.SectorSize * sectorOffset),
                    Size     = (ulong)(xnxtbl.p[i].p_size * XENIX_BSIZE),
                    Sequence = (ulong)i,
                    Type     = "XENIX",
                    Scheme   = Name
                };

                if (part.End < imagePlugin.Info.Sectors)
                {
                    partitions.Add(part);
                }
            }

            return(partitions.Count > 0);
        }