mirror of
https://github.com/aaru-dps/Aaru.Decoders.git
synced 2025-12-16 19:24:32 +00:00
Code reformat.
This commit is contained in:
125
PCMCIA/CIS.cs
125
PCMCIA/CIS.cs
@@ -38,9 +38,8 @@ using System.Text;
|
||||
|
||||
namespace DiscImageChef.Decoders.PCMCIA
|
||||
{
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class CIS
|
||||
{
|
||||
// TODO: Handle links? Or are they removed in lower layers of the operating system drivers?
|
||||
@@ -51,15 +50,21 @@ namespace DiscImageChef.Decoders.PCMCIA
|
||||
|
||||
while(position < data.Length)
|
||||
{
|
||||
Tuple tuple = new Tuple {Code = (TupleCodes)data[position]};
|
||||
var tuple = new Tuple
|
||||
{
|
||||
Code = (TupleCodes)data[position]
|
||||
};
|
||||
|
||||
if(tuple.Code == TupleCodes.CISTPL_NULL) continue;
|
||||
if(tuple.Code == TupleCodes.CISTPL_NULL)
|
||||
continue;
|
||||
|
||||
if(tuple.Code == TupleCodes.CISTPL_END) break;
|
||||
if(tuple.Code == TupleCodes.CISTPL_END)
|
||||
break;
|
||||
|
||||
tuple.Link = data[position + 1];
|
||||
|
||||
if(position + 2 + tuple.Link > data.Length) break;
|
||||
if(position + 2 + tuple.Link > data.Length)
|
||||
break;
|
||||
|
||||
tuple.Data = new byte[tuple.Link + 2];
|
||||
Array.Copy(data, position, tuple.Data, 0, tuple.Link + 2);
|
||||
@@ -73,31 +78,35 @@ namespace DiscImageChef.Decoders.PCMCIA
|
||||
|
||||
public static DeviceGeometryTuple DecodeDeviceGeometryTuple(Tuple tuple)
|
||||
{
|
||||
if(tuple == null) return null;
|
||||
if(tuple == null)
|
||||
return null;
|
||||
|
||||
if(tuple.Code != TupleCodes.CISTPL_DEVICEGEO && tuple.Code != TupleCodes.CISTPL_DEVICEGEO_A) return null;
|
||||
if(tuple.Code != TupleCodes.CISTPL_DEVICEGEO &&
|
||||
tuple.Code != TupleCodes.CISTPL_DEVICEGEO_A)
|
||||
return null;
|
||||
|
||||
return tuple.Data == null ? null : DecodeDeviceGeometryTuple(tuple.Data);
|
||||
}
|
||||
|
||||
public static DeviceGeometryTuple DecodeDeviceGeometryTuple(byte[] data)
|
||||
{
|
||||
if((data?.Length - 2) % 6 != 0) return null;
|
||||
if((data?.Length - 2) % 6 != 0)
|
||||
return null;
|
||||
|
||||
DeviceGeometryTuple tuple = new DeviceGeometryTuple();
|
||||
var tuple = new DeviceGeometryTuple();
|
||||
List<DeviceGeometry> geometries = new List<DeviceGeometry>();
|
||||
|
||||
for(int position = 2; position < data.Length; position += 6)
|
||||
{
|
||||
DeviceGeometry geometry = new DeviceGeometry
|
||||
var geometry = new DeviceGeometry
|
||||
{
|
||||
CardInterface = data[position],
|
||||
EraseBlockSize = data[position + 1],
|
||||
ReadBlockSize = data[position + 2],
|
||||
WriteBlockSize = data[position + 3],
|
||||
Partitions = data[position + 4],
|
||||
Interleaving = data[position + 5]
|
||||
CardInterface = data[position], EraseBlockSize = data[position + 1],
|
||||
ReadBlockSize = data[position + 2],
|
||||
WriteBlockSize = data[position + 3],
|
||||
Partitions = data[position + 4],
|
||||
Interleaving = data[position + 5]
|
||||
};
|
||||
|
||||
geometries.Add(geometry);
|
||||
}
|
||||
|
||||
@@ -110,22 +119,30 @@ namespace DiscImageChef.Decoders.PCMCIA
|
||||
|
||||
public static string PrettifyDeviceGeometryTuple(DeviceGeometryTuple tuple)
|
||||
{
|
||||
if(tuple == null) return null;
|
||||
if(tuple == null)
|
||||
return null;
|
||||
|
||||
if(tuple.Code != TupleCodes.CISTPL_DEVICEGEO && tuple.Code != TupleCodes.CISTPL_DEVICEGEO_A) return null;
|
||||
if(tuple.Code != TupleCodes.CISTPL_DEVICEGEO &&
|
||||
tuple.Code != TupleCodes.CISTPL_DEVICEGEO_A)
|
||||
return null;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendLine("PCMCIA Device Geometry Tuples:");
|
||||
|
||||
foreach(DeviceGeometry geometry in tuple.Geometries)
|
||||
{
|
||||
sb.AppendLine("\tGeometry:");
|
||||
sb.AppendFormat("\t\tDevice width: {0} bits", (1 << (geometry.CardInterface - 1)) * 8).AppendLine();
|
||||
|
||||
sb.AppendFormat("\t\tErase block = {0} bytes",
|
||||
(1 << (geometry.EraseBlockSize - 1)) * (1 << (geometry.Interleaving - 1))).AppendLine();
|
||||
|
||||
sb.AppendFormat("\t\tRead block = {0} bytes",
|
||||
(1 << (geometry.ReadBlockSize - 1)) * (1 << (geometry.Interleaving - 1))).AppendLine();
|
||||
|
||||
sb.AppendFormat("\t\tWrite block = {0} bytes",
|
||||
(1 << (geometry.WriteBlockSize - 1)) * (1 << (geometry.Interleaving - 1))).AppendLine();
|
||||
|
||||
sb.AppendFormat("\t\tPartition alignment = {0} bytes",
|
||||
(1 << (geometry.EraseBlockSize - 1)) * (1 << (geometry.Interleaving - 1)) *
|
||||
(1 << (geometry.Partitions - 1))).AppendLine();
|
||||
@@ -142,31 +159,33 @@ namespace DiscImageChef.Decoders.PCMCIA
|
||||
|
||||
public static ManufacturerIdentificationTuple DecodeManufacturerIdentificationTuple(Tuple tuple)
|
||||
{
|
||||
if(tuple?.Code != TupleCodes.CISTPL_MANFID) return null;
|
||||
if(tuple?.Code != TupleCodes.CISTPL_MANFID)
|
||||
return null;
|
||||
|
||||
return tuple.Data == null ? null : DecodeManufacturerIdentificationTuple(tuple.Data);
|
||||
}
|
||||
|
||||
public static ManufacturerIdentificationTuple DecodeManufacturerIdentificationTuple(byte[] data)
|
||||
{
|
||||
if(data == null) return null;
|
||||
if(data == null)
|
||||
return null;
|
||||
|
||||
if(data.Length < 6) return null;
|
||||
if(data.Length < 6)
|
||||
return null;
|
||||
|
||||
return new ManufacturerIdentificationTuple
|
||||
{
|
||||
Code = (TupleCodes)data[0],
|
||||
Link = data[1],
|
||||
ManufacturerID = BitConverter.ToUInt16(data, 2),
|
||||
CardID = BitConverter.ToUInt16(data, 4)
|
||||
Code = (TupleCodes)data[0], Link = data[1], ManufacturerID = BitConverter.ToUInt16(data, 2),
|
||||
CardID = BitConverter.ToUInt16(data, 4)
|
||||
};
|
||||
}
|
||||
|
||||
public static string PrettifyManufacturerIdentificationTuple(ManufacturerIdentificationTuple tuple)
|
||||
{
|
||||
if(tuple?.Code != TupleCodes.CISTPL_MANFID) return null;
|
||||
if(tuple?.Code != TupleCodes.CISTPL_MANFID)
|
||||
return null;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendLine("PCMCIA Manufacturer Identification Tuple:");
|
||||
sb.AppendFormat("\tManufacturer ID: {0}", VendorCode.Prettify(tuple.ManufacturerID)).AppendLine();
|
||||
sb.AppendFormat("\tCard ID:D 0x{0:X4}", tuple.CardID).AppendLine();
|
||||
@@ -182,40 +201,46 @@ namespace DiscImageChef.Decoders.PCMCIA
|
||||
|
||||
public static Level1VersionTuple DecodeLevel1VersionTuple(Tuple tuple)
|
||||
{
|
||||
if(tuple?.Code != TupleCodes.CISTPL_VERS_1) return null;
|
||||
if(tuple?.Code != TupleCodes.CISTPL_VERS_1)
|
||||
return null;
|
||||
|
||||
return tuple.Data == null ? null : DecodeLevel1VersionTuple(tuple.Data);
|
||||
}
|
||||
|
||||
public static Level1VersionTuple DecodeLevel1VersionTuple(byte[] data)
|
||||
{
|
||||
if(data == null) return null;
|
||||
if(data == null)
|
||||
return null;
|
||||
|
||||
if(data.Length < 4) return null;
|
||||
if(data.Length < 4)
|
||||
return null;
|
||||
|
||||
List<byte> buffer = new List<byte>();
|
||||
List<string> strings = null;
|
||||
bool firstString = false;
|
||||
bool secondString = false;
|
||||
|
||||
Level1VersionTuple tuple = new Level1VersionTuple
|
||||
var tuple = new Level1VersionTuple
|
||||
{
|
||||
Code = (TupleCodes)data[0], Link = data[1], MajorVersion = data[2], MinorVersion = data[3]
|
||||
};
|
||||
|
||||
for(int position = 4; position < data.Length; position++)
|
||||
{
|
||||
if(data[position] == 0xFF) break;
|
||||
if(data[position] == 0xFF)
|
||||
break;
|
||||
|
||||
buffer.Add(data[position]);
|
||||
|
||||
if(data[position] != 0x00) continue;
|
||||
if(data[position] != 0x00)
|
||||
continue;
|
||||
|
||||
if(!firstString)
|
||||
{
|
||||
tuple.Manufacturer = StringHandlers.CToString(buffer.ToArray());
|
||||
buffer = new List<byte>();
|
||||
firstString = true;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -225,41 +250,51 @@ namespace DiscImageChef.Decoders.PCMCIA
|
||||
tuple.Product = StringHandlers.CToString(buffer.ToArray());
|
||||
buffer = new List<byte>();
|
||||
firstString = true;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if(strings == null) strings = new List<string>();
|
||||
if(strings == null)
|
||||
strings = new List<string>();
|
||||
|
||||
strings.Add(StringHandlers.CToString(buffer.ToArray()));
|
||||
buffer = new List<byte>();
|
||||
}
|
||||
|
||||
if(strings != null) tuple.AdditionalInformation = strings.ToArray();
|
||||
if(strings != null)
|
||||
tuple.AdditionalInformation = strings.ToArray();
|
||||
|
||||
return tuple;
|
||||
}
|
||||
|
||||
public static string PrettifyLevel1VersionTuple(Level1VersionTuple tuple)
|
||||
{
|
||||
if(tuple?.Code != TupleCodes.CISTPL_VERS_1) return null;
|
||||
if(tuple?.Code != TupleCodes.CISTPL_VERS_1)
|
||||
return null;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendLine("PCMCIA Level 1 Version / Product Information Tuple:");
|
||||
|
||||
sb.AppendFormat("\tCard indicates compliance with PC Card Standard Release {0}.{1}", tuple.MajorVersion,
|
||||
tuple.MinorVersion).AppendLine();
|
||||
|
||||
if(string.IsNullOrEmpty(tuple.Manufacturer)) sb.AppendLine("\tNo manufacturer information string.");
|
||||
else sb.AppendFormat("\tManufacturer: {0}", tuple.Manufacturer).AppendLine();
|
||||
if(string.IsNullOrEmpty(tuple.Manufacturer))
|
||||
sb.AppendLine("\tNo manufacturer information string.");
|
||||
else
|
||||
sb.AppendFormat("\tManufacturer: {0}", tuple.Manufacturer).AppendLine();
|
||||
|
||||
if(string.IsNullOrEmpty(tuple.Product)) sb.AppendLine("\tNo product name string.");
|
||||
else sb.AppendFormat("\tProduct name: {0}", tuple.Product).AppendLine();
|
||||
if(string.IsNullOrEmpty(tuple.Product))
|
||||
sb.AppendLine("\tNo product name string.");
|
||||
else
|
||||
sb.AppendFormat("\tProduct name: {0}", tuple.Product).AppendLine();
|
||||
|
||||
if(tuple.AdditionalInformation == null || tuple.AdditionalInformation.Length == 0)
|
||||
if(tuple.AdditionalInformation == null ||
|
||||
tuple.AdditionalInformation.Length == 0)
|
||||
sb.AppendLine("\tNo additional information.");
|
||||
else
|
||||
{
|
||||
sb.AppendLine("\tAdditional information:");
|
||||
|
||||
foreach(string info in tuple.AdditionalInformation.Where(info => !string.IsNullOrEmpty(info)))
|
||||
sb.AppendFormat("\t\t{0}", info).AppendLine();
|
||||
}
|
||||
|
||||
299
PCMCIA/Enums.cs
299
PCMCIA/Enums.cs
@@ -34,263 +34,88 @@ using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
namespace DiscImageChef.Decoders.PCMCIA
|
||||
{
|
||||
/// <summary>
|
||||
/// Tuple codes.
|
||||
/// </summary>
|
||||
/// <summary>Tuple codes.</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
public enum TupleCodes : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// Checksum control
|
||||
/// </summary>
|
||||
CISTPL_CHECKSUM = 0x10,
|
||||
/// <summary>
|
||||
/// End-of-chain
|
||||
/// </summary>
|
||||
CISTPL_END = 0xFF,
|
||||
/// <summary>
|
||||
/// Indirect access PC Card memory
|
||||
/// </summary>
|
||||
CISTPL_INDIRECT = 0x03,
|
||||
/// <summary>
|
||||
/// Link-target-control
|
||||
/// </summary>
|
||||
CISTPL_LINKTARGET = 0x13,
|
||||
/// <summary>
|
||||
/// Longlink to attribute memory
|
||||
/// </summary>
|
||||
CISTPL_LONGLINK_A = 0x11,
|
||||
/// <summary>
|
||||
/// Longlink to common memory
|
||||
/// </summary>
|
||||
CISTPL_LONGLINK_C = 0x12,
|
||||
/// <summary>
|
||||
/// Longlink to next chain on a Cardbus PC Card
|
||||
/// </summary>
|
||||
CISTPL_LONGLINK_CB = 0x02,
|
||||
/// <summary>
|
||||
/// Longlink to function specific chains
|
||||
/// </summary>
|
||||
CISTPL_LONGLINK_MFC = 0x06,
|
||||
/// <summary>
|
||||
/// No-link to common memory
|
||||
/// </summary>
|
||||
CISTPL_NO_LINK = 0x14,
|
||||
/// <summary>
|
||||
/// Null tuple
|
||||
/// </summary>
|
||||
CISTPL_NULL = 0x00,
|
||||
/// <summary>
|
||||
/// Alternate language string
|
||||
/// </summary>
|
||||
CISTPL_ALTSTR = 0x16,
|
||||
/// <summary>
|
||||
/// Common memory device information
|
||||
/// </summary>
|
||||
CISTPL_DEVICE = 0x01,
|
||||
/// <summary>
|
||||
/// Attribute memory device information
|
||||
/// </summary>
|
||||
CISTPL_DEVICE_A = 0x17,
|
||||
/// <summary>
|
||||
/// Other operating conditions information for attribute memory
|
||||
/// </summary>
|
||||
CISTPL_DEVICE_OA = 0x1D,
|
||||
/// <summary>
|
||||
/// Other operating conditions information for common memory
|
||||
/// </summary>
|
||||
CISTPL_DEVICE_OC = 0x1C,
|
||||
/// <summary>
|
||||
/// Device geometry information for common memory
|
||||
/// </summary>
|
||||
CISTPL_DEVICEGEO = 0x1E,
|
||||
/// <summary>
|
||||
/// Device geometry information for attribute memory
|
||||
/// </summary>
|
||||
CISTPL_DEVICEGEO_A = 0x1F,
|
||||
/// <summary>
|
||||
/// Extended common memory device information
|
||||
/// </summary>
|
||||
CISTPL_EXTDEVIC = 0x09,
|
||||
/// <summary>
|
||||
/// Function extensions
|
||||
/// </summary>
|
||||
CISTPL_FUNCE = 0x22,
|
||||
/// <summary>
|
||||
/// Function class identification
|
||||
/// </summary>
|
||||
CISTPL_FUNCID = 0x21,
|
||||
/// <summary>
|
||||
/// JEDEC programming information for attribute memory
|
||||
/// </summary>
|
||||
CISTPL_JEDEC_A = 0x19,
|
||||
/// <summary>
|
||||
/// JEDEC programming information for common memory
|
||||
/// </summary>
|
||||
CISTPL_JEDEC_C = 0x18,
|
||||
/// <summary>
|
||||
/// Manufacturer identification string
|
||||
/// </summary>
|
||||
CISTPL_MANFID = 0x20,
|
||||
/// <summary>
|
||||
/// Level 1 version/product information
|
||||
/// </summary>
|
||||
CISTPL_VERS_1 = 0x15,
|
||||
/// <summary>
|
||||
/// BAR for a CardBus PC Card
|
||||
/// </summary>
|
||||
CISTPL_BAR = 0x07,
|
||||
/// <summary>
|
||||
/// Configuration-table-entry
|
||||
/// </summary>
|
||||
CISTPL_CFTABLE_ENTRY = 0x1B,
|
||||
/// <summary>
|
||||
/// Configuration-table-entry for a CardBus PC Card
|
||||
/// </summary>
|
||||
CISTPL_CFTABLE_ENTRY_CB = 0x05,
|
||||
/// <summary>
|
||||
/// Configuration tuple for a 16-bit PC Card
|
||||
/// </summary>
|
||||
CISTPL_CONFIG = 0x1A,
|
||||
/// <summary>
|
||||
/// Configuration tuple for a CardBus PC Card
|
||||
/// </summary>
|
||||
CISTPL_CONFIG_CB = 0x04,
|
||||
/// <summary>
|
||||
/// Function state save/restore definition
|
||||
/// </summary>
|
||||
CISTPL_PWR_MGMNT = 0x08,
|
||||
/// <summary>
|
||||
/// Battery replacement date
|
||||
/// </summary>
|
||||
CISTPL_BATTERY = 0x45,
|
||||
/// <summary>
|
||||
/// Card initialization date
|
||||
/// </summary>
|
||||
CISTPL_DATE = 0x44,
|
||||
/// <summary>
|
||||
/// Level 2 version/product information
|
||||
/// </summary>
|
||||
CISTPL_VERS_2 = 0x40,
|
||||
/// <summary>
|
||||
/// Byte ordering for disk-like partitions
|
||||
/// </summary>
|
||||
CISTPL_BYTEORDER = 0x43,
|
||||
/// <summary>
|
||||
/// Data recording format for common memory
|
||||
/// </summary>
|
||||
CISTPL_FORMAT = 0x41,
|
||||
/// <summary>
|
||||
/// Data recording format for attribute memory
|
||||
/// </summary>
|
||||
CISTPL_FORMAT_A = 0x47,
|
||||
/// <summary>
|
||||
/// Partition geometry
|
||||
/// </summary>
|
||||
CISTPL_GEOMETRY = 0x42,
|
||||
/// <summary>
|
||||
/// Software interleaving
|
||||
/// </summary>
|
||||
CISTPL_SWIL = 0x23,
|
||||
/// <summary>
|
||||
/// Partition organization
|
||||
/// </summary>
|
||||
CISTPL_ORG = 0x46,
|
||||
/// <summary>
|
||||
/// Special purpose
|
||||
/// </summary>
|
||||
/// <summary>Checksum control</summary>
|
||||
CISTPL_CHECKSUM = 0x10, /// <summary>End-of-chain</summary>
|
||||
CISTPL_END = 0xFF, /// <summary>Indirect access PC Card memory</summary>
|
||||
CISTPL_INDIRECT = 0x03, /// <summary>Link-target-control</summary>
|
||||
CISTPL_LINKTARGET = 0x13, /// <summary>Longlink to attribute memory</summary>
|
||||
CISTPL_LONGLINK_A = 0x11, /// <summary>Longlink to common memory</summary>
|
||||
CISTPL_LONGLINK_C = 0x12, /// <summary>Longlink to next chain on a Cardbus PC Card</summary>
|
||||
CISTPL_LONGLINK_CB = 0x02, /// <summary>Longlink to function specific chains</summary>
|
||||
CISTPL_LONGLINK_MFC = 0x06, /// <summary>No-link to common memory</summary>
|
||||
CISTPL_NO_LINK = 0x14, /// <summary>Null tuple</summary>
|
||||
CISTPL_NULL = 0x00, /// <summary>Alternate language string</summary>
|
||||
CISTPL_ALTSTR = 0x16, /// <summary>Common memory device information</summary>
|
||||
CISTPL_DEVICE = 0x01, /// <summary>Attribute memory device information</summary>
|
||||
CISTPL_DEVICE_A = 0x17, /// <summary>Other operating conditions information for attribute memory</summary>
|
||||
CISTPL_DEVICE_OA = 0x1D, /// <summary>Other operating conditions information for common memory</summary>
|
||||
CISTPL_DEVICE_OC = 0x1C, /// <summary>Device geometry information for common memory</summary>
|
||||
CISTPL_DEVICEGEO = 0x1E, /// <summary>Device geometry information for attribute memory</summary>
|
||||
CISTPL_DEVICEGEO_A = 0x1F, /// <summary>Extended common memory device information</summary>
|
||||
CISTPL_EXTDEVIC = 0x09, /// <summary>Function extensions</summary>
|
||||
CISTPL_FUNCE = 0x22, /// <summary>Function class identification</summary>
|
||||
CISTPL_FUNCID = 0x21, /// <summary>JEDEC programming information for attribute memory</summary>
|
||||
CISTPL_JEDEC_A = 0x19, /// <summary>JEDEC programming information for common memory</summary>
|
||||
CISTPL_JEDEC_C = 0x18, /// <summary>Manufacturer identification string</summary>
|
||||
CISTPL_MANFID = 0x20, /// <summary>Level 1 version/product information</summary>
|
||||
CISTPL_VERS_1 = 0x15, /// <summary>BAR for a CardBus PC Card</summary>
|
||||
CISTPL_BAR = 0x07, /// <summary>Configuration-table-entry</summary>
|
||||
CISTPL_CFTABLE_ENTRY = 0x1B, /// <summary>Configuration-table-entry for a CardBus PC Card</summary>
|
||||
CISTPL_CFTABLE_ENTRY_CB = 0x05, /// <summary>Configuration tuple for a 16-bit PC Card</summary>
|
||||
CISTPL_CONFIG = 0x1A, /// <summary>Configuration tuple for a CardBus PC Card</summary>
|
||||
CISTPL_CONFIG_CB = 0x04, /// <summary>Function state save/restore definition</summary>
|
||||
CISTPL_PWR_MGMNT = 0x08, /// <summary>Battery replacement date</summary>
|
||||
CISTPL_BATTERY = 0x45, /// <summary>Card initialization date</summary>
|
||||
CISTPL_DATE = 0x44, /// <summary>Level 2 version/product information</summary>
|
||||
CISTPL_VERS_2 = 0x40, /// <summary>Byte ordering for disk-like partitions</summary>
|
||||
CISTPL_BYTEORDER = 0x43, /// <summary>Data recording format for common memory</summary>
|
||||
CISTPL_FORMAT = 0x41, /// <summary>Data recording format for attribute memory</summary>
|
||||
CISTPL_FORMAT_A = 0x47, /// <summary>Partition geometry</summary>
|
||||
CISTPL_GEOMETRY = 0x42, /// <summary>Software interleaving</summary>
|
||||
CISTPL_SWIL = 0x23, /// <summary>Partition organization</summary>
|
||||
CISTPL_ORG = 0x46, /// <summary>Special purpose</summary>
|
||||
CISTPL_SPCL = 0x90
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
public enum DeviceTypeCodes : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// No device, used to designate a hole
|
||||
/// </summary>
|
||||
DTYPE_NULL = 0,
|
||||
/// <summary>
|
||||
/// Masked ROM
|
||||
/// </summary>
|
||||
DTYPE_ROM = 1,
|
||||
/// <summary>
|
||||
/// One-type-programmable ROM
|
||||
/// </summary>
|
||||
DTYPE_OTPROM = 2,
|
||||
/// <summary>
|
||||
/// UV-Erasable Programmable ROM
|
||||
/// </summary>
|
||||
DTYPE_EPROM = 3,
|
||||
/// <summary>
|
||||
/// Electronically-Erasable Programmable ROM
|
||||
/// </summary>
|
||||
DTYPE_EEPROM = 4,
|
||||
/// <summary>
|
||||
/// Flash memory
|
||||
/// </summary>
|
||||
DTYPE_FLASH = 5,
|
||||
/// <summary>
|
||||
/// Static RAM
|
||||
/// </summary>
|
||||
DTYPE_SRAM = 6,
|
||||
/// <summary>
|
||||
/// Dynamic RAM
|
||||
/// </summary>
|
||||
DTYPE_DRAM = 7,
|
||||
/// <summary>
|
||||
/// Function-specific memory address range
|
||||
/// </summary>
|
||||
DTYPE_FUNCSPEC = 13,
|
||||
/// <summary>
|
||||
/// Extended type follows
|
||||
/// </summary>
|
||||
/// <summary>No device, used to designate a hole</summary>
|
||||
DTYPE_NULL = 0, /// <summary>Masked ROM</summary>
|
||||
DTYPE_ROM = 1, /// <summary>One-type-programmable ROM</summary>
|
||||
DTYPE_OTPROM = 2, /// <summary>UV-Erasable Programmable ROM</summary>
|
||||
DTYPE_EPROM = 3, /// <summary>Electronically-Erasable Programmable ROM</summary>
|
||||
DTYPE_EEPROM = 4, /// <summary>Flash memory</summary>
|
||||
DTYPE_FLASH = 5, /// <summary>Static RAM</summary>
|
||||
DTYPE_SRAM = 6, /// <summary>Dynamic RAM</summary>
|
||||
DTYPE_DRAM = 7, /// <summary>Function-specific memory address range</summary>
|
||||
DTYPE_FUNCSPEC = 13, /// <summary>Extended type follows</summary>
|
||||
DTYPE_EXTEND = 14
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
public enum DeviceSpeedCodes : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// No device
|
||||
/// </summary>
|
||||
DSPEED_NULL = 0,
|
||||
/// <summary>
|
||||
/// 250 ns
|
||||
/// </summary>
|
||||
DSPEED_250NS = 1,
|
||||
/// <summary>
|
||||
/// 200 ns
|
||||
/// </summary>
|
||||
DSPEED_200NS = 2,
|
||||
/// <summary>
|
||||
/// 150 ns
|
||||
/// </summary>
|
||||
DSPEED_150NS = 3,
|
||||
/// <summary>
|
||||
/// 100 ns
|
||||
/// </summary>
|
||||
DSPEED_100NS = 4,
|
||||
/// <summary>
|
||||
/// Extended speed follows
|
||||
/// </summary>
|
||||
/// <summary>No device</summary>
|
||||
DSPEED_NULL = 0, /// <summary>250 ns</summary>
|
||||
DSPEED_250NS = 1, /// <summary>200 ns</summary>
|
||||
DSPEED_200NS = 2, /// <summary>150 ns</summary>
|
||||
DSPEED_150NS = 3, /// <summary>100 ns</summary>
|
||||
DSPEED_100NS = 4, /// <summary>Extended speed follows</summary>
|
||||
DSPEED_EXT = 7
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
public enum FunctionCodes : byte
|
||||
{
|
||||
MultiFunction = 0x00,
|
||||
Memory = 0x01,
|
||||
Serial = 0x02,
|
||||
Parallel = 0x03,
|
||||
FixedDisk = 0x04,
|
||||
Video = 0x05,
|
||||
Network = 0x06,
|
||||
AIMS = 0x07,
|
||||
SCSI = 0x08,
|
||||
Security = 0x09,
|
||||
Instrument = 0x0A,
|
||||
HighSpeedSerial = 0x0B,
|
||||
VendorSpecific = 0xFE
|
||||
MultiFunction = 0x00, Memory = 0x01, Serial = 0x02,
|
||||
Parallel = 0x03, FixedDisk = 0x04, Video = 0x05,
|
||||
Network = 0x06, AIMS = 0x07, SCSI = 0x08,
|
||||
Security = 0x09, Instrument = 0x0A, HighSpeedSerial = 0x0B,
|
||||
VendorSpecific = 0xFE
|
||||
}
|
||||
}
|
||||
476
PCMCIA/Types.cs
476
PCMCIA/Types.cs
@@ -34,181 +34,128 @@ using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
namespace DiscImageChef.Decoders.PCMCIA
|
||||
{
|
||||
/// <summary>
|
||||
/// Basic classure of a PCMCIA tuple
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
/// <summary>Basic classure of a PCMCIA tuple</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class Tuple
|
||||
{
|
||||
public TupleCodes Code;
|
||||
public byte Link;
|
||||
public byte[] Data;
|
||||
public byte Link;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checksum tuple
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
/// <summary>Checksum tuple</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class ChecksumTuple
|
||||
{
|
||||
/// <summary>Modulo-256 sum of region</summary>
|
||||
public byte Checksum;
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_CHECKSUM" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Offset to region to be checksummed
|
||||
/// </summary>
|
||||
public short Offset;
|
||||
/// <summary>
|
||||
/// Length of region to be checksummed
|
||||
/// </summary>
|
||||
/// <summary>Length of region to be checksummed</summary>
|
||||
public ushort Length;
|
||||
/// <summary>
|
||||
/// Modulo-256 sum of region
|
||||
/// </summary>
|
||||
public byte Checksum;
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>Offset to region to be checksummed</summary>
|
||||
public short Offset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indirect Access PC Card Memory
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
/// <summary>Indirect Access PC Card Memory</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class IndirectTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_INDIRECT" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Link target tuple
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
/// <summary>Link target tuple</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class LinkTargetTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_LINKTARGET" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// 'C''I''S' in ASCII
|
||||
/// </summary>
|
||||
/// <summary>'C''I''S' in ASCII</summary>
|
||||
public byte[] Tag;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 16-bit PC Card Long Link Tuple
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
/// <summary>16-bit PC Card Long Link Tuple</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class LongLinkTuple
|
||||
{
|
||||
/// <summary>Target address</summary>
|
||||
public uint Address;
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_LONGLINK_A" /> or <see cref="TupleCodes.CISTPL_LONGLINK_C" /> or
|
||||
/// <see cref="TupleCodes.CISTPL_LONGLINK_CB" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Target address
|
||||
/// </summary>
|
||||
public uint Address;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"),
|
||||
SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
|
||||
public class ConfigurationAddress
|
||||
{
|
||||
/// <summary>
|
||||
/// Target address space, 0 = attribute, 1 = common
|
||||
/// </summary>
|
||||
public byte TargetAddressSpace;
|
||||
/// <summary>
|
||||
/// Target address
|
||||
/// </summary>
|
||||
/// <summary>Target address</summary>
|
||||
public uint Address;
|
||||
/// <summary>Target address space, 0 = attribute, 1 = common</summary>
|
||||
public byte TargetAddressSpace;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Multiple function link tuple
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
/// <summary>Multiple function link tuple</summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class MultipleFunctionLinkTuple
|
||||
{
|
||||
/// <summary>Link to more configuration registers</summary>
|
||||
public ConfigurationAddress[] Addresses;
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_LONGLINK_MFC" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// How many functions follow
|
||||
/// </summary>
|
||||
/// <summary>How many functions follow</summary>
|
||||
public byte NumberFunctions;
|
||||
/// <summary>
|
||||
/// Link to more configuration registers
|
||||
/// </summary>
|
||||
public ConfigurationAddress[] Addresses;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class NoLinkTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_NO_LINK" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class AlternateStringTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_ALTSTR" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Array of strings. On memory they're preceded by an ISO Escape Code indicating codepage. Here they're stored as
|
||||
@@ -217,335 +164,218 @@ namespace DiscImageChef.Decoders.PCMCIA
|
||||
public string[] Strings;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"),
|
||||
SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
|
||||
public class ExtendedDeviceSpeed
|
||||
{
|
||||
/// <summary>
|
||||
/// Another extended follows
|
||||
/// </summary>
|
||||
public bool Extended;
|
||||
/// <summary>
|
||||
/// Speed mantisa
|
||||
/// </summary>
|
||||
public byte Mantissa;
|
||||
/// <summary>
|
||||
/// Speed exponent
|
||||
/// </summary>
|
||||
/// <summary>Speed exponent</summary>
|
||||
public byte Exponent;
|
||||
/// <summary>Another extended follows</summary>
|
||||
public bool Extended;
|
||||
/// <summary>Speed mantisa</summary>
|
||||
public byte Mantissa;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public struct DeviceInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// Device type code
|
||||
/// </summary>
|
||||
/// <summary>Device type code</summary>
|
||||
public DeviceTypeCodes Type;
|
||||
/// <summary>
|
||||
/// Write protected
|
||||
/// </summary>
|
||||
/// <summary>Write protected</summary>
|
||||
public bool WPS;
|
||||
/// <summary>
|
||||
/// Speed code
|
||||
/// </summary>
|
||||
/// <summary>Speed code</summary>
|
||||
public DeviceSpeedCodes Speed;
|
||||
/// <summary>
|
||||
/// Extended speeds
|
||||
/// </summary>
|
||||
/// <summary>Extended speeds</summary>
|
||||
public ExtendedDeviceSpeed[] ExtendedSpeeds;
|
||||
/// <summary>
|
||||
/// Extended types
|
||||
/// </summary>
|
||||
/// <summary>Extended types</summary>
|
||||
public byte[] ExtendedTypes;
|
||||
/// <summary>
|
||||
/// Size in units - 1
|
||||
/// </summary>
|
||||
/// <summary>Size in units - 1</summary>
|
||||
public byte Units;
|
||||
/// <summary>
|
||||
/// Code to define units unit
|
||||
/// </summary>
|
||||
/// <summary>Code to define units unit</summary>
|
||||
public byte SizeCode;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class DeviceTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_DEVICE" /> or <see cref="TupleCodes.CISTPL_DEVICE_A" />
|
||||
/// </summary>
|
||||
/// <summary><see cref="TupleCodes.CISTPL_DEVICE" /> or <see cref="TupleCodes.CISTPL_DEVICE_A" /></summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Array of device information bytes
|
||||
/// </summary>
|
||||
/// <summary>Array of device information bytes</summary>
|
||||
public DeviceInfo[] Infos;
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public struct OtherConditionInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// True if another other condition info follows
|
||||
/// </summary>
|
||||
/// <summary>True if another other condition info follows</summary>
|
||||
public bool Extended;
|
||||
/// <summary>
|
||||
/// Vcc used
|
||||
/// </summary>
|
||||
/// <summary>Vcc used</summary>
|
||||
public byte VccUsed;
|
||||
/// <summary>
|
||||
/// Supports WAIT# signal
|
||||
/// </summary>
|
||||
/// <summary>Supports WAIT# signal</summary>
|
||||
public bool MWAIT;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class OtherConditionTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_DEVICE_OC" /> or <see cref="TupleCodes.CISTPL_DEVICE_OA" />
|
||||
/// </summary>
|
||||
/// <summary><see cref="TupleCodes.CISTPL_DEVICE_OC" /> or <see cref="TupleCodes.CISTPL_DEVICE_OA" /></summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Array of other condition information bytes
|
||||
/// </summary>
|
||||
public OtherConditionInfo[] OtherConditionInfos;
|
||||
/// <summary>
|
||||
/// Array of device information bytes
|
||||
/// </summary>
|
||||
/// <summary>Array of device information bytes</summary>
|
||||
public DeviceInfo[] Infos;
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>Array of other condition information bytes</summary>
|
||||
public OtherConditionInfo[] OtherConditionInfos;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public struct DeviceGeometry
|
||||
{
|
||||
/// <summary>
|
||||
/// 1 << n-1 bytes, 2 = 16-bit PC Card, 3 = CardBus PC Card
|
||||
/// </summary>
|
||||
/// <summary>1 << n-1 bytes, 2 = 16-bit PC Card, 3 = CardBus PC Card</summary>
|
||||
public byte CardInterface;
|
||||
/// <summary>
|
||||
/// Erase block size in 1 << n-1 increments of <see cref="CardInterface" /> wide accesses.
|
||||
/// If n == 4, and <see cref="CardInterface" /> == 16, erase block size = 32 * 4 = 128 bytes
|
||||
/// Erase block size in 1 << n-1 increments of <see cref="CardInterface" /> wide accesses. If n == 4, and
|
||||
/// <see cref="CardInterface" /> == 16, erase block size = 32 * 4 = 128 bytes
|
||||
/// </summary>
|
||||
public byte EraseBlockSize;
|
||||
/// <summary>
|
||||
/// Read block size in 1 << n-1 increments of <see cref="CardInterface" /> wide accesses.
|
||||
/// If n == 4, and <see cref="CardInterface" /> == 16, read block size = 32 * 4 = 128 bytes
|
||||
/// Read block size in 1 << n-1 increments of <see cref="CardInterface" /> wide accesses. If n == 4, and
|
||||
/// <see cref="CardInterface" /> == 16, read block size = 32 * 4 = 128 bytes
|
||||
/// </summary>
|
||||
public byte ReadBlockSize;
|
||||
/// <summary>
|
||||
/// Write block size in 1 << n-1 increments of <see cref="CardInterface" /> wide accesses.
|
||||
/// If n == 4, and <see cref="CardInterface" /> == 16, write block size = 32 * 4 = 128 bytes
|
||||
/// Write block size in 1 << n-1 increments of <see cref="CardInterface" /> wide accesses. If n == 4, and
|
||||
/// <see cref="CardInterface" /> == 16, write block size = 32 * 4 = 128 bytes
|
||||
/// </summary>
|
||||
public byte WriteBlockSize;
|
||||
/// <summary>
|
||||
/// Device partitioning in granularity of 1 << n-1 erase blocks
|
||||
/// If n == 4, and erase block is 128 bytes, partitions must be aligned to 32 erase block, or 4096 bytes
|
||||
/// Device partitioning in granularity of 1 << n-1 erase blocks If n == 4, and erase block is 128 bytes,
|
||||
/// partitions must be aligned to 32 erase block, or 4096 bytes
|
||||
/// </summary>
|
||||
public byte Partitions;
|
||||
/// <summary>
|
||||
/// Card employs a multiple of 1 << n-1 times interleaving the entire memory arrays
|
||||
/// </summary>
|
||||
/// <summary>Card employs a multiple of 1 << n-1 times interleaving the entire memory arrays</summary>
|
||||
public byte Interleaving;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"), SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
public class DeviceGeometryTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_DEVICEGEO" /> or <see cref="TupleCodes.CISTPL_DEVICEGEO_A" />
|
||||
/// </summary>
|
||||
/// <summary><see cref="TupleCodes.CISTPL_DEVICEGEO" /> or <see cref="TupleCodes.CISTPL_DEVICEGEO_A" /></summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Array of device geometries
|
||||
/// </summary>
|
||||
/// <summary>Array of device geometries</summary>
|
||||
public DeviceGeometry[] Geometries;
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class FunctionIdentificationTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_FUNCID" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Function code
|
||||
/// </summary>
|
||||
/// <summary>Function code</summary>
|
||||
public FunctionCodes Function;
|
||||
/// <summary>
|
||||
/// Device contains boot ROM
|
||||
/// </summary>
|
||||
public bool ROM;
|
||||
/// <summary>
|
||||
/// Device wants to be part of power-on-self-test
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>Device wants to be part of power-on-self-test</summary>
|
||||
public bool POST;
|
||||
/// <summary>Device contains boot ROM</summary>
|
||||
public bool ROM;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"), SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
public class ManufacturerIdentificationTuple
|
||||
{
|
||||
/// <summary>Card ID</summary>
|
||||
public ushort CardID;
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_MANFID" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Manufacturer ID
|
||||
/// </summary>
|
||||
/// <summary>Manufacturer ID</summary>
|
||||
public ushort ManufacturerID;
|
||||
/// <summary>
|
||||
/// Card ID
|
||||
/// </summary>
|
||||
public ushort CardID;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"), SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
public class Level1VersionTuple
|
||||
{
|
||||
/// <summary>Additional information strings</summary>
|
||||
public string[] AdditionalInformation;
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_VERS_1" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Major version of standard compliance
|
||||
/// </summary>
|
||||
/// <summary>Major version of standard compliance</summary>
|
||||
public byte MajorVersion;
|
||||
/// <summary>
|
||||
/// Minor version of standard compliance
|
||||
/// </summary>
|
||||
public byte MinorVersion;
|
||||
/// <summary>
|
||||
/// Manufacturer string
|
||||
/// </summary>
|
||||
/// <summary>Manufacturer string</summary>
|
||||
public string Manufacturer;
|
||||
/// <summary>
|
||||
/// Product string
|
||||
/// </summary>
|
||||
/// <summary>Minor version of standard compliance</summary>
|
||||
public byte MinorVersion;
|
||||
/// <summary>Product string</summary>
|
||||
public string Product;
|
||||
/// <summary>
|
||||
/// Additional information strings
|
||||
/// </summary>
|
||||
public string[] AdditionalInformation;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class Level2VersionTuple
|
||||
{
|
||||
/// <summary>Address of first data byte</summary>
|
||||
public ushort Address;
|
||||
/// <summary>Number of copies of CIS present</summary>
|
||||
public byte CISCopies;
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_VERS_2" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Version of this classure
|
||||
/// </summary>
|
||||
public byte StructureVersion;
|
||||
/// <summary>
|
||||
/// Level of compliance
|
||||
/// </summary>
|
||||
/// <summary>Level of compliance</summary>
|
||||
public byte Compliance;
|
||||
/// <summary>
|
||||
/// Address of first data byte
|
||||
/// </summary>
|
||||
public ushort Address;
|
||||
/// <summary>
|
||||
/// Vendor-specific byte
|
||||
/// </summary>
|
||||
public byte VendorSpecific1;
|
||||
/// <summary>
|
||||
/// Vendor-specific byte
|
||||
/// </summary>
|
||||
public byte VendorSpecific2;
|
||||
/// <summary>
|
||||
/// Number of copies of CIS present
|
||||
/// </summary>
|
||||
public byte CISCopies;
|
||||
/// <summary>
|
||||
/// Vendor of software that formatted the card
|
||||
/// </summary>
|
||||
public string OEM;
|
||||
/// <summary>
|
||||
/// Informational message about the card
|
||||
/// </summary>
|
||||
/// <summary>Informational message about the card</summary>
|
||||
public string Information;
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>Vendor of software that formatted the card</summary>
|
||||
public string OEM;
|
||||
/// <summary>Version of this classure</summary>
|
||||
public byte StructureVersion;
|
||||
/// <summary>Vendor-specific byte</summary>
|
||||
public byte VendorSpecific1;
|
||||
/// <summary>Vendor-specific byte</summary>
|
||||
public byte VendorSpecific2;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public class GeometryTuple
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="TupleCodes.CISTPL_GEOMETRY" />
|
||||
/// </summary>
|
||||
public TupleCodes Code;
|
||||
/// <summary>
|
||||
/// Link to next tuple
|
||||
/// </summary>
|
||||
public byte Link;
|
||||
/// <summary>
|
||||
/// Sectors per track
|
||||
/// </summary>
|
||||
public byte SectorsPerTrack;
|
||||
/// <summary>
|
||||
/// Tracks per cylinder
|
||||
/// </summary>
|
||||
public byte TracksPerCylinder;
|
||||
/// <summary>
|
||||
/// Cylinders
|
||||
/// </summary>
|
||||
/// <summary>Cylinders</summary>
|
||||
public ushort Cylinders;
|
||||
/// <summary>Link to next tuple</summary>
|
||||
public byte Link;
|
||||
/// <summary>Sectors per track</summary>
|
||||
public byte SectorsPerTrack;
|
||||
/// <summary>Tracks per cylinder</summary>
|
||||
public byte TracksPerCylinder;
|
||||
}
|
||||
}
|
||||
@@ -42,321 +42,321 @@ namespace DiscImageChef.Decoders.PCMCIA
|
||||
switch(id)
|
||||
{
|
||||
#region JEDEC
|
||||
case 0x01: return "AMD";
|
||||
case 0x02: return "AMI";
|
||||
case 0x83: return "Fairchild";
|
||||
case 0x04: return "Fujitsu";
|
||||
case 0x85: return "GTE";
|
||||
case 0x86: return "Harris";
|
||||
case 0x07: return "Hitachi";
|
||||
case 0x08: return "Inmos";
|
||||
case 0x89: return "Intel";
|
||||
case 0x8A: return "I.T.T.";
|
||||
case 0x0B: return "Intersil";
|
||||
case 0x8C: return "Monolithic Memories";
|
||||
case 0x0D: return "Mostek";
|
||||
case 0x0E: return "Freescale";
|
||||
case 0x8F: return "National";
|
||||
case 0x10: return "NEC";
|
||||
case 0x91: return "RCA";
|
||||
case 0x92: return "Raytheon";
|
||||
case 0x13: return "Conexant";
|
||||
case 0x94: return "Seeq";
|
||||
case 0x15: return "NXP";
|
||||
case 0x16: return "Synertek";
|
||||
case 0x97: return "Texas Instruments";
|
||||
case 0x98: return "Toshiba";
|
||||
case 0x19: return "Xicor";
|
||||
case 0x1A: return "Zilog";
|
||||
case 0x9B: return "Eurotechnique";
|
||||
case 0x1C: return "Mitsubishi2";
|
||||
case 0x9D: return "Lucent";
|
||||
case 0x9E: return "Exel";
|
||||
case 0x1F: return "Atmel";
|
||||
case 0x20: return "SGS/Thomson";
|
||||
case 0xA1: return "Lattice Semiconductor";
|
||||
case 0xA2: return "NCR";
|
||||
case 0x23: return "Wafer Scale Integration";
|
||||
case 0xA4: return "International Business Machines";
|
||||
case 0x25: return "Tristar";
|
||||
case 0x26: return "Visic";
|
||||
case 0xA7: return "International CMOS Technology";
|
||||
case 0xA8: return "SSSI";
|
||||
case 0x29: return "Microchip Technology";
|
||||
case 0x2A: return "Ricoh";
|
||||
case 0xAB: return "VLSI";
|
||||
case 0x2C: return "Micron Technology";
|
||||
case 0xAD: return "Hynix Semiconductor";
|
||||
case 0xAE: return "OKI Semiconductor";
|
||||
case 0x2F: return "ACTEL";
|
||||
case 0xB0: return "Sharp";
|
||||
case 0x31: return "Catalyst";
|
||||
case 0x32: return "Panasonic";
|
||||
case 0xB3: return "IDT";
|
||||
case 0x34: return "Cypress";
|
||||
case 0xB5: return "Digital Equipment Corporation";
|
||||
case 0xB6: return "LSI Logic";
|
||||
case 0x37: return "Zarlink";
|
||||
case 0x38: return "UTMC";
|
||||
case 0xB9: return "Thinking Machine";
|
||||
case 0xBA: return "Thomson CSF";
|
||||
case 0x3B: return "Integrated CMOS";
|
||||
case 0xBC: return "Honeywell";
|
||||
case 0x3D: return "Tektronix";
|
||||
case 0x3E: return "Oracle Corporation";
|
||||
case 0xBF: return "Silicon Storage Technology";
|
||||
case 0x40: return "ProMos";
|
||||
case 0xC1: return "Infineon";
|
||||
case 0xC2: return "Macronix";
|
||||
case 0x43: return "Xerox";
|
||||
case 0xC4: return "Plus Logic";
|
||||
case 0x45: return "SanDisk Corporation";
|
||||
case 0x46: return "Elan Circuit Technology";
|
||||
case 0xC7: return "European Silicon";
|
||||
case 0xC8: return "Apple";
|
||||
case 0x49: return "Xilinx";
|
||||
case 0x4A: return "Compaq";
|
||||
case 0xCB: return "Protocol Engines";
|
||||
case 0x4C: return "SCI";
|
||||
case 0xCD: return "Seiko Instruments";
|
||||
case 0xCE: return "Samsung";
|
||||
case 0x4F: return "I3 Design System";
|
||||
case 0xD0: return "Klic";
|
||||
case 0x51: return "Crosspoint Solutions";
|
||||
case 0x52: return "Alliance Semiconductor";
|
||||
case 0xD3: return "Tandem";
|
||||
case 0x54: return "Hewlett-Packard";
|
||||
case 0xD5: return "Integrated Silicon Solutions";
|
||||
case 0xD6: return "Brooktree";
|
||||
case 0x57: return "New Media";
|
||||
case 0x58: return "MHS Electronic";
|
||||
case 0xD9: return "Performance Semiconductors";
|
||||
case 0xDA: return "Winbond Electronic";
|
||||
case 0x5B: return "Kawasaki Steel";
|
||||
case 0x5D: return "TECMAR";
|
||||
case 0x5E: return "Exar";
|
||||
case 0xDF: return "PCMCIA";
|
||||
case 0xE0: return "LG Semiconductor";
|
||||
case 0x61: return "Northern Telecom";
|
||||
case 0x62: return "Sanyo2";
|
||||
case 0xE3: return "Array Microsystems";
|
||||
case 0x64: return "Crystal Semiconductor";
|
||||
case 0xE5: return "Analog Devices";
|
||||
case 0xE6: return "PMC-Sierra";
|
||||
case 0x67: return "Asparix";
|
||||
case 0x68: return "Convex Computer";
|
||||
case 0xE9: return "Nimbus Technology";
|
||||
case 0x6B: return "Transwitch";
|
||||
case 0xEC: return "Micronas";
|
||||
case 0x6D: return "Canon";
|
||||
case 0x6E: return "Altera";
|
||||
case 0xEF: return "NEXCOM";
|
||||
case 0x70: return "Qualcomm";
|
||||
case 0xF1: return "Sony";
|
||||
case 0xF2: return "Cray Research";
|
||||
case 0x73: return "AMS";
|
||||
case 0xF4: return "Vitesse";
|
||||
case 0x75: return "Aster Electronics";
|
||||
case 0x76: return "Bay Networks";
|
||||
case 0xF7: return "Zentrum";
|
||||
case 0xF8: return "TRW";
|
||||
case 0x79: return "Thesys";
|
||||
case 0x7A: return "Solbourne Computer";
|
||||
case 0xFB: return "Allied-Signal";
|
||||
case 0x7C: return "Dialog Semiconductor";
|
||||
case 0xFD: return "Media Vision";
|
||||
case 0xFE: return "Numonyx Corporation";
|
||||
case 0x7F01: return "Cirrus Logic";
|
||||
case 0x7F02: return "National Instruments";
|
||||
case 0x7F04: return "Alcatel Mietec";
|
||||
case 0x7F07: return "JTAG Technologies";
|
||||
case 0x7F08: return "Loral";
|
||||
case 0x7F0B: return "Bestlink Systems";
|
||||
case 0x7F0D: return "GENNUM";
|
||||
case 0x7F0E: return "VideoLogic";
|
||||
case 0x7F10: return "Chip Express";
|
||||
case 0x7F13: return "TCSI";
|
||||
case 0x7F15: return "Hughes Aircraft";
|
||||
case 0x7F16: return "Lanstar Semiconductor";
|
||||
case 0x7F19: return "Music Semi";
|
||||
case 0x7F1A: return "Ericsson Components";
|
||||
case 0x7F1C: return "Eon Silicon Devices";
|
||||
case 0x7F1F: return "Integ.Memories Tech.";
|
||||
case 0x7F20: return "Corollary Inc.";
|
||||
case 0x7F23: return "EIV(Switzerland)";
|
||||
case 0x7F25: return "Zarlink(formerly Mitel)";
|
||||
case 0x7F26: return "Clearpoint";
|
||||
case 0x7F29: return "Vanguard";
|
||||
case 0x7F2A: return "Hagiwara Sys-Com";
|
||||
case 0x7F2C: return "Celestica";
|
||||
case 0x7F2F: return "Rohm Company Ltd.";
|
||||
case 0x7F31: return "Libit Signal Processing";
|
||||
case 0x7F32: return "Enhanced Memories Inc.";
|
||||
case 0x7F34: return "Adaptec Inc.";
|
||||
case 0x7F37: return "AMIC Technology";
|
||||
case 0x7F38: return "Adobe Systems";
|
||||
case 0x7F3B: return "Newport Digital";
|
||||
case 0x7F3D: return "T Square";
|
||||
case 0x7F3E: return "Seiko Epson";
|
||||
case 0x7F40: return "Viking Components";
|
||||
case 0x7F43: return "Suwa Electronics";
|
||||
case 0x7F45: return "Micron CMS";
|
||||
case 0x7F46: return "American Computer &Digital Components Inc";
|
||||
case 0x7F49: return "CPU Design";
|
||||
case 0x7F4A: return "Price Point";
|
||||
case 0x7F4C: return "Tellabs";
|
||||
case 0x7F4F: return "Transcend Information";
|
||||
case 0x7F51: return "CKD Corporation Ltd.";
|
||||
case 0x7F52: return "Capital Instruments, Inc.";
|
||||
case 0x7F54: return "Linvex Technology";
|
||||
case 0x7F57: return "Dynamem, Inc.";
|
||||
case 0x7F58: return "NERA ASA";
|
||||
case 0x7F5B: return "Acorn Computers";
|
||||
case 0x7F5D: return "Oak Technology, Inc.";
|
||||
case 0x7F5E: return "Itec Memory";
|
||||
case 0x7F61: return "Wintec Industries";
|
||||
case 0x7F62: return "Super PC Memory";
|
||||
case 0x7F64: return "Galvantech";
|
||||
case 0x7F67: return "GateField";
|
||||
case 0x7F68: return "Integrated Memory System";
|
||||
case 0x7F6B: return "Goldenram";
|
||||
case 0x7F6D: return "Cimaron Communications";
|
||||
case 0x7F6E: return "Nippon Steel Semi.Corp.";
|
||||
case 0x7F70: return "AMCC";
|
||||
case 0x7F73: return "Digital Microwave";
|
||||
case 0x7F75: return "MIMOS Semiconductor";
|
||||
case 0x7F76: return "Advanced Fibre";
|
||||
case 0x7F79: return "Acbel Polytech Inc.";
|
||||
case 0x7F7A: return "Apacer Technology";
|
||||
case 0x7F7C: return "FOXCONN";
|
||||
case 0x7F83: return "ILC Data Device";
|
||||
case 0x7F85: return "Micro Linear";
|
||||
case 0x7F86: return "Univ.Of NC";
|
||||
case 0x7F89: return "Nchip";
|
||||
case 0x7F8A: return "Galileo Tech";
|
||||
case 0x7F8C: return "Graychip";
|
||||
case 0x7F8F: return "Robert Bosch";
|
||||
case 0x7F91: return "DATARAM";
|
||||
case 0x7F92: return "United Microelec Corp.";
|
||||
case 0x7F94: return "Smart Modular";
|
||||
case 0x7F97: return "Qlogic";
|
||||
case 0x7F98: return "Kingston";
|
||||
case 0x7F9B: return "SpaSE";
|
||||
case 0x7F9D: return "Programmable Micro Corp";
|
||||
case 0x7F9E: return "DoD";
|
||||
case 0x7FA1: return "Dallas Semiconductor";
|
||||
case 0x7FA2: return "Omnivision";
|
||||
case 0x7FA4: return "Novatel Wireless";
|
||||
case 0x7FA7: return "Cabletron";
|
||||
case 0x7FA8: return "Silicon Technology";
|
||||
case 0x7FAB: return "Vantis";
|
||||
case 0x7FAD: return "Century";
|
||||
case 0x7FAE: return "Hal Computers";
|
||||
case 0x7FB0: return "Juniper Networks";
|
||||
case 0x7FB3: return "Tundra Semiconductor";
|
||||
case 0x7FB5: return "LightSpeed Semi.";
|
||||
case 0x7FB6: return "ZSP Corp.";
|
||||
case 0x7FB9: return "Dynachip";
|
||||
case 0x7FBA: return "PNY Electronics";
|
||||
case 0x7FBC: return "MMC Networks";
|
||||
case 0x7FBF: return "Broadcom";
|
||||
case 0x7FC1: return "V3 Semiconductor";
|
||||
case 0x7FC2: return "Flextronics(formerly Orbit)";
|
||||
case 0x7FC4: return "Transmeta";
|
||||
case 0x7FC7: return "Enhance 3000 Inc";
|
||||
case 0x7FC8: return "Tower Semiconductor";
|
||||
case 0x7FCB: return "Maxim Integrated Product";
|
||||
case 0x7FCD: return "Centaur Technology";
|
||||
case 0x7FCE: return "Unigen Corporation";
|
||||
case 0x7FD0: return "Memory Card Technology";
|
||||
case 0x7FD3: return "Aica Kogyo, Ltd.";
|
||||
case 0x7FD5: return "MSC Vertriebs GmbH";
|
||||
case 0x7FD6: return "AKM Company, Ltd.";
|
||||
case 0x7FD9: return "GSI Technology";
|
||||
case 0x7FDA: return "Dane-Elec (C Memory)";
|
||||
case 0x7FDC: return "Lara Technology";
|
||||
case 0x7FDF: return "Tanisys Technology";
|
||||
case 0x7FE0: return "Truevision";
|
||||
case 0x7FE3: return "MGV Memory";
|
||||
case 0x7FE5: return "Gadzoox Networks";
|
||||
case 0x7FE6: return "Multi Dimensional Cons.";
|
||||
case 0x7FE9: return "Triscend";
|
||||
case 0x7FEA: return "XaQti";
|
||||
case 0x7FEC: return "Clear Logic";
|
||||
case 0x7FEF: return "Advantage Memory";
|
||||
case 0x7FF1: return "LeCroy";
|
||||
case 0x7FF2: return "Yamaha Corporation";
|
||||
case 0x7FF4: return "NetLogic Microsystems";
|
||||
case 0x7FF7: return "BF Goodrich Data.";
|
||||
case 0x7FF8: return "Epigram";
|
||||
case 0x7FFB: return "Admor Memory";
|
||||
case 0x7FFD: return "Quadratics Superconductor";
|
||||
case 0x7FFE: return "3COM";
|
||||
case 0x01: return"AMD";
|
||||
case 0x02: return"AMI";
|
||||
case 0x83: return"Fairchild";
|
||||
case 0x04: return"Fujitsu";
|
||||
case 0x85: return"GTE";
|
||||
case 0x86: return"Harris";
|
||||
case 0x07: return"Hitachi";
|
||||
case 0x08: return"Inmos";
|
||||
case 0x89: return"Intel";
|
||||
case 0x8A: return"I.T.T.";
|
||||
case 0x0B: return"Intersil";
|
||||
case 0x8C: return"Monolithic Memories";
|
||||
case 0x0D: return"Mostek";
|
||||
case 0x0E: return"Freescale";
|
||||
case 0x8F: return"National";
|
||||
case 0x10: return"NEC";
|
||||
case 0x91: return"RCA";
|
||||
case 0x92: return"Raytheon";
|
||||
case 0x13: return"Conexant";
|
||||
case 0x94: return"Seeq";
|
||||
case 0x15: return"NXP";
|
||||
case 0x16: return"Synertek";
|
||||
case 0x97: return"Texas Instruments";
|
||||
case 0x98: return"Toshiba";
|
||||
case 0x19: return"Xicor";
|
||||
case 0x1A: return"Zilog";
|
||||
case 0x9B: return"Eurotechnique";
|
||||
case 0x1C: return"Mitsubishi2";
|
||||
case 0x9D: return"Lucent";
|
||||
case 0x9E: return"Exel";
|
||||
case 0x1F: return"Atmel";
|
||||
case 0x20: return"SGS/Thomson";
|
||||
case 0xA1: return"Lattice Semiconductor";
|
||||
case 0xA2: return"NCR";
|
||||
case 0x23: return"Wafer Scale Integration";
|
||||
case 0xA4: return"International Business Machines";
|
||||
case 0x25: return"Tristar";
|
||||
case 0x26: return"Visic";
|
||||
case 0xA7: return"International CMOS Technology";
|
||||
case 0xA8: return"SSSI";
|
||||
case 0x29: return"Microchip Technology";
|
||||
case 0x2A: return"Ricoh";
|
||||
case 0xAB: return"VLSI";
|
||||
case 0x2C: return"Micron Technology";
|
||||
case 0xAD: return"Hynix Semiconductor";
|
||||
case 0xAE: return"OKI Semiconductor";
|
||||
case 0x2F: return"ACTEL";
|
||||
case 0xB0: return"Sharp";
|
||||
case 0x31: return"Catalyst";
|
||||
case 0x32: return"Panasonic";
|
||||
case 0xB3: return"IDT";
|
||||
case 0x34: return"Cypress";
|
||||
case 0xB5: return"Digital Equipment Corporation";
|
||||
case 0xB6: return"LSI Logic";
|
||||
case 0x37: return"Zarlink";
|
||||
case 0x38: return"UTMC";
|
||||
case 0xB9: return"Thinking Machine";
|
||||
case 0xBA: return"Thomson CSF";
|
||||
case 0x3B: return"Integrated CMOS";
|
||||
case 0xBC: return"Honeywell";
|
||||
case 0x3D: return"Tektronix";
|
||||
case 0x3E: return"Oracle Corporation";
|
||||
case 0xBF: return"Silicon Storage Technology";
|
||||
case 0x40: return"ProMos";
|
||||
case 0xC1: return"Infineon";
|
||||
case 0xC2: return"Macronix";
|
||||
case 0x43: return"Xerox";
|
||||
case 0xC4: return"Plus Logic";
|
||||
case 0x45: return"SanDisk Corporation";
|
||||
case 0x46: return"Elan Circuit Technology";
|
||||
case 0xC7: return"European Silicon";
|
||||
case 0xC8: return"Apple";
|
||||
case 0x49: return"Xilinx";
|
||||
case 0x4A: return"Compaq";
|
||||
case 0xCB: return"Protocol Engines";
|
||||
case 0x4C: return"SCI";
|
||||
case 0xCD: return"Seiko Instruments";
|
||||
case 0xCE: return"Samsung";
|
||||
case 0x4F: return"I3 Design System";
|
||||
case 0xD0: return"Klic";
|
||||
case 0x51: return"Crosspoint Solutions";
|
||||
case 0x52: return"Alliance Semiconductor";
|
||||
case 0xD3: return"Tandem";
|
||||
case 0x54: return"Hewlett-Packard";
|
||||
case 0xD5: return"Integrated Silicon Solutions";
|
||||
case 0xD6: return"Brooktree";
|
||||
case 0x57: return"New Media";
|
||||
case 0x58: return"MHS Electronic";
|
||||
case 0xD9: return"Performance Semiconductors";
|
||||
case 0xDA: return"Winbond Electronic";
|
||||
case 0x5B: return"Kawasaki Steel";
|
||||
case 0x5D: return"TECMAR";
|
||||
case 0x5E: return"Exar";
|
||||
case 0xDF: return"PCMCIA";
|
||||
case 0xE0: return"LG Semiconductor";
|
||||
case 0x61: return"Northern Telecom";
|
||||
case 0x62: return"Sanyo2";
|
||||
case 0xE3: return"Array Microsystems";
|
||||
case 0x64: return"Crystal Semiconductor";
|
||||
case 0xE5: return"Analog Devices";
|
||||
case 0xE6: return"PMC-Sierra";
|
||||
case 0x67: return"Asparix";
|
||||
case 0x68: return"Convex Computer";
|
||||
case 0xE9: return"Nimbus Technology";
|
||||
case 0x6B: return"Transwitch";
|
||||
case 0xEC: return"Micronas";
|
||||
case 0x6D: return"Canon";
|
||||
case 0x6E: return"Altera";
|
||||
case 0xEF: return"NEXCOM";
|
||||
case 0x70: return"Qualcomm";
|
||||
case 0xF1: return"Sony";
|
||||
case 0xF2: return"Cray Research";
|
||||
case 0x73: return"AMS";
|
||||
case 0xF4: return"Vitesse";
|
||||
case 0x75: return"Aster Electronics";
|
||||
case 0x76: return"Bay Networks";
|
||||
case 0xF7: return"Zentrum";
|
||||
case 0xF8: return"TRW";
|
||||
case 0x79: return"Thesys";
|
||||
case 0x7A: return"Solbourne Computer";
|
||||
case 0xFB: return"Allied-Signal";
|
||||
case 0x7C: return"Dialog Semiconductor";
|
||||
case 0xFD: return"Media Vision";
|
||||
case 0xFE: return"Numonyx Corporation";
|
||||
case 0x7F01: return"Cirrus Logic";
|
||||
case 0x7F02: return"National Instruments";
|
||||
case 0x7F04: return"Alcatel Mietec";
|
||||
case 0x7F07: return"JTAG Technologies";
|
||||
case 0x7F08: return"Loral";
|
||||
case 0x7F0B: return"Bestlink Systems";
|
||||
case 0x7F0D: return"GENNUM";
|
||||
case 0x7F0E: return"VideoLogic";
|
||||
case 0x7F10: return"Chip Express";
|
||||
case 0x7F13: return"TCSI";
|
||||
case 0x7F15: return"Hughes Aircraft";
|
||||
case 0x7F16: return"Lanstar Semiconductor";
|
||||
case 0x7F19: return"Music Semi";
|
||||
case 0x7F1A: return"Ericsson Components";
|
||||
case 0x7F1C: return"Eon Silicon Devices";
|
||||
case 0x7F1F: return"Integ.Memories Tech.";
|
||||
case 0x7F20: return"Corollary Inc.";
|
||||
case 0x7F23: return"EIV(Switzerland)";
|
||||
case 0x7F25: return"Zarlink(formerly Mitel)";
|
||||
case 0x7F26: return"Clearpoint";
|
||||
case 0x7F29: return"Vanguard";
|
||||
case 0x7F2A: return"Hagiwara Sys-Com";
|
||||
case 0x7F2C: return"Celestica";
|
||||
case 0x7F2F: return"Rohm Company Ltd.";
|
||||
case 0x7F31: return"Libit Signal Processing";
|
||||
case 0x7F32: return"Enhanced Memories Inc.";
|
||||
case 0x7F34: return"Adaptec Inc.";
|
||||
case 0x7F37: return"AMIC Technology";
|
||||
case 0x7F38: return"Adobe Systems";
|
||||
case 0x7F3B: return"Newport Digital";
|
||||
case 0x7F3D: return"T Square";
|
||||
case 0x7F3E: return"Seiko Epson";
|
||||
case 0x7F40: return"Viking Components";
|
||||
case 0x7F43: return"Suwa Electronics";
|
||||
case 0x7F45: return"Micron CMS";
|
||||
case 0x7F46: return"American Computer &Digital Components Inc";
|
||||
case 0x7F49: return"CPU Design";
|
||||
case 0x7F4A: return"Price Point";
|
||||
case 0x7F4C: return"Tellabs";
|
||||
case 0x7F4F: return"Transcend Information";
|
||||
case 0x7F51: return"CKD Corporation Ltd.";
|
||||
case 0x7F52: return"Capital Instruments, Inc.";
|
||||
case 0x7F54: return"Linvex Technology";
|
||||
case 0x7F57: return"Dynamem, Inc.";
|
||||
case 0x7F58: return"NERA ASA";
|
||||
case 0x7F5B: return"Acorn Computers";
|
||||
case 0x7F5D: return"Oak Technology, Inc.";
|
||||
case 0x7F5E: return"Itec Memory";
|
||||
case 0x7F61: return"Wintec Industries";
|
||||
case 0x7F62: return"Super PC Memory";
|
||||
case 0x7F64: return"Galvantech";
|
||||
case 0x7F67: return"GateField";
|
||||
case 0x7F68: return"Integrated Memory System";
|
||||
case 0x7F6B: return"Goldenram";
|
||||
case 0x7F6D: return"Cimaron Communications";
|
||||
case 0x7F6E: return"Nippon Steel Semi.Corp.";
|
||||
case 0x7F70: return"AMCC";
|
||||
case 0x7F73: return"Digital Microwave";
|
||||
case 0x7F75: return"MIMOS Semiconductor";
|
||||
case 0x7F76: return"Advanced Fibre";
|
||||
case 0x7F79: return"Acbel Polytech Inc.";
|
||||
case 0x7F7A: return"Apacer Technology";
|
||||
case 0x7F7C: return"FOXCONN";
|
||||
case 0x7F83: return"ILC Data Device";
|
||||
case 0x7F85: return"Micro Linear";
|
||||
case 0x7F86: return"Univ.Of NC";
|
||||
case 0x7F89: return"Nchip";
|
||||
case 0x7F8A: return"Galileo Tech";
|
||||
case 0x7F8C: return"Graychip";
|
||||
case 0x7F8F: return"Robert Bosch";
|
||||
case 0x7F91: return"DATARAM";
|
||||
case 0x7F92: return"United Microelec Corp.";
|
||||
case 0x7F94: return"Smart Modular";
|
||||
case 0x7F97: return"Qlogic";
|
||||
case 0x7F98: return"Kingston";
|
||||
case 0x7F9B: return"SpaSE";
|
||||
case 0x7F9D: return"Programmable Micro Corp";
|
||||
case 0x7F9E: return"DoD";
|
||||
case 0x7FA1: return"Dallas Semiconductor";
|
||||
case 0x7FA2: return"Omnivision";
|
||||
case 0x7FA4: return"Novatel Wireless";
|
||||
case 0x7FA7: return"Cabletron";
|
||||
case 0x7FA8: return"Silicon Technology";
|
||||
case 0x7FAB: return"Vantis";
|
||||
case 0x7FAD: return"Century";
|
||||
case 0x7FAE: return"Hal Computers";
|
||||
case 0x7FB0: return"Juniper Networks";
|
||||
case 0x7FB3: return"Tundra Semiconductor";
|
||||
case 0x7FB5: return"LightSpeed Semi.";
|
||||
case 0x7FB6: return"ZSP Corp.";
|
||||
case 0x7FB9: return"Dynachip";
|
||||
case 0x7FBA: return"PNY Electronics";
|
||||
case 0x7FBC: return"MMC Networks";
|
||||
case 0x7FBF: return"Broadcom";
|
||||
case 0x7FC1: return"V3 Semiconductor";
|
||||
case 0x7FC2: return"Flextronics(formerly Orbit)";
|
||||
case 0x7FC4: return"Transmeta";
|
||||
case 0x7FC7: return"Enhance 3000 Inc";
|
||||
case 0x7FC8: return"Tower Semiconductor";
|
||||
case 0x7FCB: return"Maxim Integrated Product";
|
||||
case 0x7FCD: return"Centaur Technology";
|
||||
case 0x7FCE: return"Unigen Corporation";
|
||||
case 0x7FD0: return"Memory Card Technology";
|
||||
case 0x7FD3: return"Aica Kogyo, Ltd.";
|
||||
case 0x7FD5: return"MSC Vertriebs GmbH";
|
||||
case 0x7FD6: return"AKM Company, Ltd.";
|
||||
case 0x7FD9: return"GSI Technology";
|
||||
case 0x7FDA: return"Dane-Elec (C Memory)";
|
||||
case 0x7FDC: return"Lara Technology";
|
||||
case 0x7FDF: return"Tanisys Technology";
|
||||
case 0x7FE0: return"Truevision";
|
||||
case 0x7FE3: return"MGV Memory";
|
||||
case 0x7FE5: return"Gadzoox Networks";
|
||||
case 0x7FE6: return"Multi Dimensional Cons.";
|
||||
case 0x7FE9: return"Triscend";
|
||||
case 0x7FEA: return"XaQti";
|
||||
case 0x7FEC: return"Clear Logic";
|
||||
case 0x7FEF: return"Advantage Memory";
|
||||
case 0x7FF1: return"LeCroy";
|
||||
case 0x7FF2: return"Yamaha Corporation";
|
||||
case 0x7FF4: return"NetLogic Microsystems";
|
||||
case 0x7FF7: return"BF Goodrich Data.";
|
||||
case 0x7FF8: return"Epigram";
|
||||
case 0x7FFB: return"Admor Memory";
|
||||
case 0x7FFD: return"Quadratics Superconductor";
|
||||
case 0x7FFE: return"3COM";
|
||||
#endregion JEDEC
|
||||
|
||||
case 0x0100: return "Digital Equipment Corporation";
|
||||
case 0x0101: return "3Com Corporation";
|
||||
case 0x0102: return "Megahertz Corporation";
|
||||
case 0x0104: return "Socket Communications";
|
||||
case 0x0105: return "TDK Corporation";
|
||||
case 0x0108: return "Standard Microsystems Corporation";
|
||||
case 0x0109: return "Motorola Corporation";
|
||||
case 0x010b: return "National Instruments";
|
||||
case 0x0115: return "US Robotics Corporation";
|
||||
case 0x0121: return "Olicom";
|
||||
case 0x0126: return "Proxim";
|
||||
case 0x0128: return "Megahertz Corporation";
|
||||
case 0x012F: return "Adaptec Corporation";
|
||||
case 0x0137: return "Quatech";
|
||||
case 0x0138: return "Compaq";
|
||||
case 0x0140: return "Ositech";
|
||||
case 0x0143: return "D-Link";
|
||||
case 0x0149: return "Netgear";
|
||||
case 0x014D: return "Simple Technology";
|
||||
case 0x0156: return "Lucent Technologies";
|
||||
case 0x015F: return "Aironet Wireless Communications";
|
||||
case 0x016B: return "Ericsson";
|
||||
case 0x016C: return "Psion";
|
||||
case 0x0183: return "Compaq";
|
||||
case 0x0186: return "Kingston";
|
||||
case 0x0192: return "Sierra Wireless";
|
||||
case 0x0194: return "Dayna Corporation";
|
||||
case 0x01a6: return "Raytheon";
|
||||
case 0x01BF: return "Belkin";
|
||||
case 0x01EB: return "Bay Networks";
|
||||
case 0x0200: return "Farallon Communications";
|
||||
case 0x021B: return "Telecom Device";
|
||||
case 0x023D: return "Nokia Communications";
|
||||
case 0x0250: return "Samsung";
|
||||
case 0x0264: return "Anycom";
|
||||
case 0x0268: return "Alvarion Ltd.";
|
||||
case 0x026C: return "Symbol";
|
||||
case 0x026F: return "BUFFALO";
|
||||
case 0x0274: return "The Linksys Group";
|
||||
case 0x0288: return "NEC Infrontia";
|
||||
case 0x028A: return "I-O DATA";
|
||||
case 0x02AA: return "Asustek Computer";
|
||||
case 0x02AC: return "Siemens";
|
||||
case 0x02D2: return "Microsoft Corporation";
|
||||
case 0x02DF: return "AmbiCom Inc";
|
||||
case 0x0a02: return "BreezeCOM";
|
||||
case 0x10CD: return "NewMedia";
|
||||
case 0x1668: return "ACTIONTEC";
|
||||
case 0x3401: return "Lasat Communications A/S";
|
||||
case 0x4E01: return "Lexar Media";
|
||||
case 0x5241: return "Archos";
|
||||
case 0x890F: return "Dual";
|
||||
case 0x8A01: return "Compex Corporation";
|
||||
case 0xC001: return "Contec";
|
||||
case 0xC00B: return "MACNICA";
|
||||
case 0xC00C: return "Roland";
|
||||
case 0xC00F: return "Corega K.K.";
|
||||
case 0xC012: return "Hagiwara SYS-COM";
|
||||
case 0xC015: return "RATOC System Inc.";
|
||||
case 0xC020: return "NextCom K.K.";
|
||||
case 0xC250: return "EMTAC Technology Corporation";
|
||||
case 0xD601: return "Elsa";
|
||||
default: return $"Unknown vendor id 0x{id:X4}";
|
||||
case 0x0100: return"Digital Equipment Corporation";
|
||||
case 0x0101: return"3Com Corporation";
|
||||
case 0x0102: return"Megahertz Corporation";
|
||||
case 0x0104: return"Socket Communications";
|
||||
case 0x0105: return"TDK Corporation";
|
||||
case 0x0108: return"Standard Microsystems Corporation";
|
||||
case 0x0109: return"Motorola Corporation";
|
||||
case 0x010b: return"National Instruments";
|
||||
case 0x0115: return"US Robotics Corporation";
|
||||
case 0x0121: return"Olicom";
|
||||
case 0x0126: return"Proxim";
|
||||
case 0x0128: return"Megahertz Corporation";
|
||||
case 0x012F: return"Adaptec Corporation";
|
||||
case 0x0137: return"Quatech";
|
||||
case 0x0138: return"Compaq";
|
||||
case 0x0140: return"Ositech";
|
||||
case 0x0143: return"D-Link";
|
||||
case 0x0149: return"Netgear";
|
||||
case 0x014D: return"Simple Technology";
|
||||
case 0x0156: return"Lucent Technologies";
|
||||
case 0x015F: return"Aironet Wireless Communications";
|
||||
case 0x016B: return"Ericsson";
|
||||
case 0x016C: return"Psion";
|
||||
case 0x0183: return"Compaq";
|
||||
case 0x0186: return"Kingston";
|
||||
case 0x0192: return"Sierra Wireless";
|
||||
case 0x0194: return"Dayna Corporation";
|
||||
case 0x01a6: return"Raytheon";
|
||||
case 0x01BF: return"Belkin";
|
||||
case 0x01EB: return"Bay Networks";
|
||||
case 0x0200: return"Farallon Communications";
|
||||
case 0x021B: return"Telecom Device";
|
||||
case 0x023D: return"Nokia Communications";
|
||||
case 0x0250: return"Samsung";
|
||||
case 0x0264: return"Anycom";
|
||||
case 0x0268: return"Alvarion Ltd.";
|
||||
case 0x026C: return"Symbol";
|
||||
case 0x026F: return"BUFFALO";
|
||||
case 0x0274: return"The Linksys Group";
|
||||
case 0x0288: return"NEC Infrontia";
|
||||
case 0x028A: return"I-O DATA";
|
||||
case 0x02AA: return"Asustek Computer";
|
||||
case 0x02AC: return"Siemens";
|
||||
case 0x02D2: return"Microsoft Corporation";
|
||||
case 0x02DF: return"AmbiCom Inc";
|
||||
case 0x0a02: return"BreezeCOM";
|
||||
case 0x10CD: return"NewMedia";
|
||||
case 0x1668: return"ACTIONTEC";
|
||||
case 0x3401: return"Lasat Communications A/S";
|
||||
case 0x4E01: return"Lexar Media";
|
||||
case 0x5241: return"Archos";
|
||||
case 0x890F: return"Dual";
|
||||
case 0x8A01: return"Compex Corporation";
|
||||
case 0xC001: return"Contec";
|
||||
case 0xC00B: return"MACNICA";
|
||||
case 0xC00C: return"Roland";
|
||||
case 0xC00F: return"Corega K.K.";
|
||||
case 0xC012: return"Hagiwara SYS-COM";
|
||||
case 0xC015: return"RATOC System Inc.";
|
||||
case 0xC020: return"NextCom K.K.";
|
||||
case 0xC250: return"EMTAC Technology Corporation";
|
||||
case 0xD601: return"Elsa";
|
||||
default: return$"Unknown vendor id 0x{id:X4}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user