mirror of
https://github.com/ReneLergner/WPinternals.git
synced 2026-06-14 03:16:40 +10:00
Cleanup Sahara Implementation
This commit is contained in:
@@ -68,7 +68,7 @@ namespace DiscUtils.Internal
|
|||||||
result.Add(func(sVal));
|
result.Add(func(sVal));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.ToArray();
|
return [.. result];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace DiscUtils.Fat
|
|||||||
return [new VfsFileSystemInfo("FAT", "Microsoft FAT", Open)];
|
return [new VfsFileSystemInfo("FAT", "Microsoft FAT", Open)];
|
||||||
}
|
}
|
||||||
|
|
||||||
return System.Array.Empty<FileSystemInfo>();
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
private DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
|
private DiscFileSystem Open(Stream stream, VolumeInfo volumeInfo, FileSystemParameters parameters)
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ namespace DiscUtils.Fat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return dirs.ToArray();
|
return [.. dirs];
|
||||||
}
|
}
|
||||||
|
|
||||||
public DirectoryEntry[] GetFiles()
|
public DirectoryEntry[] GetFiles()
|
||||||
@@ -215,7 +215,7 @@ namespace DiscUtils.Fat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return files.ToArray();
|
return [.. files];
|
||||||
}
|
}
|
||||||
|
|
||||||
public DirectoryEntry GetEntry(long id)
|
public DirectoryEntry GetEntry(long id)
|
||||||
|
|||||||
@@ -1258,7 +1258,7 @@ namespace DiscUtils.Fat
|
|||||||
dirs.Add(Utilities.CombinePaths(path, dirEntry.Name.GetDisplayName(FatOptions.FileNameEncoding)));
|
dirs.Add(Utilities.CombinePaths(path, dirEntry.Name.GetDisplayName(FatOptions.FileNameEncoding)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return dirs.ToArray();
|
return [.. dirs];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1275,7 +1275,7 @@ namespace DiscUtils.Fat
|
|||||||
|
|
||||||
List<string> dirs = new();
|
List<string> dirs = new();
|
||||||
DoSearch(dirs, path, re, searchOption == SearchOption.AllDirectories, true, false);
|
DoSearch(dirs, path, re, searchOption == SearchOption.AllDirectories, true, false);
|
||||||
return dirs.ToArray();
|
return [.. dirs];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1294,7 +1294,7 @@ namespace DiscUtils.Fat
|
|||||||
files.Add(Utilities.CombinePaths(path, dirEntry.Name.GetDisplayName(FatOptions.FileNameEncoding)));
|
files.Add(Utilities.CombinePaths(path, dirEntry.Name.GetDisplayName(FatOptions.FileNameEncoding)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return files.ToArray();
|
return [.. files];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1311,7 +1311,7 @@ namespace DiscUtils.Fat
|
|||||||
|
|
||||||
List<string> results = new();
|
List<string> results = new();
|
||||||
DoSearch(results, path, re, searchOption == SearchOption.AllDirectories, false, true);
|
DoSearch(results, path, re, searchOption == SearchOption.AllDirectories, false, true);
|
||||||
return results.ToArray();
|
return [.. results];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1330,7 +1330,7 @@ namespace DiscUtils.Fat
|
|||||||
result.Add(Utilities.CombinePaths(path, dirEntry.Name.GetDisplayName(FatOptions.FileNameEncoding)));
|
result.Add(Utilities.CombinePaths(path, dirEntry.Name.GetDisplayName(FatOptions.FileNameEncoding)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.ToArray();
|
return [.. result];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1356,7 +1356,7 @@ namespace DiscUtils.Fat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.ToArray();
|
return [.. result];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -386,7 +386,7 @@ namespace WPinternals
|
|||||||
Result.Add(Src);
|
Result.Add(Src);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result.ToArray();
|
return [.. Result];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,14 +40,14 @@ namespace WPinternals
|
|||||||
|
|
||||||
internal PatchEngine(string PatchDefinitionsXmlString)
|
internal PatchEngine(string PatchDefinitionsXmlString)
|
||||||
{
|
{
|
||||||
XmlSerializer x = new(PatchDefinitions.GetType(), null, Array.Empty<Type>(), new XmlRootAttribute("PatchDefinitions"), "");
|
XmlSerializer x = new(PatchDefinitions.GetType(), null, [], new XmlRootAttribute("PatchDefinitions"), "");
|
||||||
MemoryStream s = new(System.Text.Encoding.ASCII.GetBytes(PatchDefinitionsXmlString));
|
MemoryStream s = new(System.Text.Encoding.ASCII.GetBytes(PatchDefinitionsXmlString));
|
||||||
PatchDefinitions = (List<PatchDefinition>)x.Deserialize(s);
|
PatchDefinitions = (List<PatchDefinition>)x.Deserialize(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void WriteDefinitions(string FilePath)
|
internal void WriteDefinitions(string FilePath)
|
||||||
{
|
{
|
||||||
XmlSerializer x = new(PatchDefinitions.GetType(), null, Array.Empty<Type>(), new XmlRootAttribute("PatchDefinitions"), "");
|
XmlSerializer x = new(PatchDefinitions.GetType(), null, [], new XmlRootAttribute("PatchDefinitions"), "");
|
||||||
|
|
||||||
XmlSerializerNamespaces ns = new();
|
XmlSerializerNamespaces ns = new();
|
||||||
ns.Add("", "");
|
ns.Add("", "");
|
||||||
|
|||||||
@@ -20,11 +20,13 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
|
||||||
namespace WPinternals
|
namespace WPinternals
|
||||||
{
|
{
|
||||||
@@ -72,6 +74,94 @@ namespace WPinternals
|
|||||||
this.Serial = Serial;
|
this.Serial = Serial;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static byte[] BuildCommandPacket(SaharaCommand SaharaCommand, byte[] CommandBuffer = null)
|
||||||
|
{
|
||||||
|
UInt32 CommandID = (uint)SaharaCommand;
|
||||||
|
UInt32 CommandBufferLength = 0;
|
||||||
|
if (CommandBuffer != null)
|
||||||
|
{
|
||||||
|
CommandBufferLength = (UInt32)CommandBuffer.Length;
|
||||||
|
}
|
||||||
|
UInt32 Length = 0x8u + CommandBufferLength;
|
||||||
|
|
||||||
|
byte[] Packet = new byte[Length];
|
||||||
|
ByteOperations.WriteUInt32(Packet, 0x00, CommandID);
|
||||||
|
ByteOperations.WriteUInt32(Packet, 0x04, Length);
|
||||||
|
|
||||||
|
if (CommandBuffer != null && CommandBufferLength != 0)
|
||||||
|
{
|
||||||
|
Buffer.BlockCopy(CommandBuffer, 0, Packet, 0x08, CommandBuffer.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] BuildHelloResponsePacket(SaharaMode SaharaMode, UInt32 ProtocolVersion = 2, UInt32 SupportedVersion = 1, UInt32 MaxPacketLength = 0 /* 0: Status OK */)
|
||||||
|
{
|
||||||
|
UInt32 Mode = (uint)SaharaMode;
|
||||||
|
|
||||||
|
// Hello packet:
|
||||||
|
// xxxxxxxx = Protocol version
|
||||||
|
// xxxxxxxx = Supported version
|
||||||
|
// xxxxxxxx = Max packet length
|
||||||
|
// xxxxxxxx = Expected mode
|
||||||
|
// 6 dwords reserved space
|
||||||
|
byte[] Hello = new byte[0x28];
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x00, ProtocolVersion);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x04, SupportedVersion);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x08, MaxPacketLength);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x0C, Mode);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x10, 0);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x14, 0);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x18, 0);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x1C, 0);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x20, 0);
|
||||||
|
ByteOperations.WriteUInt32(Hello, 0x24, 0);
|
||||||
|
|
||||||
|
return BuildCommandPacket(SaharaCommand.HelloResponse, Hello);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] BuildExecuteRequestPacket(UInt32 RequestID)
|
||||||
|
{
|
||||||
|
byte[] Execute = new byte[0x04];
|
||||||
|
ByteOperations.WriteUInt32(Execute, 0x00, RequestID);
|
||||||
|
return BuildCommandPacket(SaharaCommand.ExecuteRequest, Execute);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] BuildExecuteDataPacket(UInt32 RequestID)
|
||||||
|
{
|
||||||
|
byte[] Execute = new byte[0x04];
|
||||||
|
ByteOperations.WriteUInt32(Execute, 0x00, RequestID);
|
||||||
|
return BuildCommandPacket(SaharaCommand.ExecuteData, Execute);
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[][] GetRootKeyHashes()
|
||||||
|
{
|
||||||
|
Serial.SendData(BuildExecuteRequestPacket(0x3));
|
||||||
|
|
||||||
|
byte[] ReadDataRequest = Serial.GetResponse(null);
|
||||||
|
UInt32 ResponseID = ByteOperations.ReadUInt32(ReadDataRequest, 0);
|
||||||
|
|
||||||
|
if (ResponseID != 0xE)
|
||||||
|
{
|
||||||
|
throw new BadConnectionException();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint RKHLength = ByteOperations.ReadUInt32(ReadDataRequest, 0x0C);
|
||||||
|
|
||||||
|
Serial.SendData(BuildExecuteDataPacket(0x3));
|
||||||
|
|
||||||
|
byte[] Response = Serial.GetResponse(null, Length: (int)RKHLength);
|
||||||
|
|
||||||
|
List<byte[]> RootKeyHashes = new();
|
||||||
|
for (int i = 0; i < RKHLength / 0x20; i++)
|
||||||
|
{
|
||||||
|
RootKeyHashes.Add(Response[(i * 0x20)..((i + 1) * 0x20)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [.. RootKeyHashes];
|
||||||
|
}
|
||||||
|
|
||||||
public byte[] GetRKH()
|
public byte[] GetRKH()
|
||||||
{
|
{
|
||||||
int Step = 0;
|
int Step = 0;
|
||||||
@@ -96,30 +186,8 @@ namespace WPinternals
|
|||||||
LogFile.Log("MaxLength: 0x" + ByteOperations.ReadUInt32(Hello, 0x10).ToString("X8"), LogType.FileOnly);
|
LogFile.Log("MaxLength: 0x" + ByteOperations.ReadUInt32(Hello, 0x10).ToString("X8"), LogType.FileOnly);
|
||||||
LogFile.Log("Mode: 0x" + ByteOperations.ReadUInt32(Hello, 0x14).ToString("X8"), LogType.FileOnly);
|
LogFile.Log("Mode: 0x" + ByteOperations.ReadUInt32(Hello, 0x14).ToString("X8"), LogType.FileOnly);
|
||||||
|
|
||||||
// Packet:
|
|
||||||
// 00000002 = Hello response command id
|
|
||||||
// 00000030 = Length
|
|
||||||
// 00000002 = Protocol version
|
|
||||||
// 00000001 = Supported version
|
|
||||||
// 00000000 = Status OK
|
|
||||||
// 00000003 = Mode
|
|
||||||
// rest is reserved space
|
|
||||||
Step = 2;
|
Step = 2;
|
||||||
byte[] HelloResponse = [
|
byte[] HelloResponse = BuildHelloResponsePacket(SaharaMode.Command);
|
||||||
0x02, 0x00, 0x00, 0x00,
|
|
||||||
0x30, 0x00, 0x00, 0x00,
|
|
||||||
0x02, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x03, 0x00, 0x00, 0x00,
|
|
||||||
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00
|
|
||||||
];
|
|
||||||
Serial.SendData(HelloResponse);
|
Serial.SendData(HelloResponse);
|
||||||
|
|
||||||
Step = 3;
|
Step = 3;
|
||||||
@@ -132,36 +200,8 @@ namespace WPinternals
|
|||||||
}
|
}
|
||||||
|
|
||||||
Step = 4;
|
Step = 4;
|
||||||
Serial.SendData([
|
byte[][] RKHs = GetRootKeyHashes();
|
||||||
0x0D, 0x00, 0x00, 0x00,
|
return RKHs[0];
|
||||||
0x0C, 0x00, 0x00, 0x00,
|
|
||||||
0x03, 0x00, 0x00, 0x00
|
|
||||||
]);
|
|
||||||
|
|
||||||
Step = 5;
|
|
||||||
ReadDataRequest = Serial.GetResponse(null);
|
|
||||||
ResponseID = ByteOperations.ReadUInt32(ReadDataRequest, 0);
|
|
||||||
|
|
||||||
if (ResponseID != 0xE)
|
|
||||||
{
|
|
||||||
throw new BadConnectionException();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint RKHLength = ByteOperations.ReadUInt32(ReadDataRequest, 0x0C);
|
|
||||||
|
|
||||||
Step = 6;
|
|
||||||
Serial.SendData([
|
|
||||||
0x0F, 0x00, 0x00, 0x00,
|
|
||||||
0x0C, 0x00, 0x00, 0x00,
|
|
||||||
0x03, 0x00, 0x00, 0x00
|
|
||||||
]);
|
|
||||||
|
|
||||||
Step = 7;
|
|
||||||
byte[] Response = Serial.GetResponse(null, Length: (int)RKHLength);
|
|
||||||
|
|
||||||
byte[] Result = new byte[0x20];
|
|
||||||
Buffer.BlockCopy(Response, 3, Result, 0, 0x20);
|
|
||||||
return Result;
|
|
||||||
}
|
}
|
||||||
catch (Exception Ex)
|
catch (Exception Ex)
|
||||||
{
|
{
|
||||||
@@ -200,30 +240,8 @@ namespace WPinternals
|
|||||||
LogFile.Log("MaxLength: 0x" + ByteOperations.ReadUInt32(Hello, 0x10).ToString("X8"), LogType.FileOnly);
|
LogFile.Log("MaxLength: 0x" + ByteOperations.ReadUInt32(Hello, 0x10).ToString("X8"), LogType.FileOnly);
|
||||||
LogFile.Log("Mode: 0x" + ByteOperations.ReadUInt32(Hello, 0x14).ToString("X8"), LogType.FileOnly);
|
LogFile.Log("Mode: 0x" + ByteOperations.ReadUInt32(Hello, 0x14).ToString("X8"), LogType.FileOnly);
|
||||||
|
|
||||||
// Packet:
|
|
||||||
// 00000002 = Hello response command id
|
|
||||||
// 00000030 = Length
|
|
||||||
// 00000002 = Protocol version
|
|
||||||
// 00000001 = Supported version
|
|
||||||
// 00000000 = Status OK
|
|
||||||
// 00000000 = Mode
|
|
||||||
// rest is reserved space
|
|
||||||
Step = 2;
|
Step = 2;
|
||||||
byte[] HelloResponse = [
|
byte[] HelloResponse = BuildHelloResponsePacket(SaharaMode.ImageTransferPending);
|
||||||
0x02, 0x00, 0x00, 0x00,
|
|
||||||
0x30, 0x00, 0x00, 0x00,
|
|
||||||
0x02, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00
|
|
||||||
];
|
|
||||||
Serial.SendData(HelloResponse);
|
Serial.SendData(HelloResponse);
|
||||||
|
|
||||||
Step = 3;
|
Step = 3;
|
||||||
@@ -298,29 +316,7 @@ namespace WPinternals
|
|||||||
LogFile.Log("MaxLength: 0x" + ByteOperations.ReadUInt32(Hello, 0x10).ToString("X8"), LogType.FileOnly);
|
LogFile.Log("MaxLength: 0x" + ByteOperations.ReadUInt32(Hello, 0x10).ToString("X8"), LogType.FileOnly);
|
||||||
LogFile.Log("Mode: 0x" + ByteOperations.ReadUInt32(Hello, 0x14).ToString("X8"), LogType.FileOnly);
|
LogFile.Log("Mode: 0x" + ByteOperations.ReadUInt32(Hello, 0x14).ToString("X8"), LogType.FileOnly);
|
||||||
|
|
||||||
// Packet:
|
byte[] HelloResponse = BuildHelloResponsePacket(SaharaMode.ImageTransferPending);
|
||||||
// 00000002 = Hello response command id
|
|
||||||
// 00000030 = Length
|
|
||||||
// 00000002 = Protocol version
|
|
||||||
// 00000001 = Supported version
|
|
||||||
// 00000000 = Status OK
|
|
||||||
// 00000000 = Mode
|
|
||||||
// rest is reserved space
|
|
||||||
byte[] HelloResponse = [
|
|
||||||
0x02, 0x00, 0x00, 0x00,
|
|
||||||
0x30, 0x00, 0x00, 0x00,
|
|
||||||
0x02, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00
|
|
||||||
];
|
|
||||||
|
|
||||||
byte[] Ready = Serial.SendCommand(HelloResponse, [0x03, 0x00, 0x00, 0x00]);
|
byte[] Ready = Serial.SendCommand(HelloResponse, [0x03, 0x00, 0x00, 0x00]);
|
||||||
}
|
}
|
||||||
@@ -334,7 +330,7 @@ namespace WPinternals
|
|||||||
|
|
||||||
public void ResetSahara()
|
public void ResetSahara()
|
||||||
{
|
{
|
||||||
Serial.SendCommand([0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00], [0x08, 0x00, 0x00, 0x00]);
|
Serial.SendCommand(BuildCommandPacket(SaharaCommand.ResetRequest), [0x08, 0x00, 0x00, 0x00]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ConnectToProgrammer(byte[] PacketFromPcToProgrammer)
|
public bool ConnectToProgrammer(byte[] PacketFromPcToProgrammer)
|
||||||
@@ -469,8 +465,10 @@ namespace WPinternals
|
|||||||
|
|
||||||
public void SwitchMode(SaharaMode Mode)
|
public void SwitchMode(SaharaMode Mode)
|
||||||
{
|
{
|
||||||
byte[] SwitchModeCommand = [0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
|
byte[] SwitchMode = new byte[0x04];
|
||||||
ByteOperations.WriteUInt32(SwitchModeCommand, 8, (UInt32)Mode);
|
ByteOperations.WriteUInt32(SwitchMode, 0x00, (UInt32)Mode);
|
||||||
|
byte[] SwitchModeCommand = BuildCommandPacket(SaharaCommand.SwitchMode, SwitchMode);
|
||||||
|
|
||||||
byte[] ResponsePattern = null;
|
byte[] ResponsePattern = null;
|
||||||
switch (Mode)
|
switch (Mode)
|
||||||
{
|
{
|
||||||
@@ -490,7 +488,7 @@ namespace WPinternals
|
|||||||
public void StartProgrammer()
|
public void StartProgrammer()
|
||||||
{
|
{
|
||||||
LogFile.Log("Starting programmer", LogType.FileAndConsole);
|
LogFile.Log("Starting programmer", LogType.FileAndConsole);
|
||||||
byte[] DoneCommand = [0x05, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00];
|
byte[] DoneCommand = BuildCommandPacket(SaharaCommand.DoneRequest);
|
||||||
bool Started = false;
|
bool Started = false;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
do
|
do
|
||||||
@@ -584,7 +582,7 @@ namespace WPinternals
|
|||||||
|
|
||||||
LogFile.Log(ProgrammerCommand, LogType.FileAndConsole);
|
LogFile.Log(ProgrammerCommand, LogType.FileAndConsole);
|
||||||
|
|
||||||
byte[] PacketFromPcToProgrammer = Array.Empty<byte>();
|
byte[] PacketFromPcToProgrammer = [];
|
||||||
byte[] temp = new byte[0x200];
|
byte[] temp = new byte[0x200];
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
@@ -603,7 +601,7 @@ namespace WPinternals
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketFromPcToProgrammer = PacketFromPcToProgrammer.Concat(temp).ToArray();
|
PacketFromPcToProgrammer = [.. PacketFromPcToProgrammer, .. temp];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ExpectingReplyFromProgrammer = false;
|
bool ExpectingReplyFromProgrammer = false;
|
||||||
|
|||||||
@@ -842,10 +842,13 @@ namespace WPinternals
|
|||||||
//
|
//
|
||||||
// If you do not order payloads like this, you will get an error, most likely hash mismatch
|
// If you do not order payloads like this, you will get an error, most likely hash mismatch
|
||||||
//
|
//
|
||||||
FlashingPayload[] payloads = Array.Empty<FlashingPayload>();
|
FlashingPayload[] payloads = [];
|
||||||
if (FlashParts != null)
|
if (FlashParts != null)
|
||||||
{
|
{
|
||||||
payloads = GetNonOptimizedPayloads(FlashParts, FFU.ChunkSize, (uint)(Info.WriteBufferSize / FFU.ChunkSize), SetWorkingStatus, UpdateWorkingStatus).OrderBy(x => x.TargetLocations.Length).ToArray();
|
payloads =
|
||||||
|
[
|
||||||
|
.. GetNonOptimizedPayloads(FlashParts, FFU.ChunkSize, (uint)(Info.WriteBufferSize / FFU.ChunkSize), SetWorkingStatus, UpdateWorkingStatus).OrderBy(x => x.TargetLocations.Length),
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssumeImageHeaderFallsInGap = true;
|
bool AssumeImageHeaderFallsInGap = true;
|
||||||
@@ -1834,7 +1837,7 @@ namespace WPinternals
|
|||||||
List<FlashingPayload> flashingPayloads = new();
|
List<FlashingPayload> flashingPayloads = new();
|
||||||
if (flashParts == null)
|
if (flashParts == null)
|
||||||
{
|
{
|
||||||
return flashingPayloads.ToArray();
|
return [.. flashingPayloads];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (UInt32 j = 0; j < flashParts.Count; j++)
|
for (UInt32 j = 0; j < flashParts.Count; j++)
|
||||||
@@ -1853,7 +1856,7 @@ namespace WPinternals
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return flashingPayloads.ToArray();
|
return [.. flashingPayloads];
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1865,7 +1868,7 @@ namespace WPinternals
|
|||||||
List<FlashingPayload> flashingPayloads = new();
|
List<FlashingPayload> flashingPayloads = new();
|
||||||
if (flashParts == null)
|
if (flashParts == null)
|
||||||
{
|
{
|
||||||
return flashingPayloads.ToArray();
|
return [.. flashingPayloads];
|
||||||
}
|
}
|
||||||
|
|
||||||
long TotalProcess1 = 0;
|
long TotalProcess1 = 0;
|
||||||
@@ -1898,7 +1901,7 @@ namespace WPinternals
|
|||||||
var payloadIndex = flashingPayloads.FindIndex(x => ByteOperations.Compare(x.ChunkHashes[0], hash));
|
var payloadIndex = flashingPayloads.FindIndex(x => ByteOperations.Compare(x.ChunkHashes[0], hash));
|
||||||
var locationList = flashingPayloads[payloadIndex].TargetLocations.ToList();
|
var locationList = flashingPayloads[payloadIndex].TargetLocations.ToList();
|
||||||
locationList.Add((flashPart.StartSector * 0x200 / (UInt32)chunkSize) + i);
|
locationList.Add((flashPart.StartSector * 0x200 / (UInt32)chunkSize) + i);
|
||||||
flashingPayloads[payloadIndex].TargetLocations = locationList.ToArray();
|
flashingPayloads[payloadIndex].TargetLocations = [.. locationList];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1910,7 +1913,7 @@ namespace WPinternals
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return flashingPayloads.ToArray();
|
return [.. flashingPayloads];
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static string GetProgrammerPath(byte[] RKH, string Type)
|
internal static string GetProgrammerPath(byte[] RKH, string Type)
|
||||||
@@ -2262,7 +2265,7 @@ namespace WPinternals
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Parts = Parts.OrderBy(p => p.StartSector).ToList();
|
Parts = [.. Parts.OrderBy(p => p.StartSector)];
|
||||||
int Count = 1;
|
int Count = 1;
|
||||||
Parts.Where(p => p.ProgressText?.StartsWith("Flashing partition ") == true).ToList().ForEach((p) =>
|
Parts.Where(p => p.ProgressText?.StartsWith("Flashing partition ") == true).ToList().ForEach((p) =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -218,10 +218,13 @@ namespace WPinternals
|
|||||||
//
|
//
|
||||||
// If you do not order payloads like this, you will get an error, most likely hash mismatch
|
// If you do not order payloads like this, you will get an error, most likely hash mismatch
|
||||||
//
|
//
|
||||||
LumiaV2UnlockBootViewModel.FlashingPayload[] payloads = Array.Empty<LumiaV2UnlockBootViewModel.FlashingPayload>();
|
LumiaV2UnlockBootViewModel.FlashingPayload[] payloads = [];
|
||||||
if (FlashParts != null)
|
if (FlashParts != null)
|
||||||
{
|
{
|
||||||
payloads = LumiaV2UnlockBootViewModel.GetNonOptimizedPayloads(FlashParts, chunkSizes, Info.WriteBufferSize / chunkSize, SetWorkingStatus, UpdateWorkingStatus).OrderBy(x => x.TargetLocations.Length).ToArray();
|
payloads =
|
||||||
|
[
|
||||||
|
.. LumiaV2UnlockBootViewModel.GetNonOptimizedPayloads(FlashParts, chunkSizes, Info.WriteBufferSize / chunkSize, SetWorkingStatus, UpdateWorkingStatus).OrderBy(x => x.TargetLocations.Length),
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
MemoryStream Headerstream1 = new();
|
MemoryStream Headerstream1 = new();
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ namespace MadWizard.WinUSBNet.API
|
|||||||
SetupDiDestroyDeviceInfoList(deviceInfoSet);
|
SetupDiDestroyDeviceInfoList(deviceInfoSet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return deviceList.ToArray();
|
return [.. deviceList];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RegisterForDeviceNotifications(IntPtr controlHandle, Guid classGuid, ref IntPtr deviceNotificationHandle)
|
public static void RegisterForDeviceNotifications(IntPtr controlHandle, Guid classGuid, ref IntPtr deviceNotificationHandle)
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ namespace MadWizard.WinUSBNet.API
|
|||||||
throw APIException.Win32("Failed to get WinUSB device pipe information.");
|
throw APIException.Win32("Failed to get WinUSB device pipe information.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pipes = pipeList.ToArray();
|
pipes = [.. pipeList];
|
||||||
}
|
}
|
||||||
private void InitializeDevice()
|
private void InitializeDevice()
|
||||||
{
|
{
|
||||||
@@ -290,7 +290,7 @@ namespace MadWizard.WinUSBNet.API
|
|||||||
// also in case of exception (which is why it is in finally block),
|
// also in case of exception (which is why it is in finally block),
|
||||||
// because some handles might have already been opened and need
|
// because some handles might have already been opened and need
|
||||||
// to be disposed.
|
// to be disposed.
|
||||||
_addInterfaces = interfaces.ToArray();
|
_addInterfaces = [.. interfaces];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bind handle (needed for overlapped I/O thread pool)
|
// Bind handle (needed for overlapped I/O thread pool)
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ namespace MadWizard.WinUSBNet
|
|||||||
USBPipeCollection pipeCollection = new(interfacePipes);
|
USBPipeCollection pipeCollection = new(interfacePipes);
|
||||||
interfaces[i] = new USBInterface(this, i, descriptor, pipeCollection);
|
interfaces[i] = new USBInterface(this, i, descriptor, pipeCollection);
|
||||||
}
|
}
|
||||||
Pipes = new USBPipeCollection(allPipes.ToArray());
|
Pipes = new USBPipeCollection([.. allPipes]);
|
||||||
Interfaces = new USBInterfaceCollection(interfaces);
|
Interfaces = new USBInterfaceCollection(interfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,7 +424,7 @@ namespace MadWizard.WinUSBNet
|
|||||||
public void ControlTransfer(byte requestType, byte request, int value, int index)
|
public void ControlTransfer(byte requestType, byte request, int value, int index)
|
||||||
{
|
{
|
||||||
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
||||||
ControlTransfer(requestType, request, value, index, Array.Empty<byte>(), 0);
|
ControlTransfer(requestType, request, value, index, [], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckIn(byte requestType)
|
private void CheckIn(byte requestType)
|
||||||
@@ -518,7 +518,7 @@ namespace MadWizard.WinUSBNet
|
|||||||
{
|
{
|
||||||
CheckIn(requestType);
|
CheckIn(requestType);
|
||||||
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
||||||
ControlTransfer(requestType, request, value, index, Array.Empty<byte>());
|
ControlTransfer(requestType, request, value, index, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -566,7 +566,7 @@ namespace MadWizard.WinUSBNet
|
|||||||
{
|
{
|
||||||
CheckOut(requestType);
|
CheckOut(requestType);
|
||||||
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
||||||
ControlTransfer(requestType, request, value, index, Array.Empty<byte>());
|
ControlTransfer(requestType, request, value, index, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -591,7 +591,7 @@ namespace MadWizard.WinUSBNet
|
|||||||
public IAsyncResult BeginControlTransfer(byte requestType, byte request, int value, int index, AsyncCallback userCallback, object stateObject)
|
public IAsyncResult BeginControlTransfer(byte requestType, byte request, int value, int index, AsyncCallback userCallback, object stateObject)
|
||||||
{
|
{
|
||||||
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
||||||
return BeginControlTransfer(requestType, request, value, index, Array.Empty<byte>(), 0, userCallback, stateObject);
|
return BeginControlTransfer(requestType, request, value, index, [], 0, userCallback, stateObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -732,7 +732,7 @@ namespace MadWizard.WinUSBNet
|
|||||||
{
|
{
|
||||||
CheckOut(requestType);
|
CheckOut(requestType);
|
||||||
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
// TODO: null instead of empty buffer. But overlapped code would have to be fixed for this (no buffer to pin)
|
||||||
return BeginControlTransfer(requestType, request, value, index, Array.Empty<byte>(), userCallback, stateObject);
|
return BeginControlTransfer(requestType, request, value, index, [], userCallback, stateObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckNotDisposed()
|
private void CheckNotDisposed()
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ namespace MadWizard.WinUSBNet
|
|||||||
matchingInterfaces.Add(iface);
|
matchingInterfaces.Add(iface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return matchingInterfaces.ToArray();
|
return [.. matchingInterfaces];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user