Esempio n. 1
0
        public bool Identify(IFilter imageFilter)
        {
            Stream stream = imageFilter.GetDataForkStream();

            stream.Seek(0, SeekOrigin.Begin);

            if (stream.Length < 0x200)
            {
                return(false);
            }

            byte[] header = new byte[0x17];
            stream.Read(header, 0, 0x17);

            BluHeader tmpHdr = new BluHeader {
                DeviceName = new byte[0x0D]
            };

            BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;

            Array.Copy(header, 0, tmpHdr.DeviceName, 0, 0x0D);
            tmpHdr.DeviceType    = BigEndianBitConverter.ToUInt32(header, 0x0C) & 0x00FFFFFF;
            tmpHdr.DeviceBlocks  = BigEndianBitConverter.ToUInt32(header, 0x11) & 0x00FFFFFF;
            tmpHdr.BytesPerBlock = BigEndianBitConverter.ToUInt16(header, 0x15);

            for (int i = 0; i < 0xD; i++)
            {
                if (tmpHdr.DeviceName[i] < 0x20)
                {
                    return(false);
                }
            }

            return((tmpHdr.BytesPerBlock & 0xFE00) == 0x200);
        }
Esempio n. 2
0
        public bool Open(IFilter imageFilter)
        {
            Stream stream = imageFilter.GetDataForkStream();

            stream.Seek(0, SeekOrigin.Begin);

            imageHeader = new BluHeader {
                DeviceName = new byte[0x0D]
            };
            BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;

            byte[] header = new byte[0x17];
            stream.Read(header, 0, 0x17);
            Array.Copy(header, 0, imageHeader.DeviceName, 0, 0x0D);
            imageHeader.DeviceType    = BigEndianBitConverter.ToUInt32(header, 0x0C) & 0x00FFFFFF;
            imageHeader.DeviceBlocks  = BigEndianBitConverter.ToUInt32(header, 0x11) & 0x00FFFFFF;
            imageHeader.BytesPerBlock = BigEndianBitConverter.ToUInt16(header, 0x15);

            DicConsole.DebugWriteLine("BLU plugin", "ImageHeader.deviceName = \"{0}\"",
                                      StringHandlers.CToString(imageHeader.DeviceName));
            DicConsole.DebugWriteLine("BLU plugin", "ImageHeader.deviceType = {0}", imageHeader.DeviceType);
            DicConsole.DebugWriteLine("BLU plugin", "ImageHeader.deviceBlock = {0}", imageHeader.DeviceBlocks);
            DicConsole.DebugWriteLine("BLU plugin", "ImageHeader.bytesPerBlock = {0}", imageHeader.BytesPerBlock);

            for (int i = 0; i < 0xD; i++)
            {
                if (imageHeader.DeviceName[i] < 0x20)
                {
                    return(false);
                }
            }

            if ((imageHeader.BytesPerBlock & 0xFE00) != 0x200)
            {
                return(false);
            }

            stream.Seek(0, SeekOrigin.Begin);
            header = new byte[imageHeader.BytesPerBlock];
            stream.Read(header, 0, imageHeader.BytesPerBlock);

            imageInfo.SectorSize = 0x200;

            imageInfo.Sectors   = imageHeader.DeviceBlocks;
            imageInfo.ImageSize = imageHeader.DeviceBlocks * imageHeader.BytesPerBlock;
            bptag = imageHeader.BytesPerBlock - 0x200;
            byte[] hdrTag = new byte[bptag];
            Array.Copy(header, 0x200, hdrTag, 0, bptag);

            switch (StringHandlers.CToString(imageHeader.DeviceName))
            {
            case PROFILE_NAME:
                imageInfo.MediaType =
                    imageInfo.Sectors == 0x2600 ? MediaType.AppleProfile : MediaType.GENERIC_HDD;
                imageInfo.Cylinders       = 152;
                imageInfo.Heads           = 4;
                imageInfo.SectorsPerTrack = 16;
                break;

            case PROFILE10_NAME:
                imageInfo.MediaType =
                    imageInfo.Sectors == 0x4C00 ? MediaType.AppleProfile : MediaType.GENERIC_HDD;
                imageInfo.Cylinders       = 304;
                imageInfo.Heads           = 4;
                imageInfo.SectorsPerTrack = 16;
                break;

            case WIDGET_NAME:
                imageInfo.MediaType =
                    imageInfo.Sectors == 0x4C00 ? MediaType.AppleWidget : MediaType.GENERIC_HDD;
                imageInfo.Cylinders       = 304;
                imageInfo.Heads           = 4;
                imageInfo.SectorsPerTrack = 16;
                break;

            case PRIAM_NAME:
                imageInfo.MediaType =
                    imageInfo.Sectors == 0x022C7C ? MediaType.PriamDataTower : MediaType.GENERIC_HDD;
                // This values are invented...
                imageInfo.Cylinders       = 419;
                imageInfo.Heads           = 4;
                imageInfo.SectorsPerTrack = 85;
                break;

            default:
                imageInfo.MediaType       = MediaType.GENERIC_HDD;
                imageInfo.Cylinders       = (uint)(imageInfo.Sectors / 16 / 63);
                imageInfo.Heads           = 16;
                imageInfo.SectorsPerTrack = 63;
                break;
            }

            imageInfo.Application = StringHandlers.CToString(hdrTag);

            imageInfo.CreationTime         = imageFilter.GetCreationTime();
            imageInfo.LastModificationTime = imageFilter.GetLastWriteTime();
            imageInfo.MediaTitle           = Path.GetFileNameWithoutExtension(imageFilter.GetFilename());

            bluImageFilter = imageFilter;

            imageInfo.XmlMediaType = XmlMediaType.BlockMedia;

            if (bptag > 0)
            {
                imageInfo.ReadableSectorTags.Add(SectorTagType.AppleSectorTag);
            }

            DicConsole.VerboseWriteLine("BLU image contains a disk of type {0}", imageInfo.MediaType);

            return(true);
        }