mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Implement get device type packet.
This commit is contained in:
@@ -162,237 +162,247 @@ namespace DiscImageChef.Devices
|
|||||||
|
|
||||||
var scsiSense = true;
|
var scsiSense = true;
|
||||||
|
|
||||||
// Windows is answering SCSI INQUIRY for all device types so it needs to be detected first
|
if (remote is null)
|
||||||
switch (PlatformId)
|
|
||||||
{
|
{
|
||||||
case PlatformID.Win32NT:
|
// Windows is answering SCSI INQUIRY for all device types so it needs to be detected first
|
||||||
var query = new StoragePropertyQuery();
|
switch (PlatformId)
|
||||||
query.PropertyId = StoragePropertyId.Device;
|
{
|
||||||
query.QueryType = StorageQueryType.Standard;
|
case PlatformID.Win32NT:
|
||||||
query.AdditionalParameters = new byte[1];
|
var query = new StoragePropertyQuery();
|
||||||
|
query.PropertyId = StoragePropertyId.Device;
|
||||||
|
query.QueryType = StorageQueryType.Standard;
|
||||||
|
query.AdditionalParameters = new byte[1];
|
||||||
|
|
||||||
var descriptorPtr = Marshal.AllocHGlobal(1000);
|
var descriptorPtr = Marshal.AllocHGlobal(1000);
|
||||||
var descriptorB = new byte[1000];
|
var descriptorB = new byte[1000];
|
||||||
|
|
||||||
uint returned = 0;
|
uint returned = 0;
|
||||||
var error = 0;
|
var error = 0;
|
||||||
|
|
||||||
var hasError = !Extern.DeviceIoControlStorageQuery((SafeFileHandle) FileHandle,
|
var hasError = !Extern.DeviceIoControlStorageQuery((SafeFileHandle) FileHandle,
|
||||||
WindowsIoctl.IoctlStorageQueryProperty,
|
WindowsIoctl.IoctlStorageQueryProperty,
|
||||||
ref query, (uint) Marshal.SizeOf(query),
|
ref query, (uint) Marshal.SizeOf(query),
|
||||||
descriptorPtr, 1000, ref returned, IntPtr.Zero);
|
descriptorPtr, 1000, ref returned, IntPtr.Zero);
|
||||||
|
|
||||||
if (hasError) error = Marshal.GetLastWin32Error();
|
if (hasError) error = Marshal.GetLastWin32Error();
|
||||||
|
|
||||||
Marshal.Copy(descriptorPtr, descriptorB, 0, 1000);
|
Marshal.Copy(descriptorPtr, descriptorB, 0, 1000);
|
||||||
|
|
||||||
if (!hasError && error == 0)
|
if (!hasError && error == 0)
|
||||||
{
|
|
||||||
var descriptor = new StorageDeviceDescriptor
|
|
||||||
{
|
{
|
||||||
Version = BitConverter.ToUInt32(descriptorB, 0),
|
var descriptor = new StorageDeviceDescriptor
|
||||||
Size = BitConverter.ToUInt32(descriptorB, 4),
|
{
|
||||||
DeviceType = descriptorB[8],
|
Version = BitConverter.ToUInt32(descriptorB, 0),
|
||||||
DeviceTypeModifier = descriptorB[9],
|
Size = BitConverter.ToUInt32(descriptorB, 4),
|
||||||
RemovableMedia = descriptorB[10] > 0,
|
DeviceType = descriptorB[8],
|
||||||
CommandQueueing = descriptorB[11] > 0,
|
DeviceTypeModifier = descriptorB[9],
|
||||||
VendorIdOffset = BitConverter.ToInt32(descriptorB, 12),
|
RemovableMedia = descriptorB[10] > 0,
|
||||||
ProductIdOffset = BitConverter.ToInt32(descriptorB, 16),
|
CommandQueueing = descriptorB[11] > 0,
|
||||||
ProductRevisionOffset = BitConverter.ToInt32(descriptorB, 20),
|
VendorIdOffset = BitConverter.ToInt32(descriptorB, 12),
|
||||||
SerialNumberOffset = BitConverter.ToInt32(descriptorB, 24),
|
ProductIdOffset = BitConverter.ToInt32(descriptorB, 16),
|
||||||
BusType = (StorageBusType) BitConverter.ToUInt32(descriptorB, 28),
|
ProductRevisionOffset = BitConverter.ToInt32(descriptorB, 20),
|
||||||
RawPropertiesLength = BitConverter.ToUInt32(descriptorB, 32)
|
SerialNumberOffset = BitConverter.ToInt32(descriptorB, 24),
|
||||||
};
|
BusType = (StorageBusType) BitConverter.ToUInt32(descriptorB, 28),
|
||||||
descriptor.RawDeviceProperties = new byte[descriptor.RawPropertiesLength];
|
RawPropertiesLength = BitConverter.ToUInt32(descriptorB, 32)
|
||||||
Array.Copy(descriptorB, 36, descriptor.RawDeviceProperties, 0, descriptor.RawPropertiesLength);
|
};
|
||||||
|
descriptor.RawDeviceProperties = new byte[descriptor.RawPropertiesLength];
|
||||||
|
Array.Copy(descriptorB, 36, descriptor.RawDeviceProperties, 0,
|
||||||
|
descriptor.RawPropertiesLength);
|
||||||
|
|
||||||
switch (descriptor.BusType)
|
switch (descriptor.BusType)
|
||||||
{
|
{
|
||||||
case StorageBusType.SCSI:
|
case StorageBusType.SCSI:
|
||||||
case StorageBusType.SSA:
|
case StorageBusType.SSA:
|
||||||
case StorageBusType.Fibre:
|
case StorageBusType.Fibre:
|
||||||
case StorageBusType.iSCSI:
|
case StorageBusType.iSCSI:
|
||||||
case StorageBusType.SAS:
|
case StorageBusType.SAS:
|
||||||
Type = DeviceType.SCSI;
|
Type = DeviceType.SCSI;
|
||||||
break;
|
break;
|
||||||
case StorageBusType.FireWire:
|
case StorageBusType.FireWire:
|
||||||
IsFireWire = true;
|
IsFireWire = true;
|
||||||
Type = DeviceType.SCSI;
|
Type = DeviceType.SCSI;
|
||||||
break;
|
break;
|
||||||
case StorageBusType.USB:
|
case StorageBusType.USB:
|
||||||
IsUsb = true;
|
IsUsb = true;
|
||||||
Type = DeviceType.SCSI;
|
Type = DeviceType.SCSI;
|
||||||
break;
|
break;
|
||||||
case StorageBusType.ATAPI:
|
case StorageBusType.ATAPI:
|
||||||
Type = DeviceType.ATAPI;
|
|
||||||
break;
|
|
||||||
case StorageBusType.ATA:
|
|
||||||
case StorageBusType.SATA:
|
|
||||||
Type = DeviceType.ATA;
|
|
||||||
break;
|
|
||||||
case StorageBusType.MultiMediaCard:
|
|
||||||
Type = DeviceType.MMC;
|
|
||||||
break;
|
|
||||||
case StorageBusType.SecureDigital:
|
|
||||||
Type = DeviceType.SecureDigital;
|
|
||||||
break;
|
|
||||||
case StorageBusType.NVMe:
|
|
||||||
Type = DeviceType.NVMe;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (Type)
|
|
||||||
{
|
|
||||||
case DeviceType.SCSI:
|
|
||||||
case DeviceType.ATAPI:
|
|
||||||
scsiSense = ScsiInquiry(out inqBuf, out _);
|
|
||||||
break;
|
|
||||||
case DeviceType.ATA:
|
|
||||||
var atapiSense = AtapiIdentify(out ataBuf, out _);
|
|
||||||
|
|
||||||
if (!atapiSense)
|
|
||||||
{
|
|
||||||
Type = DeviceType.ATAPI;
|
Type = DeviceType.ATAPI;
|
||||||
var ataid = Identify.Decode(ataBuf);
|
break;
|
||||||
|
case StorageBusType.ATA:
|
||||||
|
case StorageBusType.SATA:
|
||||||
|
Type = DeviceType.ATA;
|
||||||
|
break;
|
||||||
|
case StorageBusType.MultiMediaCard:
|
||||||
|
Type = DeviceType.MMC;
|
||||||
|
break;
|
||||||
|
case StorageBusType.SecureDigital:
|
||||||
|
Type = DeviceType.SecureDigital;
|
||||||
|
break;
|
||||||
|
case StorageBusType.NVMe:
|
||||||
|
Type = DeviceType.NVMe;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (ataid.HasValue) scsiSense = ScsiInquiry(out inqBuf, out _);
|
switch (Type)
|
||||||
}
|
{
|
||||||
else
|
case DeviceType.SCSI:
|
||||||
|
case DeviceType.ATAPI:
|
||||||
|
scsiSense = ScsiInquiry(out inqBuf, out _);
|
||||||
|
break;
|
||||||
|
case DeviceType.ATA:
|
||||||
|
var atapiSense = AtapiIdentify(out ataBuf, out _);
|
||||||
|
|
||||||
|
if (!atapiSense)
|
||||||
|
{
|
||||||
|
Type = DeviceType.ATAPI;
|
||||||
|
var ataid = Identify.Decode(ataBuf);
|
||||||
|
|
||||||
|
if (ataid.HasValue) scsiSense = ScsiInquiry(out inqBuf, out _);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Manufacturer = "ATA";
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Marshal.FreeHGlobal(descriptorPtr);
|
||||||
|
|
||||||
|
if (Windows.Command.IsSdhci((SafeFileHandle) FileHandle))
|
||||||
|
{
|
||||||
|
var sdBuffer = new byte[16];
|
||||||
|
|
||||||
|
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle, MmcCommands.SendCsd,
|
||||||
|
false, false,
|
||||||
|
MmcFlags.ResponseSpiR2 | MmcFlags.ResponseR2 |
|
||||||
|
MmcFlags.CommandAc, 0, 16, 1, ref sdBuffer, out _,
|
||||||
|
out _, out var sense);
|
||||||
|
|
||||||
|
if (!sense)
|
||||||
|
{
|
||||||
|
cachedCsd = new byte[16];
|
||||||
|
Array.Copy(sdBuffer, 0, cachedCsd, 0, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
sdBuffer = new byte[16];
|
||||||
|
|
||||||
|
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle, MmcCommands.SendCid,
|
||||||
|
false, false,
|
||||||
|
MmcFlags.ResponseSpiR2 | MmcFlags.ResponseR2 |
|
||||||
|
MmcFlags.CommandAc, 0, 16, 1, ref sdBuffer, out _,
|
||||||
|
out _, out sense);
|
||||||
|
|
||||||
|
if (!sense)
|
||||||
|
{
|
||||||
|
cachedCid = new byte[16];
|
||||||
|
Array.Copy(sdBuffer, 0, cachedCid, 0, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
sdBuffer = new byte[8];
|
||||||
|
|
||||||
|
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle,
|
||||||
|
(MmcCommands) SecureDigitalCommands.SendScr, false,
|
||||||
|
true,
|
||||||
|
MmcFlags.ResponseSpiR1 | MmcFlags.ResponseR1 |
|
||||||
|
MmcFlags.CommandAdtc, 0, 8, 1, ref sdBuffer, out _,
|
||||||
|
out _, out sense);
|
||||||
|
|
||||||
|
if (!sense)
|
||||||
|
{
|
||||||
|
cachedScr = new byte[8];
|
||||||
|
Array.Copy(sdBuffer, 0, cachedScr, 0, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cachedScr != null)
|
||||||
|
{
|
||||||
|
sdBuffer = new byte[4];
|
||||||
|
|
||||||
|
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle,
|
||||||
|
(MmcCommands) SecureDigitalCommands
|
||||||
|
.SendOperatingCondition, false, true,
|
||||||
|
MmcFlags.ResponseSpiR3 | MmcFlags.ResponseR3 |
|
||||||
|
MmcFlags.CommandBcr, 0, 4, 1, ref sdBuffer,
|
||||||
|
out _, out _, out sense);
|
||||||
|
|
||||||
|
if (!sense)
|
||||||
{
|
{
|
||||||
Manufacturer = "ATA";
|
cachedScr = new byte[4];
|
||||||
|
Array.Copy(sdBuffer, 0, cachedScr, 0, 4);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
else
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Marshal.FreeHGlobal(descriptorPtr);
|
|
||||||
|
|
||||||
if (Windows.Command.IsSdhci((SafeFileHandle) FileHandle))
|
|
||||||
{
|
|
||||||
var sdBuffer = new byte[16];
|
|
||||||
|
|
||||||
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle, MmcCommands.SendCsd,
|
|
||||||
false, false,
|
|
||||||
MmcFlags.ResponseSpiR2 | MmcFlags.ResponseR2 |
|
|
||||||
MmcFlags.CommandAc, 0, 16, 1, ref sdBuffer, out _,
|
|
||||||
out _, out var sense);
|
|
||||||
|
|
||||||
if (!sense)
|
|
||||||
{
|
|
||||||
cachedCsd = new byte[16];
|
|
||||||
Array.Copy(sdBuffer, 0, cachedCsd, 0, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
sdBuffer = new byte[16];
|
|
||||||
|
|
||||||
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle, MmcCommands.SendCid,
|
|
||||||
false, false,
|
|
||||||
MmcFlags.ResponseSpiR2 | MmcFlags.ResponseR2 |
|
|
||||||
MmcFlags.CommandAc, 0, 16, 1, ref sdBuffer, out _,
|
|
||||||
out _, out sense);
|
|
||||||
|
|
||||||
if (!sense)
|
|
||||||
{
|
|
||||||
cachedCid = new byte[16];
|
|
||||||
Array.Copy(sdBuffer, 0, cachedCid, 0, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
sdBuffer = new byte[8];
|
|
||||||
|
|
||||||
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle,
|
|
||||||
(MmcCommands) SecureDigitalCommands.SendScr, false,
|
|
||||||
true,
|
|
||||||
MmcFlags.ResponseSpiR1 | MmcFlags.ResponseR1 |
|
|
||||||
MmcFlags.CommandAdtc, 0, 8, 1, ref sdBuffer, out _,
|
|
||||||
out _, out sense);
|
|
||||||
|
|
||||||
if (!sense)
|
|
||||||
{
|
|
||||||
cachedScr = new byte[8];
|
|
||||||
Array.Copy(sdBuffer, 0, cachedScr, 0, 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cachedScr != null)
|
|
||||||
{
|
|
||||||
sdBuffer = new byte[4];
|
|
||||||
|
|
||||||
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle,
|
|
||||||
(MmcCommands) SecureDigitalCommands
|
|
||||||
.SendOperatingCondition, false, true,
|
|
||||||
MmcFlags.ResponseSpiR3 | MmcFlags.ResponseR3 |
|
|
||||||
MmcFlags.CommandBcr, 0, 4, 1, ref sdBuffer,
|
|
||||||
out _, out _, out sense);
|
|
||||||
|
|
||||||
if (!sense)
|
|
||||||
{
|
{
|
||||||
cachedScr = new byte[4];
|
sdBuffer = new byte[4];
|
||||||
Array.Copy(sdBuffer, 0, cachedScr, 0, 4);
|
|
||||||
|
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle,
|
||||||
|
MmcCommands.SendOpCond, false, true,
|
||||||
|
MmcFlags.ResponseSpiR3 | MmcFlags.ResponseR3 |
|
||||||
|
MmcFlags.CommandBcr, 0, 4, 1, ref sdBuffer,
|
||||||
|
out _, out _, out sense);
|
||||||
|
|
||||||
|
if (!sense)
|
||||||
|
{
|
||||||
|
cachedScr = new byte[4];
|
||||||
|
Array.Copy(sdBuffer, 0, cachedScr, 0, 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
break;
|
||||||
|
case PlatformID.Linux:
|
||||||
|
if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
|
||||||
|
devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
|
||||||
|
devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
sdBuffer = new byte[4];
|
scsiSense = ScsiInquiry(out inqBuf, out _);
|
||||||
|
}
|
||||||
LastError = Windows.Command.SendMmcCommand((SafeFileHandle) FileHandle,
|
// MultiMediaCard and SecureDigital go here
|
||||||
MmcCommands.SendOpCond, false, true,
|
else if (devicePath.StartsWith("/dev/mmcblk", StringComparison.Ordinal))
|
||||||
MmcFlags.ResponseSpiR3 | MmcFlags.ResponseR3 |
|
{
|
||||||
MmcFlags.CommandBcr, 0, 4, 1, ref sdBuffer,
|
var devPath = devicePath.Substring(5);
|
||||||
out _, out _, out sense);
|
if (File.Exists("/sys/block/" + devPath + "/device/csd"))
|
||||||
|
|
||||||
if (!sense)
|
|
||||||
{
|
{
|
||||||
cachedScr = new byte[4];
|
var len =
|
||||||
Array.Copy(sdBuffer, 0, cachedScr, 0, 4);
|
ConvertFromHexAscii("/sys/block/" + devPath + "/device/csd", out cachedCsd);
|
||||||
|
if (len == 0) cachedCsd = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists("/sys/block/" + devPath + "/device/cid"))
|
||||||
|
{
|
||||||
|
var len =
|
||||||
|
ConvertFromHexAscii("/sys/block/" + devPath + "/device/cid", out cachedCid);
|
||||||
|
if (len == 0) cachedCid = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists("/sys/block/" + devPath + "/device/scr"))
|
||||||
|
{
|
||||||
|
var len =
|
||||||
|
ConvertFromHexAscii("/sys/block/" + devPath + "/device/scr", out cachedScr);
|
||||||
|
if (len == 0) cachedScr = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists("/sys/block/" + devPath + "/device/ocr"))
|
||||||
|
{
|
||||||
|
var len =
|
||||||
|
ConvertFromHexAscii("/sys/block/" + devPath + "/device/ocr", out cachedOcr);
|
||||||
|
if (len == 0) cachedOcr = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case PlatformID.Linux:
|
default:
|
||||||
if (devicePath.StartsWith("/dev/sd", StringComparison.Ordinal) ||
|
|
||||||
devicePath.StartsWith("/dev/sr", StringComparison.Ordinal) ||
|
|
||||||
devicePath.StartsWith("/dev/st", StringComparison.Ordinal))
|
|
||||||
{
|
|
||||||
scsiSense = ScsiInquiry(out inqBuf, out _);
|
scsiSense = ScsiInquiry(out inqBuf, out _);
|
||||||
}
|
break;
|
||||||
// MultiMediaCard and SecureDigital go here
|
}
|
||||||
else if (devicePath.StartsWith("/dev/mmcblk", StringComparison.Ordinal))
|
}
|
||||||
{
|
else
|
||||||
var devPath = devicePath.Substring(5);
|
{
|
||||||
if (File.Exists("/sys/block/" + devPath + "/device/csd"))
|
Type = remote.GetDeviceType();
|
||||||
{
|
// TODO: Get INQUIRY if SCSI or ATAPI
|
||||||
var len =
|
// TODO: Get SD/MMC registers if SD/MMC
|
||||||
ConvertFromHexAscii("/sys/block/" + devPath + "/device/csd", out cachedCsd);
|
|
||||||
if (len == 0) cachedCsd = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (File.Exists("/sys/block/" + devPath + "/device/cid"))
|
|
||||||
{
|
|
||||||
var len =
|
|
||||||
ConvertFromHexAscii("/sys/block/" + devPath + "/device/cid", out cachedCid);
|
|
||||||
if (len == 0) cachedCid = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (File.Exists("/sys/block/" + devPath + "/device/scr"))
|
|
||||||
{
|
|
||||||
var len =
|
|
||||||
ConvertFromHexAscii("/sys/block/" + devPath + "/device/scr", out cachedScr);
|
|
||||||
if (len == 0) cachedScr = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (File.Exists("/sys/block/" + devPath + "/device/ocr"))
|
|
||||||
{
|
|
||||||
var len =
|
|
||||||
ConvertFromHexAscii("/sys/block/" + devPath + "/device/ocr", out cachedOcr);
|
|
||||||
if (len == 0) cachedOcr = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
scsiSense = ScsiInquiry(out inqBuf, out _);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region SecureDigital / MultiMediaCard
|
#region SecureDigital / MultiMediaCard
|
||||||
@@ -424,6 +434,7 @@ namespace DiscImageChef.Devices
|
|||||||
|
|
||||||
#endregion SecureDigital / MultiMediaCard
|
#endregion SecureDigital / MultiMediaCard
|
||||||
|
|
||||||
|
|
||||||
#region USB
|
#region USB
|
||||||
|
|
||||||
switch (PlatformId)
|
switch (PlatformId)
|
||||||
|
|||||||
@@ -371,7 +371,64 @@ namespace DiscImageChef.Devices.Remote
|
|||||||
|
|
||||||
public DeviceType GetDeviceType()
|
public DeviceType GetDeviceType()
|
||||||
{
|
{
|
||||||
throw new NotImplementedException("Getting remote device type not yet implemented...");
|
var cmdPkt = new DicPacketCmdGetDeviceType
|
||||||
|
{
|
||||||
|
hdr = new DicPacketHeader
|
||||||
|
{
|
||||||
|
id = Consts.PacketId,
|
||||||
|
len = (uint) Marshal.SizeOf<DicPacketCommandOpenDevice>(),
|
||||||
|
version = Consts.PacketVersion,
|
||||||
|
packetType = DicPacketType.CommandGetType
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var buf = Marshal.StructureToByteArrayLittleEndian(cmdPkt);
|
||||||
|
|
||||||
|
var len = _socket.Send(buf, SocketFlags.None);
|
||||||
|
|
||||||
|
if (len != buf.Length)
|
||||||
|
{
|
||||||
|
DicConsole.ErrorWriteLine("Could not write to the network...");
|
||||||
|
return DeviceType.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hdrBuf = new byte[Marshal.SizeOf<DicPacketHeader>()];
|
||||||
|
|
||||||
|
len = _socket.Receive(hdrBuf, hdrBuf.Length, SocketFlags.Peek);
|
||||||
|
|
||||||
|
if (len < hdrBuf.Length)
|
||||||
|
{
|
||||||
|
DicConsole.ErrorWriteLine("Could not read from the network...");
|
||||||
|
return DeviceType.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hdr = Marshal.ByteArrayToStructureLittleEndian<DicPacketHeader>(hdrBuf);
|
||||||
|
|
||||||
|
if (hdr.id != Consts.PacketId)
|
||||||
|
{
|
||||||
|
DicConsole.ErrorWriteLine("Received data is not a DIC Remote Packet...");
|
||||||
|
return DeviceType.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdr.packetType != DicPacketType.ResponseGetType)
|
||||||
|
{
|
||||||
|
DicConsole.ErrorWriteLine("Expected Device Type Response Packet, got packet type {0}...",
|
||||||
|
hdr.packetType);
|
||||||
|
return DeviceType.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = new byte[hdr.len];
|
||||||
|
len = _socket.Receive(buf, buf.Length, SocketFlags.None);
|
||||||
|
|
||||||
|
if (len < buf.Length)
|
||||||
|
{
|
||||||
|
DicConsole.ErrorWriteLine("Could not read from the network...");
|
||||||
|
return DeviceType.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
var res = Marshal.ByteArrayToStructureLittleEndian<DicPacketResGetDeviceType>(buf);
|
||||||
|
|
||||||
|
return res.device_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool GetSdhciRegisters(out byte[] csd, out byte[] cid, out byte[] ocr, out byte[] scr)
|
public bool GetSdhciRegisters(out byte[] csd, out byte[] cid, out byte[] ocr, out byte[] scr)
|
||||||
|
|||||||
Reference in New Issue
Block a user