Various Fixes

This commit is contained in:
Gustave Monce
2024-10-12 19:15:41 +02:00
parent 303c2d4b5a
commit 7c18a168fa
5 changed files with 91 additions and 44 deletions
+2 -2
View File
@@ -52,8 +52,7 @@ namespace WPinternals
byte[] RootKeyHash = null; byte[] RootKeyHash = null;
if (PhoneNotifier.CurrentInterface == PhoneInterfaces.Qualcomm_Download) if (PhoneNotifier.CurrentInterface == PhoneInterfaces.Qualcomm_Download)
{ {
QualcommDownload Download2 = new((QualcommSerial)PhoneNotifier.CurrentModel); RootKeyHash = new QualcommDownload((QualcommSerial)PhoneNotifier.CurrentModel).GetRKH();
RootKeyHash = Download2.GetRKH();
} }
List<QualcommPartition> PossibleLoaders = null; List<QualcommPartition> PossibleLoaders = null;
@@ -76,6 +75,7 @@ namespace WPinternals
QualcommSerial Serial = (QualcommSerial)PhoneNotifier.CurrentModel; QualcommSerial Serial = (QualcommSerial)PhoneNotifier.CurrentModel;
QualcommDownload Download = new(Serial); QualcommDownload Download = new(Serial);
if (Download.IsAlive()) if (Download.IsAlive())
{ {
int Attempt = 1; int Attempt = 1;
@@ -413,6 +413,16 @@ namespace WPinternals
if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader) if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader)
{ {
await SwitchModeViewModel.SwitchTo(Notifier, PhoneInterfaces.Lumia_Flash); await SwitchModeViewModel.SwitchTo(Notifier, PhoneInterfaces.Lumia_Flash);
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
await Notifier.WaitForArrival();
}
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
throw new WPinternalsException("Unexpected Mode");
}
} }
} }
@@ -811,6 +821,16 @@ namespace WPinternals
if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader) if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader)
{ {
await SwitchModeViewModel.SwitchToWithStatus(Notifier, PhoneInterfaces.Lumia_Flash, SetWorkingStatus, UpdateWorkingStatus); await SwitchModeViewModel.SwitchToWithStatus(Notifier, PhoneInterfaces.Lumia_Flash, SetWorkingStatus, UpdateWorkingStatus);
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
await Notifier.WaitForArrival();
}
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
throw new WPinternalsException("Unexpected Mode");
}
} }
} }
else else
@@ -1478,6 +1498,16 @@ namespace WPinternals
if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader) if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader)
{ {
await SwitchModeViewModel.SwitchToWithStatus(Notifier, PhoneInterfaces.Lumia_Flash, SetWorkingStatus, UpdateWorkingStatus); await SwitchModeViewModel.SwitchToWithStatus(Notifier, PhoneInterfaces.Lumia_Flash, SetWorkingStatus, UpdateWorkingStatus);
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
await Notifier.WaitForArrival();
}
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
throw new WPinternalsException("Unexpected Mode");
}
} }
// phone is in flash mode, we can exit // phone is in flash mode, we can exit
@@ -1725,14 +1755,17 @@ namespace WPinternals
await SwitchModeViewModel.SwitchToWithStatus(Notifier, PhoneInterfaces.Lumia_Flash, SetWorkingStatus, UpdateWorkingStatus); await SwitchModeViewModel.SwitchToWithStatus(Notifier, PhoneInterfaces.Lumia_Flash, SetWorkingStatus, UpdateWorkingStatus);
} }
if ((Notifier.CurrentInterface != PhoneInterfaces.Lumia_Bootloader) && (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)) if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{ {
await Notifier.WaitForArrival(); await Notifier.WaitForArrival();
} }
SetWorkingStatus("Flashing...", "The phone may reboot a couple of times. Just wait for it.", null, Status: WPinternalsStatus.Initializing); if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
throw new WPinternalsException("Unexpected Mode");
}
((LumiaBootManagerAppModel)Notifier.CurrentModel).SwitchToFlashAppContext(); SetWorkingStatus("Flashing...", "The phone may reboot a couple of times. Just wait for it.", null, Status: WPinternalsStatus.Initializing);
List<FlashPart> FlashParts = []; List<FlashPart> FlashParts = [];
@@ -1871,12 +1904,19 @@ namespace WPinternals
if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader) if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader)
{ {
((LumiaBootManagerAppModel)Notifier.CurrentModel).SwitchToFlashAppContext(); ((LumiaBootManagerAppModel)Notifier.CurrentModel).SwitchToFlashAppContext();
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
await Notifier.WaitForArrival();
}
} }
if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Flash) if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{ {
await LumiaFlashParts(Notifier, FFUPath, false, false, null, DoResetFirst, ClearFlashingStatusAtEnd: true, ShowProgress: false); throw new WPinternalsException("Unexpected Mode");
} }
await LumiaFlashParts(Notifier, FFUPath, false, false, null, DoResetFirst, ClearFlashingStatusAtEnd: true, ShowProgress: false);
} }
LogFile.Log("Phone is relocked", LogType.FileAndConsole); LogFile.Log("Phone is relocked", LogType.FileAndConsole);
@@ -2265,6 +2305,17 @@ namespace WPinternals
SetWorkingStatus("Problem detected, rolling back...", ErrorMessage); SetWorkingStatus("Problem detected, rolling back...", ErrorMessage);
await SwitchModeViewModel.SwitchTo(Notifier, PhoneInterfaces.Lumia_Flash); await SwitchModeViewModel.SwitchTo(Notifier, PhoneInterfaces.Lumia_Flash);
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
await Notifier.WaitForArrival();
}
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
throw new WPinternalsException("Unexpected Mode");
}
Parts = []; Parts = [];
// Restore original GPT, which will also reference the original NV. // Restore original GPT, which will also reference the original NV.
@@ -2495,6 +2546,16 @@ namespace WPinternals
{ {
SetWorkingStatus("Rebooting phone..."); SetWorkingStatus("Rebooting phone...");
await SwitchModeViewModel.SwitchTo(Notifier, PhoneInterfaces.Lumia_Flash); await SwitchModeViewModel.SwitchTo(Notifier, PhoneInterfaces.Lumia_Flash);
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
await Notifier.WaitForArrival();
}
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
throw new WPinternalsException("Unexpected Mode");
}
} }
else else
{ {
@@ -1564,8 +1564,22 @@ namespace WPinternals
break; break;
} }
// In case we are on an Engineering phone which isn't stuck in flashmode and booted to BootMgrApp if (Notifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader)
((LumiaBootManagerAppModel)Notifier.CurrentModel).SwitchToFlashAppContext(); {
// In case we are on an Engineering phone which isn't stuck in flashmode and booted to BootMgrApp
((LumiaBootManagerAppModel)Notifier.CurrentModel).SwitchToFlashAppContext();
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
await Notifier.WaitForArrival();
}
}
if (Notifier.CurrentInterface != PhoneInterfaces.Lumia_Flash)
{
throw new WPinternalsException("Unexpected Mode");
}
((LumiaFlashAppModel)Notifier.CurrentModel).DisableRebootTimeOut(); ((LumiaFlashAppModel)Notifier.CurrentModel).DisableRebootTimeOut();
} }
@@ -193,8 +193,7 @@ namespace WPinternals
try try
{ {
LumiaFlashAppModel Model = (LumiaFlashAppModel)Notifier.CurrentModel; LumiaFlashAppPhoneInfo Info = ((LumiaFlashAppModel)Notifier.CurrentModel).ReadPhoneInfo();
LumiaFlashAppPhoneInfo Info = Model.ReadPhoneInfo();
if ((Info.SecureFfuSupportedProtocolMask & ((ushort)FfuProtocol.ProtocolSyncV2)) == 0) // Exploit needs protocol v2 -> This check is not conclusive, because old phones also report support for this protocol, although it is really not supported. if ((Info.SecureFfuSupportedProtocolMask & ((ushort)FfuProtocol.ProtocolSyncV2)) == 0) // Exploit needs protocol v2 -> This check is not conclusive, because old phones also report support for this protocol, although it is really not supported.
{ {
@@ -443,7 +442,7 @@ namespace WPinternals
LogFile.Log("Flash in progress...", LogType.ConsoleOnly); LogFile.Log("Flash in progress...", LogType.ConsoleOnly);
SetWorkingStatus("Flashing...", null, (UInt64?)payloads.Length, Status: WPinternalsStatus.Flashing); SetWorkingStatus("Flashing...", null, (UInt64?)payloads.Length, Status: WPinternalsStatus.Flashing);
Model.SendFfuHeaderV1(FfuHeader, Options); ((LumiaFlashAppModel)Notifier.CurrentModel).SendFfuHeaderV1(FfuHeader, Options);
UInt64 counter = 0; UInt64 counter = 0;
Int32 numberOfPayloadsToSendAtOnce = 1; Int32 numberOfPayloadsToSendAtOnce = 1;
@@ -485,24 +484,25 @@ namespace WPinternals
if ((Info.SecureFfuSupportedProtocolMask & (ushort)FfuProtocol.ProtocolSyncV2) != 0) if ((Info.SecureFfuSupportedProtocolMask & (ushort)FfuProtocol.ProtocolSyncV2) != 0)
{ {
Model.SendFfuPayloadV2(payloadBuffer, Int32.Parse((counter * 100 / (UInt64)payloads.Length).ToString())); ((LumiaFlashAppModel)Notifier.CurrentModel).SendFfuPayloadV2(payloadBuffer, Int32.Parse((counter * 100 / (UInt64)payloads.Length).ToString()));
} }
else else
{ {
Model.SendFfuPayloadV1(payloadBuffer, Int32.Parse((counter * 100 / (UInt64)payloads.Length).ToString())); ((LumiaFlashAppModel)Notifier.CurrentModel).SendFfuPayloadV1(payloadBuffer, Int32.Parse((counter * 100 / (UInt64)payloads.Length).ToString()));
} }
UpdateWorkingStatus(ProgressText, null, counter, WPinternalsStatus.Flashing); UpdateWorkingStatus(ProgressText, null, counter, WPinternalsStatus.Flashing);
} }
Model.ResetPhone(); ((LumiaFlashAppModel)Notifier.CurrentModel).ResetPhone();
await Notifier.WaitForRemoval(); await Notifier.WaitForRemoval();
ExitSuccess("Flash succeeded!", null); ExitSuccess("Flash succeeded!", null);
} }
catch catch (Exception ex)
{ {
LogFile.Log(ex.Message);
throw new WPinternalsException("Custom flash failed"); throw new WPinternalsException("Custom flash failed");
} }
} }
@@ -87,34 +87,6 @@ namespace WPinternals
internal SwitchModeViewModel(PhoneNotifierViewModel PhoneNotifier, PhoneInterfaces? TargetMode, ModeSwitchProgressHandler ModeSwitchProgress, ModeSwitchErrorHandler ModeSwitchError, ModeSwitchSuccessHandler ModeSwitchSuccess, SetWorkingStatus SetWorkingStatus = null, UpdateWorkingStatus UpdateWorkingStatus = null) internal SwitchModeViewModel(PhoneNotifierViewModel PhoneNotifier, PhoneInterfaces? TargetMode, ModeSwitchProgressHandler ModeSwitchProgress, ModeSwitchErrorHandler ModeSwitchError, ModeSwitchSuccessHandler ModeSwitchSuccess, SetWorkingStatus SetWorkingStatus = null, UpdateWorkingStatus UpdateWorkingStatus = null)
: base() : base()
{ {
if ((PhoneNotifier.CurrentInterface == PhoneInterfaces.Lumia_Bootloader) && (TargetMode == PhoneInterfaces.Lumia_Flash))
{
LumiaBootManagerPhoneInfo Info = ((LumiaBootManagerAppModel)PhoneNotifier.CurrentModel).ReadPhoneInfo(false);
if (Info.BootManagerProtocolVersionMajor >= 2)
{
try
{
// The implementation of SwitchToFlashAppContext() is improved
// SwitchToFlashAppContext() should only be used with BootMgr v2
// For switching from BootMgr to FlashApp, it will use NOKS
// That will switch to a charging state, whereas a normal context switch will not start charging
// The implementation of NOKS in BootMgr mode has changed in BootMgr v2
// It does not disconnect / reconnect anymore and the apptype is changed immediately
// NOKS still doesnt return a status
// BootMgr v1 uses normal NOKS and waits for arrival of FlashApp
((LumiaBootManagerAppModel)PhoneNotifier.CurrentModel).SwitchToFlashAppContext();
// But this was called as a real switch, so we will raise an arrival event.
PhoneNotifier.CurrentInterface = PhoneInterfaces.Lumia_Flash;
PhoneNotifier.NotifyArrival();
}
catch (Exception ex)
{
LogFile.LogException(ex, LogType.FileOnly);
}
}
}
if (PhoneNotifier.CurrentInterface == TargetMode) if (PhoneNotifier.CurrentInterface == TargetMode)
{ {
ModeSwitchSuccess(PhoneNotifier.CurrentModel, (PhoneInterfaces)PhoneNotifier.CurrentInterface); ModeSwitchSuccess(PhoneNotifier.CurrentModel, (PhoneInterfaces)PhoneNotifier.CurrentInterface);