Skip to content

Commit

Permalink
Improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
gus33000 committed Nov 17, 2024
1 parent e2bf555 commit dd381e2
Show file tree
Hide file tree
Showing 11 changed files with 724 additions and 582 deletions.
203 changes: 203 additions & 0 deletions UFPTool/FlashDevice.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
using Img2Ffu.Reader.Data;
using MadWizard.WinUSBNet;
using System;
using System.IO;
using System.Linq;
using UnifiedFlashingPlatform;

namespace UFPTool
{
internal static class FlashDevice
{
internal static void Execute(string[] args)
{
if (args.Contains("-?"))
{
PrintFlashDeviceHelp();
Environment.Exit(0);
}

if (!args.ToList().Any(x => x.Equals("-Path", StringComparison.InvariantCultureIgnoreCase)))
{
Console.WriteLine("Insufficient number of arguments");
Console.WriteLine();
PrintFlashDeviceHelp();
Environment.Exit(1);
}

string FFUPath = "";
bool Reboot = false;
string DevicePath = "";
bool VerifyWrite = false;
bool ForceSynchronousWrite = false;
bool SkipPlatformIDCheck = false;
bool SkipSignatureCheck = false;
bool SkipHash = false;

for (int i = 1; i < args.Length; i++)
{
string arg = args[i];
if (arg.Equals("-Path", StringComparison.InvariantCultureIgnoreCase))
{
if (i + 1 >= args.Length)
{
Console.WriteLine("Insufficient number of arguments");
Console.WriteLine();
PrintFlashDeviceHelp();
Environment.Exit(1);
}

i++;
FFUPath = args[i];
}
else if (arg.Equals("-DevicePath", StringComparison.InvariantCultureIgnoreCase))
{
if (i + 1 >= args.Length)
{
Console.WriteLine("Insufficient number of arguments");
Console.WriteLine();
PrintFlashDeviceHelp();
Environment.Exit(1);
}

i++;
DevicePath = args[i];
}
else if (arg.Equals("-Reboot", StringComparison.InvariantCultureIgnoreCase))
{
Reboot = true;
}
else if (arg.Equals("-VerifyWrite", StringComparison.InvariantCultureIgnoreCase))
{
VerifyWrite = true;
}
else if (arg.Equals("-ForceSynchronousWrite", StringComparison.InvariantCultureIgnoreCase))
{
ForceSynchronousWrite = true;
}
else
{
Console.WriteLine($"Unknown argument: {arg}");
Console.WriteLine();
PrintFlashDeviceHelp();
Environment.Exit(1);
}
}

if (string.IsNullOrEmpty(DevicePath))
{
USBDeviceInfo[] details = USBDevice.GetDevices("{9E3BD5F7-9690-4FCC-8810-3E2650CD6ECC}");
if (details.Length == 0)
{
Console.WriteLine("No UFP devices found");
Environment.Exit(1);
}

if (details.Length > 1)
{
Console.WriteLine("Multiple UFP devices found. Please specify the device path");
Console.WriteLine();
Console.WriteLine("Available devices:");
for (int i = 0; i < details.Length; i++)
{
Console.WriteLine($" {i + 1}. {details[i].DevicePath} {details[i].DeviceDescription} ({details[i].Manufacturer})");
}
Environment.Exit(1);
}

DevicePath = details[0].DevicePath;
}

Console.WriteLine($"Flashing {Path.GetFileName(FFUPath)} to device");

FlashFlags flashFlags = FlashFlags.Normal;

if (VerifyWrite)
{
flashFlags |= FlashFlags.VerifyWrite;
}

if (ForceSynchronousWrite)
{
flashFlags |= FlashFlags.ForceSynchronousWrite;
}

if (SkipPlatformIDCheck)
{
flashFlags |= FlashFlags.SkipPlatformIDCheck;
}

if (SkipSignatureCheck)
{
flashFlags |= FlashFlags.SkipSignatureCheck;
}

if (SkipHash)
{
flashFlags |= FlashFlags.SkipHash;
}

using FileStream FFUStream = new(FFUPath, FileMode.Open, FileAccess.Read, FileShare.Read);
SignedImage signedImage = new(FFUStream);
int chunkSize = signedImage.ChunkSize;
ulong totalChunkCount = (ulong)FFUStream.Length / (ulong)chunkSize;

FFUStream.Seek(0, SeekOrigin.Begin);

using UnifiedFlashingPlatformTransport ufp = new(DevicePath);

int previousPercentage = -1;

ufp.FlashFFU(FFUStream, new ProgressUpdater(totalChunkCount, (int percentage, TimeSpan? eta) =>
{
string NewText = null;
if (percentage != null)
{
NewText = $"Progress: {percentage}%";
}
if (eta != null)
{
if (NewText == null)
{
NewText = "";
}
else
{
NewText += " - ";
}
NewText += $"Estimated time remaining: {eta:h\\:mm\\:ss}";
}
if (NewText != null && previousPercentage != percentage)
{
previousPercentage = percentage;
Console.WriteLine(NewText);
}
}), ResetAfterwards: Reboot, Options: (byte)flashFlags);
}

static void PrintFlashDeviceHelp()
{
Console.WriteLine("Flash a FFU to a device via USB or network");
Console.WriteLine();
Console.WriteLine(" ImageUtility.exe FlashDevice [-Property] <[Value]> <[-Property] <[Value]>...>");
Console.WriteLine();
Console.WriteLine("Supported properties and their possible values:");
Console.WriteLine();
Console.WriteLine(" Path - Path to the FFU");
Console.WriteLine(" DevicePath - [Optional] Device path");
Console.WriteLine(" Reboot - [Optional] Reboot the device after it is flashed successfully");
Console.WriteLine(" VerifyWrite - [Optional] Verify FFU is written successfully");
Console.WriteLine(" ForceSynchronousWrite - [Optional] Force sychronous write to storage");
Console.WriteLine(" SkipPlatformIDCheck - [Optional] Skip platform ID check between device and FFU file");
Console.WriteLine(" SkipSignatureCheck - [Optional] Skip signature check between device and FFU file");
Console.WriteLine(" SkipHash - [Optional] Skip hash check of FFU file chunks");
Console.WriteLine();
Console.WriteLine("Examples:");
Console.WriteLine();
Console.WriteLine(" ImageUtility.exe FlashDevice -Path d:\\flash.ffu");
}
}
}
17 changes: 17 additions & 0 deletions UFPTool/FlashFlags.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;

