Esempio n. 1
0
        public static ModeHeader?DecodeModeHeader6(byte[] modeResponse, PeripheralDeviceTypes deviceType)
        {
            if (modeResponse == null || modeResponse.Length < 4 || modeResponse.Length < modeResponse[0] + 1)
            {
                return(null);
            }

            ModeHeader header = new ModeHeader {
                MediumType = (MediumTypes)modeResponse[1]
            };

            if (modeResponse[3] > 0)
            {
                header.BlockDescriptors = new BlockDescriptor[modeResponse[3] / 8];
                for (int i = 0; i < header.BlockDescriptors.Length; i++)
                {
                    header.BlockDescriptors[i].Density      = (DensityType)modeResponse[0 + i * 8 + 4];
                    header.BlockDescriptors[i].Blocks      += (ulong)(modeResponse[1 + i * 8 + 4] << 16);
                    header.BlockDescriptors[i].Blocks      += (ulong)(modeResponse[2 + i * 8 + 4] << 8);
                    header.BlockDescriptors[i].Blocks      += modeResponse[3 + i * 8 + 4];
                    header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[5 + i * 8 + 4] << 16);
                    header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[6 + i * 8 + 4] << 8);
                    header.BlockDescriptors[i].BlockLength += modeResponse[7 + i * 8 + 4];
                }
            }

            switch (deviceType)
            {
            case PeripheralDeviceTypes.DirectAccess:
            case PeripheralDeviceTypes.MultiMediaDevice:
                header.WriteProtected = (modeResponse[2] & 0x80) == 0x80;
                header.DPOFUA         = (modeResponse[2] & 0x10) == 0x10;
                break;

            case PeripheralDeviceTypes.SequentialAccess:
                header.WriteProtected = (modeResponse[2] & 0x80) == 0x80;
                header.Speed          = (byte)(modeResponse[2] & 0x0F);
                header.BufferedMode   = (byte)((modeResponse[2] & 0x70) >> 4);
                break;

            case PeripheralDeviceTypes.PrinterDevice:
                header.BufferedMode = (byte)((modeResponse[2] & 0x70) >> 4);
                break;

            case PeripheralDeviceTypes.OpticalDevice:
                header.WriteProtected = (modeResponse[2] & 0x80) == 0x80;
                header.EBC            = (modeResponse[2] & 0x01) == 0x01;
                header.DPOFUA         = (modeResponse[2] & 0x10) == 0x10;
                break;
            }

            return(header);
        }
