PIT: unknown version in PIT header has to be protocol version

And in that case there now exists a fifth version of the Odin
protocol, seen on Galaxy S9 and newer.

In total we have seen these versions (as of January 2022):

* 0, on devices from around 2014 or older
* 3, on devices from around 2015
* 4, on devices from around 2016 - 2017
* 5, on devices from around 2018 or newer
first-package-hack
Henrik Grimler 2022-01-01 20:31:32 +01:00
parent e9a68f6862
commit e916c679ed
No known key found for this signature in database
GPG Key ID: B0076E490B71616B
3 changed files with 12 additions and 12 deletions

View File

@ -211,7 +211,7 @@ void Interface::PrintPit(const PitData *pitData)
Interface::Print("Entry Count: %d\n", pitData->GetEntryCount()); Interface::Print("Entry Count: %d\n", pitData->GetEntryCount());
Interface::Print("Unknown string: %s\n", pitData->GetComTar2()); Interface::Print("Unknown string: %s\n", pitData->GetComTar2());
Interface::Print("CPU/bootloader tag: %s\n", pitData->GetCpuBlId()); Interface::Print("CPU/bootloader tag: %s\n", pitData->GetCpuBlId());
Interface::Print("Version(?): 0x%04x\n", pitData->GetUnknown()); Interface::Print("Protocol version: 0x%04x\n", pitData->GetProtocolVersion());
for (unsigned int i = 0; i < pitData->GetEntryCount(); i++) for (unsigned int i = 0; i < pitData->GetEntryCount(); i++)
{ {

View File

@ -69,7 +69,7 @@ PitData::PitData()
com_tar2[0] = '\0'; com_tar2[0] = '\0';
cpu_bl_id[0] = '\0'; cpu_bl_id[0] = '\0';
unknown_version = 0; protocol_version = 0;
} }
PitData::~PitData() PitData::~PitData()
@ -98,7 +98,7 @@ bool PitData::Unpack(const unsigned char *data)
return (false); return (false);
cpu_bl_id[8]='\0'; cpu_bl_id[8]='\0';
unknown_version = PitData::UnpackShort(data, 24); protocol_version = PitData::UnpackShort(data, 24);
unsigned int integerValue; unsigned int integerValue;
unsigned int entryOffset; unsigned int entryOffset;
@ -153,7 +153,7 @@ void PitData::Pack(unsigned char *data) const
memcpy(&data[8], com_tar2, 8); memcpy(&data[8], com_tar2, 8);
memcpy(&data[16], cpu_bl_id, 8); memcpy(&data[16], cpu_bl_id, 8);
PitData::PackShort(data, 24, unknown_version); PitData::PackShort(data, 24, protocol_version);
int entryOffset; int entryOffset;
@ -187,7 +187,7 @@ bool PitData::Matches(const PitData *otherPitData) const
if (entryCount == otherPitData->entryCount && if (entryCount == otherPitData->entryCount &&
(strncmp(com_tar2, otherPitData->com_tar2, 8) == 0) && (strncmp(com_tar2, otherPitData->com_tar2, 8) == 0) &&
(strncmp(cpu_bl_id, otherPitData->cpu_bl_id, 8) == 0) && (strncmp(cpu_bl_id, otherPitData->cpu_bl_id, 8) == 0) &&
unknown_version == otherPitData->unknown_version) protocol_version == otherPitData->protocol_version)
{ {
for (unsigned int i = 0; i < entryCount; i++) for (unsigned int i = 0; i < entryCount; i++)
{ {
@ -211,7 +211,7 @@ void PitData::Clear(void)
cpu_bl_id[0] = '\0'; cpu_bl_id[0] = '\0';
unknown_version = 0; protocol_version = 0;
for (unsigned int i = 0; i < entries.size(); i++) for (unsigned int i = 0; i < entries.size(); i++)
delete entries[i]; delete entries[i];

View File

@ -261,12 +261,12 @@ namespace libpit
private: private:
unsigned int entryCount; // 0x04 unsigned int entryCount; // 0x04
char com_tar2[8+1]; // 0x08 char com_tar2[8+1]; // 0x08
char cpu_bl_id[8+1]; // 0x10 char cpu_bl_id[8+1]; // 0x10
unsigned short unknown_version; // 0x18 unsigned short protocol_version; // 0x18
// Entries start at 0x1C // Entries start at 0x1C
std::vector<PitEntry *> entries; std::vector<PitEntry *> entries;
@ -375,9 +375,9 @@ namespace libpit
return cpu_bl_id; return cpu_bl_id;
} }
unsigned int GetUnknown(void) const unsigned int GetProtocolVersion(void) const
{ {
return unknown_version; return protocol_version;
} }
}; };
} }