namespace UFPTool
{
[Flags]
public enum FlashFlags : uint
{
Normal = 0U,
SkipPlatformIDCheck = 1U,
SkipSignatureCheck = 2U,
SkipHash = 4U,
VerifyWrite = 8U,
SkipWrite = 16U,
ForceSynchronousWrite = 32U,
FlashToRAM = 64U
}
}
82 changes: 82 additions & 0 deletions UFPTool/GetDeviceLog.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using MadWizard.WinUSBNet;
using System;
using System.IO;
using System.Linq;
using UnifiedFlashingPlatform;

namespace UFPTool
{
internal static class GetDeviceLog
{
internal static void Execute(string[] args)
{
if (args.Contains("-?"))
{
//PrintGetDeviceLogHelp();
Environment.Exit(0);
}

string DevicePath = "";

for (int i = 1; i < args.Length; i++)
{
string arg = args[i];
if (arg.Equals("-DevicePath", StringComparison.InvariantCultureIgnoreCase))
{
if (i + 1 >= args.Length)
{
Console.WriteLine("Insufficient number of arguments");
Console.WriteLine();
//PrintGetDeviceLogHelp();
Environment.Exit(1);
}

i++;
DevicePath = args[i];
}
else
{
Console.WriteLine($"Unknown argument: {arg}");
Console.WriteLine();
//PrintGetDeviceLogHelp();
Environment.Exit(1);
}
}

if (string.IsNullOrEmpty(DevicePath))
{
USBDeviceInfo[] details = USBDevice.GetDevices("{9E3BD5F7-9690-4FCC-8810-3E2650CD6ECC}");
if (details.Length == 0)
{
Console.WriteLine("No UFP devices found");
Environment.Exit(1);
}

if (details.Length > 1)
{
Console.WriteLine("Multiple UFP devices found. Please specify the device path");
Console.WriteLine();
Console.WriteLine("Available devices:");
for (int i = 0; i < details.Length; i++)
{
Console.WriteLine($"[Device {i}]");
Console.WriteLine($"Device Path: {details[i].DevicePath}");
Console.WriteLine($"Can Flash: True");
Console.WriteLine();
}
Environment.Exit(1);
}

DevicePath = details[0].DevicePath;
}

using UnifiedFlashingPlatformTransport ufp = new(DevicePath);
string logContent = ufp.ReadLog()!;

// Example FileName: FlashLog_5_19_2023_12_33_20_PM.log
string fileName = $"FlashLog_{DateTime.Now.Month}_{DateTime.Now.Day}_{DateTime.Now.Year}_{DateTime.Now.Hour}_{DateTime.Now.Minute}_{DateTime.Now.Second}_{DateTime.Now.ToString("tt", System.Globalization.CultureInfo.InvariantCulture)}.log";

File.WriteAllText(fileName, logContent);
}
}
}
78 changes: 78 additions & 0 deletions UFPTool/GetUnlockId.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using MadWizard.WinUSBNet;
using System;
using System.Linq;
using UnifiedFlashingPlatform;

namespace UFPTool
{
internal static class GetUnlockId
{
internal static void Execute(string[] args)
{
if (args.Contains("-?"))
{
//PrintGetUnlockIdHelp();
Environment.Exit(0);
}

string DevicePath = "";

for (int i = 1; i < args.Length; i++)
{
string arg = args[i];
if (arg.Equals("-DevicePath", StringComparison.InvariantCultureIgnoreCase))
{
if (i + 1 >= args.Length)
{
Console.WriteLine("Insufficient number of arguments");
Console.WriteLine();
//PrintGetUnlockIdHelp();
Environment.Exit(1);
}

i++;
DevicePath = args[i];
}
else
{
Console.WriteLine($"Unknown argument: {arg}");
Console.WriteLine();
//PrintGetUnlockIdHelp();
Environment.Exit(1);
}
}

if (string.IsNullOrEmpty(DevicePath))
{
USBDeviceInfo[] details = USBDevice.GetDevices("{9E3BD5F7-9690-4FCC-8810-3E2650CD6ECC}");
if (details.Length == 0)
{
Console.WriteLine("No UFP devices found");
Environment.Exit(1);
}

if (details.Length > 1)
{
Console.WriteLine("Multiple UFP devices found. Please specify the device path");
Console.WriteLine();
Console.WriteLine("Available devices:");
for (int i = 0; i < details.Length; i++)
{
Console.WriteLine($"[Device {i}]");
Console.WriteLine($"Device Path: {details[i].DevicePath}");
Console.WriteLine($"Can Flash: True");
Console.WriteLine();
}
Environment.Exit(1);
}

DevicePath = details[0].DevicePath;
}

using UnifiedFlashingPlatformTransport ufp = new(DevicePath);
byte[] UnlockID = ufp.ReadUnlockID();

Console.WriteLine($"Unlock id: {BitConverter.ToString(UnlockID).Replace("-", string.Empty).ToUpper()}");
}
}
}
Loading

0 comments on commit dd381e2

Please sign in to comment.