Esempio n. 2
0
        public static ModeHeader?DecodeModeHeader10(byte[] modeResponse, PeripheralDeviceTypes deviceType)
        {
            if (modeResponse == null || modeResponse.Length < 8)
            {
                return(null);
            }

            ushort modeLength      = (ushort)((modeResponse[0] << 8) + modeResponse[1]);
            ushort blockDescLength = (ushort)((modeResponse[6] << 8) + modeResponse[7]);

            if (modeResponse.Length < modeLength)
            {
                return(null);
            }

            ModeHeader header = new ModeHeader {
                MediumType = (MediumTypes)modeResponse[2]
            };

            bool longLBA = (modeResponse[4] & 0x01) == 0x01;

            if (blockDescLength > 0)
            {
                if (longLBA)
                {
                    header.BlockDescriptors = new BlockDescriptor[blockDescLength / 16];
                    for (int i = 0; i < header.BlockDescriptors.Length; i++)
                    {
                        if (12 + i * 16 + 8 >= modeResponse.Length)
                        {
                            break;
                        }

                        header.BlockDescriptors[i] = new BlockDescriptor {
                            Density = DensityType.Default
                        };
                        byte[] temp = new byte[8];
                        temp[0] = modeResponse[7 + i * 16 + 8];
                        temp[1] = modeResponse[6 + i * 16 + 8];
                        temp[2] = modeResponse[5 + i * 16 + 8];
                        temp[3] = modeResponse[4 + i * 16 + 8];
                        temp[4] = modeResponse[3 + i * 16 + 8];
                        temp[5] = modeResponse[2 + i * 16 + 8];
                        temp[6] = modeResponse[1 + i * 16 + 8];
                        temp[7] = modeResponse[0 + i * 16 + 8];
                        header.BlockDescriptors[i].Blocks       = BitConverter.ToUInt64(temp, 0);
                        header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[15 + i * 16 + 8] << 24);
                        header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[14 + i * 16 + 8] << 16);
                        header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[13 + i * 16 + 8] << 8);
                        header.BlockDescriptors[i].BlockLength += modeResponse[12 + i * 16 + 8];
                    }
                }
                else
                {
                    header.BlockDescriptors = new BlockDescriptor[blockDescLength / 8];
                    for (int i = 0; i < header.BlockDescriptors.Length; i++)
                    {
                        if (7 + i * 8 + 8 >= modeResponse.Length)
                        {
                            break;
                        }

                        header.BlockDescriptors[i] = new BlockDescriptor();
                        if (deviceType != PeripheralDeviceTypes.DirectAccess)
                        {
                            header.BlockDescriptors[i].Density = (DensityType)modeResponse[0 + i * 8 + 8];
                        }
                        else
                        {
                            header.BlockDescriptors[i].Density = DensityType.Default;
                            header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[0 + i * 8 + 8] << 24);
                        }

                        header.BlockDescriptors[i].Blocks      += (ulong)(modeResponse[1 + i * 8 + 8] << 16);
                        header.BlockDescriptors[i].Blocks      += (ulong)(modeResponse[2 + i * 8 + 8] << 8);
                        header.BlockDescriptors[i].Blocks      += modeResponse[3 + i * 8 + 8];
                        header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[5 + i * 8 + 8] << 16);
                        header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[6 + i * 8 + 8] << 8);
                        header.BlockDescriptors[i].BlockLength += modeResponse[7 + i * 8 + 8];
                    }
                }
            }

            switch (deviceType)
            {
            case PeripheralDeviceTypes.DirectAccess:
            case PeripheralDeviceTypes.MultiMediaDevice:
                header.WriteProtected = (modeResponse[3] & 0x80) == 0x80;
                header.DPOFUA         = (modeResponse[3] & 0x10) == 0x10;
                break;

            case PeripheralDeviceTypes.SequentialAccess:
                header.WriteProtected = (modeResponse[3] & 0x80) == 0x80;
                header.Speed          = (byte)(modeResponse[3] & 0x0F);
                header.BufferedMode   = (byte)((modeResponse[3] & 0x70) >> 4);
                break;

            case PeripheralDeviceTypes.PrinterDevice:
                header.BufferedMode = (byte)((modeResponse[3] & 0x70) >> 4);
                break;

            case PeripheralDeviceTypes.OpticalDevice:
                header.WriteProtected = (modeResponse[3] & 0x80) == 0x80;
                header.EBC            = (modeResponse[3] & 0x01) == 0x01;
                header.DPOFUA         = (modeResponse[3] & 0x10) == 0x10;
                break;
            }

            return(header);
        }
