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); }
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); }
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); }
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); }