Esempio n. 3
0
        public static byte[] EncodeModeHeader10(ModeHeader header, PeripheralDeviceTypes deviceType,
                                                bool longLBA = false)
        {
            byte[] hdr;

            if (header.BlockDescriptors != null)
            {
                hdr = longLBA
                          ? new byte[8 + header.BlockDescriptors.Length * 16]
                          : new byte[8 + header.BlockDescriptors.Length * 8];
            }
            else
            {
                hdr = new byte[8];
            }

            hdr[2] = (byte)header.MediumType;

            switch (deviceType)
            {
            case PeripheralDeviceTypes.DirectAccess:
            case PeripheralDeviceTypes.MultiMediaDevice:
                if (header.WriteProtected)
                {
                    hdr[3] += 0x80;
                }
                if (header.DPOFUA)
                {
                    hdr[3] += 0x10;
                }
                break;

            case PeripheralDeviceTypes.SequentialAccess:
                if (header.WriteProtected)
                {
                    hdr[3] += 0x80;
                }
                hdr[3] += (byte)(header.Speed & 0x0F);
                hdr[3] += (byte)((header.BufferedMode << 4) & 0x70);
                break;

            case PeripheralDeviceTypes.PrinterDevice:
                hdr[3] += (byte)((header.BufferedMode << 4) & 0x70);
                break;

            case PeripheralDeviceTypes.OpticalDevice:
                if (header.WriteProtected)
                {
                    hdr[3] += 0x80;
                }
                if (header.EBC)
                {
                    hdr[3] += 0x01;
                }
                if (header.DPOFUA)
                {
                    hdr[3] += 0x10;
                }
                break;
            }

            if (longLBA)
            {
                hdr[4] += 0x01;
            }

            if (header.BlockDescriptors == null)
            {
                return(hdr);
            }

            if (longLBA)
            {
                for (int i = 0; i < header.BlockDescriptors.Length; i++)
                {
                    byte[] temp = BitConverter.GetBytes(header.BlockDescriptors[i].Blocks);
                    hdr[7 + i * 16 + 8]  = temp[0];
                    hdr[6 + i * 16 + 8]  = temp[1];
                    hdr[5 + i * 16 + 8]  = temp[2];
                    hdr[4 + i * 16 + 8]  = temp[3];
                    hdr[3 + i * 16 + 8]  = temp[4];
                    hdr[2 + i * 16 + 8]  = temp[5];
                    hdr[1 + i * 16 + 8]  = temp[6];
                    hdr[0 + i * 16 + 8]  = temp[7];
                    hdr[12 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF000000) >> 24);
                    hdr[13 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16);
                    hdr[14 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8);
                    hdr[15 + i * 16 + 8] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF);
                }
            }
            else
            {
                for (int i = 0; i < header.BlockDescriptors.Length; i++)
                {
                    if (deviceType != PeripheralDeviceTypes.DirectAccess)
                    {
                        hdr[0 + i * 8 + 8] = (byte)header.BlockDescriptors[i].Density;
                    }
                    else
                    {
                        hdr[0 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF000000) >> 24);
                    }
                    hdr[1 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF0000) >> 16);
                    hdr[2 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF00) >> 8);
                    hdr[3 + i * 8 + 8] = (byte)(header.BlockDescriptors[i].Blocks & 0xFF);
                    hdr[5 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16);
                    hdr[6 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8);
                    hdr[7 + i * 8 + 8] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF);
                }
            }

            return(hdr);
        }
Esempio n. 4
0
        public static byte[] EncodeModeHeader6(ModeHeader header, PeripheralDeviceTypes deviceType)
        {
            byte[] hdr = header.BlockDescriptors != null
                             ? new byte[4 + header.BlockDescriptors.Length * 8]
                             : new byte[4];

            hdr[1] = (byte)header.MediumType;

            switch (deviceType)
            {
            case PeripheralDeviceTypes.DirectAccess:
            case PeripheralDeviceTypes.MultiMediaDevice:
                if (header.WriteProtected)
                {
                    hdr[2] += 0x80;
                }
                if (header.DPOFUA)
                {
                    hdr[2] += 0x10;
                }
                break;

            case PeripheralDeviceTypes.SequentialAccess:
                if (header.WriteProtected)
                {
                    hdr[2] += 0x80;
                }
                hdr[2] += (byte)(header.Speed & 0x0F);
                hdr[2] += (byte)((header.BufferedMode << 4) & 0x70);
                break;

            case PeripheralDeviceTypes.PrinterDevice:
                hdr[2] += (byte)((header.BufferedMode << 4) & 0x70);
                break;

            case PeripheralDeviceTypes.OpticalDevice:
                if (header.WriteProtected)
                {
                    hdr[2] += 0x80;
                }
                if (header.EBC)
                {
                    hdr[2] += 0x01;
                }
                if (header.DPOFUA)
                {
                    hdr[2] += 0x10;
                }
                break;
            }

            if (header.BlockDescriptors == null)
            {
                return(hdr);
            }

            hdr[3] = (byte)(header.BlockDescriptors.Length * 8);

            for (int i = 0; i < header.BlockDescriptors.Length; i++)
            {
                hdr[0 + i * 8 + 4] = (byte)header.BlockDescriptors[i].Density;
                hdr[1 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF0000) >> 16);
                hdr[2 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF00) >> 8);
                hdr[3 + i * 8 + 4] = (byte)(header.BlockDescriptors[i].Blocks & 0xFF);
                hdr[5 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16);
                hdr[6 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8);
                hdr[7 + i * 8 + 4] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF);
            }

            return(hdr);
        }