From ee02a9c7c51d069de26f04d8d9464d573ed82d22 Mon Sep 17 00:00:00 2001 From: Benjamin Dobell Date: Wed, 28 Mar 2012 23:59:27 +1100 Subject: Made the last parameter of EndFileTransferPacket partitionType (obtained from the device's PIT) --- heimdall/source/BridgeManager.cpp | 46 ++++++++++++++-------------- heimdall/source/BridgeManager.h | 4 +-- heimdall/source/EndFileTransferPacket.h | 12 ++++---- heimdall/source/EndModemFileTransferPacket.h | 4 +-- heimdall/source/EndPhoneFileTransferPacket.h | 4 +-- heimdall/source/SetupSessionResponse.h | 2 +- heimdall/source/main.cpp | 45 ++++++++++++++++----------- 7 files changed, 63 insertions(+), 54 deletions(-) diff --git a/heimdall/source/BridgeManager.cpp b/heimdall/source/BridgeManager.cpp index db522ec..787aa88 100644 --- a/heimdall/source/BridgeManager.cpp +++ b/heimdall/source/BridgeManager.cpp @@ -520,7 +520,7 @@ bool BridgeManager::BeginSession(void) const if (!ReceivePacket(&setupSessionResponse)) return (false); - int result = setupSessionResponse.GetUnknown(); + unsigned int result = setupSessionResponse.GetUnknown(); // 131072 for Galaxy S II, 0 for other devices. if (result != 0 && result != 131072) @@ -542,7 +542,7 @@ bool BridgeManager::BeginSession(void) const if (!ReceivePacket(&setupSessionResponse)) return (false); - int deviceType = setupSessionResponse.GetUnknown(); + unsigned int deviceType = setupSessionResponse.GetUnknown(); // TODO: Work out what this value is... it has been either 180 or 0 for Galaxy S phones, 3 on the Galaxy Tab, 190 for SHW-M110S. if (deviceType != 180 && deviceType != 0 && deviceType != 3 && deviceType != 190) @@ -846,7 +846,7 @@ int BridgeManager::ReceivePitFile(unsigned char **pitBuffer) const PitFileResponse *pitFileResponse = new PitFileResponse(); success = ReceivePacket(pitFileResponse); - int fileSize = pitFileResponse->GetFileSize(); + unsigned int fileSize = pitFileResponse->GetFileSize(); delete pitFileResponse; if (!success) @@ -855,7 +855,7 @@ int BridgeManager::ReceivePitFile(unsigned char **pitBuffer) const return (0); } - int transferCount = fileSize / ReceiveFilePartPacket::kDataSize; + unsigned int transferCount = fileSize / ReceiveFilePartPacket::kDataSize; if (fileSize % ReceiveFilePartPacket::kDataSize != 0) transferCount++; @@ -863,7 +863,7 @@ int BridgeManager::ReceivePitFile(unsigned char **pitBuffer) const int offset = 0; // NOTE: The PIT file appears to always be padded out to exactly 4 kilobytes. - for (int i = 0; i < transferCount; i++) + for (unsigned int i = 0; i < transferCount; i++) { DumpPartPitFilePacket *requestPacket = new DumpPartPitFilePacket(i); success = SendPacket(requestPacket); @@ -921,7 +921,7 @@ int BridgeManager::ReceivePitFile(unsigned char **pitBuffer) const return (fileSize); } -bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) const +bool BridgeManager::SendFile(FILE *file, unsigned int destination, unsigned int partitionType, unsigned int fileIdentifier) const { if (destination != EndFileTransferPacket::kDestinationModem && destination != EndFileTransferPacket::kDestinationPhone) { @@ -929,7 +929,7 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co return (false); } - if (destination == EndFileTransferPacket::kDestinationModem && fileIdentifier != -1) + if (destination == EndFileTransferPacket::kDestinationModem && fileIdentifier != 0xFFFFFFFF) { Interface::PrintError("The modem file does not have an identifier!\n"); return (false); @@ -959,10 +959,10 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co return (false); } - int sequenceCount = fileSize / (kMaxSequenceLength * SendFilePartPacket::kDefaultPacketSize); - int lastSequenceSize = kMaxSequenceLength; - int partialPacketLength = fileSize % SendFilePartPacket::kDefaultPacketSize; - if (fileSize % (kMaxSequenceLength * SendFilePartPacket::kDefaultPacketSize) != 0) + unsigned int sequenceCount = fileSize / (kMaxSequenceLength * SendFilePartPacket::kDefaultPacketSize); + unsigned int lastSequenceSize = kMaxSequenceLength; + unsigned int partialPacketLength = fileSize % SendFilePartPacket::kDefaultPacketSize; + if (fileSize % (kMaxSequenceLength * SendFilePartPacket::kDefaultPacketSize) != 0) { sequenceCount++; @@ -973,15 +973,15 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co } long bytesTransferred = 0; - int currentPercent; - int previousPercent = 0; + unsigned int currentPercent; + unsigned int previousPercent = 0; Interface::Print("0%%"); - for (int sequenceIndex = 0; sequenceIndex < sequenceCount; sequenceIndex++) + for (unsigned int sequenceIndex = 0; sequenceIndex < sequenceCount; sequenceIndex++) { // Min(lastSequenceSize, 131072) bool isLastSequence = sequenceIndex == sequenceCount - 1; - int sequenceSize = (isLastSequence) ? lastSequenceSize : kMaxSequenceLength; + unsigned int sequenceSize = (isLastSequence) ? lastSequenceSize : kMaxSequenceLength; FlashPartFileTransferPacket *beginFileTransferPacket = new FlashPartFileTransferPacket(0, 2 * sequenceSize); success = SendPacket(beginFileTransferPacket); @@ -1008,7 +1008,7 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co SendFilePartPacket *sendFilePartPacket; SendFilePartResponse *sendFilePartResponse; - for (int filePartIndex = 0; filePartIndex < sequenceSize; filePartIndex++) + for (unsigned int filePartIndex = 0; filePartIndex < sequenceSize; filePartIndex++) { // Send sendFilePartPacket = new SendFilePartPacket(file); @@ -1061,7 +1061,7 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co // Response sendFilePartResponse = new SendFilePartResponse(); success = ReceivePacket(sendFilePartResponse); - int receivedPartIndex = sendFilePartResponse->GetPartIndex(); + unsigned int receivedPartIndex = sendFilePartResponse->GetPartIndex(); if (verbose) { @@ -1100,7 +1100,6 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co currentPercent = (int)(100.0f * ((float)bytesTransferred / (float)fileSize)); - if (currentPercent != previousPercent) { if (!verbose) @@ -1119,12 +1118,13 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co previousPercent = currentPercent; } - int lastFullPacketIndex = 2 * ((isLastSequence && partialPacketLength != 0) ? sequenceSize - 1 : sequenceSize); + unsigned int lastFullPacketIndex = 2 * ((isLastSequence && partialPacketLength != 0) ? sequenceSize - 1 : sequenceSize); if (destination == EndFileTransferPacket::kDestinationPhone) { EndPhoneFileTransferPacket *endPhoneFileTransferPacket = new EndPhoneFileTransferPacket( - (isLastSequence) ? partialPacketLength : 0, lastFullPacketIndex, 0, 0, fileIdentifier, isLastSequence); + (isLastSequence) ? partialPacketLength : 0, lastFullPacketIndex, 0, partitionType, fileIdentifier, + isLastSequence); success = SendPacket(endPhoneFileTransferPacket, 3000); delete endPhoneFileTransferPacket; @@ -1139,7 +1139,7 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co else // destination == EndFileTransferPacket::kDestinationModem { EndModemFileTransferPacket *endModemFileTransferPacket = new EndModemFileTransferPacket( - (isLastSequence) ? partialPacketLength : 0, lastFullPacketIndex, 0, 0, isLastSequence); + (isLastSequence) ? partialPacketLength : 0, lastFullPacketIndex, 0, partitionType, isLastSequence); success = SendPacket(endModemFileTransferPacket, 3000); delete endModemFileTransferPacket; @@ -1170,7 +1170,7 @@ bool BridgeManager::SendFile(FILE *file, int destination, int fileIdentifier) co return (true); } -bool BridgeManager::ReceiveDump(int chipType, int chipId, FILE *file) const +bool BridgeManager::ReceiveDump(unsigned int chipType, unsigned int chipId, FILE *file) const { bool success; @@ -1201,7 +1201,7 @@ bool BridgeManager::ReceiveDump(int chipType, int chipId, FILE *file) const transferCount++; char *buffer = new char[kDumpBufferSize * ReceiveFilePartPacket::kDataSize]; - int bufferOffset = 0; + unsigned int bufferOffset = 0; for (unsigned int i = 0; i < transferCount; i++) { diff --git a/heimdall/source/BridgeManager.h b/heimdall/source/BridgeManager.h index f929ac9..a1586c8 100644 --- a/heimdall/source/BridgeManager.h +++ b/heimdall/source/BridgeManager.h @@ -121,8 +121,8 @@ namespace Heimdall bool SendPitFile(FILE *file) const; int ReceivePitFile(unsigned char **pitBuffer) const; - bool SendFile(FILE *file, int destination, int fileIdentifier = -1) const; - bool ReceiveDump(int chipType, int chipId, FILE *file) const; + bool SendFile(FILE *file, unsigned int destination, unsigned int partitionType, unsigned int fileIdentifier = 0xFFFFFFFF) const; + bool ReceiveDump(unsigned int chipType, unsigned int chipId, FILE *file) const; bool IsVerbose(void) const { diff --git a/heimdall/source/EndFileTransferPacket.h b/heimdall/source/EndFileTransferPacket.h index a67eeaa..73353d5 100644 --- a/heimdall/source/EndFileTransferPacket.h +++ b/heimdall/source/EndFileTransferPacket.h @@ -49,12 +49,12 @@ namespace Heimdall unsigned short partialPacketLength; // Length or (length - 65536) if lastFullPacket is odd. unsigned int lastFullPacketIndex; unsigned short unknown1; - unsigned int unknown2; + unsigned int partitionType; protected: EndFileTransferPacket(unsigned int destination, unsigned int partialPacketLength, unsigned int lastFullPacketIndex, - unsigned short unknown1, unsigned int unknown2) + unsigned short unknown1, unsigned int partitionType) : FileTransferPacket(FileTransferPacket::kRequestEnd) { this->destination = destination; @@ -71,7 +71,7 @@ namespace Heimdall } this->unknown1 = unknown1; - this->unknown2 = unknown2; + this->partitionType = partitionType; } public: @@ -99,9 +99,9 @@ namespace Heimdall return (unknown1); } - unsigned int GetUnknown2(void) const + unsigned int GetPartitionType(void) const { - return (unknown2); + return (partitionType); } virtual void Pack(void) @@ -112,7 +112,7 @@ namespace Heimdall PackShort(FileTransferPacket::kDataSize + 4, partialPacketLength); PackInteger(FileTransferPacket::kDataSize + 6, lastFullPacketIndex); PackShort(FileTransferPacket::kDataSize + 10, unknown1); - PackInteger(FileTransferPacket::kDataSize + 12, unknown2); + PackInteger(FileTransferPacket::kDataSize + 12, partitionType); } }; } diff --git a/heimdall/source/EndModemFileTransferPacket.h b/heimdall/source/EndModemFileTransferPacket.h index f4f4d56..a2d88ca 100644 --- a/heimdall/source/EndModemFileTransferPacket.h +++ b/heimdall/source/EndModemFileTransferPacket.h @@ -35,9 +35,9 @@ namespace Heimdall public: EndModemFileTransferPacket(unsigned int partialPacketLength, unsigned int lastFullPacketIndex, unsigned short unknown1, - unsigned int unknown2, bool endOfFile) + unsigned int partitionType, bool endOfFile) : EndFileTransferPacket(EndFileTransferPacket::kDestinationModem, partialPacketLength, - lastFullPacketIndex, unknown1, unknown2) + lastFullPacketIndex, unknown1, partitionType) { this->endOfFile = (endOfFile) ? 1 : 0; } diff --git a/heimdall/source/EndPhoneFileTransferPacket.h b/heimdall/source/EndPhoneFileTransferPacket.h index e3af6ed..f035511 100644 --- a/heimdall/source/EndPhoneFileTransferPacket.h +++ b/heimdall/source/EndPhoneFileTransferPacket.h @@ -58,9 +58,9 @@ namespace Heimdall public: EndPhoneFileTransferPacket(unsigned int partialPacketLength, unsigned int lastFullPacketIndex, unsigned short unknown1, - unsigned int unknown2, unsigned int fileIdentifier, bool endOfFile) + unsigned int partitionType, unsigned int fileIdentifier, bool endOfFile) : EndFileTransferPacket(EndFileTransferPacket::kDestinationPhone, partialPacketLength, - lastFullPacketIndex, unknown1, unknown2) + lastFullPacketIndex, unknown1, partitionType) { this->fileIdentifier = fileIdentifier; this->endOfFile = (endOfFile) ? 1 : 0; diff --git a/heimdall/source/SetupSessionResponse.h b/heimdall/source/SetupSessionResponse.h index a107f29..2f854b1 100644 --- a/heimdall/source/SetupSessionResponse.h +++ b/heimdall/source/SetupSessionResponse.h @@ -38,7 +38,7 @@ namespace Heimdall { } - int GetUnknown(void) const + unsigned int GetUnknown(void) const { return (unknown); } diff --git a/heimdall/source/main.cpp b/heimdall/source/main.cpp index 2d05e33..bd4403b 100644 --- a/heimdall/source/main.cpp +++ b/heimdall/source/main.cpp @@ -69,13 +69,15 @@ enum vector knownPartitionNames[kKnownPartitionCount]; -struct PartitionNameFilePair +struct PartitionInfo { + unsigned int partitionType; string partitionName; FILE *file; - PartitionNameFilePair(const char *partitionName, FILE *file) + PartitionInfo(unsigned int partitionType, const char *partitionName, FILE *file) { + this->partitionType = partitionType; this->partitionName = partitionName; this->file = file; } @@ -179,7 +181,7 @@ bool openFiles(const map& argumentMap, map& argu return (true); } -bool mapFilesToPartitions(const map& argumentFileMap, const PitData *pitData, map& partitionFileMap) +bool mapFilesToPartitions(const map& argumentFileMap, const PitData *pitData, map& partitionInfoMap) { map::const_iterator it = argumentFileMap.begin(); @@ -216,8 +218,9 @@ bool mapFilesToPartitions(const map& argumentFileMap, const PitD if (!pitEntry && knownPartition == kKnownPartitionPit) { - PartitionNameFilePair partitionNameFilePair(knownPartitionNames[kKnownPartitionPit][0], it->second); - partitionFileMap.insert(pair(static_cast(-1), partitionNameFilePair)); + // NOTE: We're assuming a PIT file always has partitionType zero. + PartitionInfo partitionInfo(0, knownPartitionNames[kKnownPartitionPit][0], it->second); + partitionInfoMap.insert(pair(0xFFFFFFFF, partitionInfo)); return (true); } @@ -229,8 +232,8 @@ bool mapFilesToPartitions(const map& argumentFileMap, const PitD return (false); } - PartitionNameFilePair partitionNameFilePair(pitEntry->GetPartitionName(), it->second); - partitionFileMap.insert(pair(pitEntry->GetPartitionIdentifier(), partitionNameFilePair)); + PartitionInfo partitionInfo(pitEntry->GetPartitionType(), pitEntry->GetPartitionName(), it->second); + partitionInfoMap.insert(pair(pitEntry->GetPartitionIdentifier(), partitionInfo)); } return (true); @@ -261,7 +264,7 @@ int downloadPitFile(BridgeManager *bridgeManager, unsigned char **pitBuffer) return (devicePitFileSize); } -bool flashFile(BridgeManager *bridgeManager, unsigned int partitionIndex, const char *partitionName, FILE *file) +bool flashFile(BridgeManager *bridgeManager, unsigned int partitionType, unsigned int partitionIndex, const char *partitionName, FILE *file) { // PIT files need to be handled differently, try determine if the partition we're flashing to is a PIT partition. bool isPit = false; @@ -310,7 +313,7 @@ bool flashFile(BridgeManager *bridgeManager, unsigned int partitionIndex, const //if (bridgeManager->SendFile(file, EndPhoneFileTransferPacket::kDestinationPhone, // <-- Kies method. WARNING: Doesn't work on Galaxy Tab! // EndPhoneFileTransferPacket::kFileModem)) - if (bridgeManager->SendFile(file, EndModemFileTransferPacket::kDestinationModem)) // <-- Odin method + if (bridgeManager->SendFile(file, EndModemFileTransferPacket::kDestinationModem, partitionType)) // <-- Odin method { Interface::Print("%s upload successful\n", partitionName); return (true); @@ -326,7 +329,7 @@ bool flashFile(BridgeManager *bridgeManager, unsigned int partitionIndex, const // We're uploading to a phone partition Interface::Print("Uploading %s\n", partitionName); - if (bridgeManager->SendFile(file, EndPhoneFileTransferPacket::kDestinationPhone, partitionIndex)) + if (bridgeManager->SendFile(file, EndPhoneFileTransferPacket::kDestinationPhone, partitionType, partitionIndex)) { Interface::Print("%s upload successful\n", partitionName); return (true); @@ -451,10 +454,10 @@ bool attemptFlash(BridgeManager *bridgeManager, map argumentFile } } - map partitionFileMap; + map partitionInfoMap; // Map the files being flashed to partitions stored in the PIT file. - if (!mapFilesToPartitions(argumentFileMap, pitData, partitionFileMap)) + if (!mapFilesToPartitions(argumentFileMap, pitData, partitionInfoMap)) { delete pitData; return (false); @@ -465,11 +468,13 @@ bool attemptFlash(BridgeManager *bridgeManager, map argumentFile // If we're repartitioning then we need to flash the PIT file first. if (repartition) { - for (map::iterator it = partitionFileMap.begin(); it != partitionFileMap.end(); it++) + for (map::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++) { if (it->second.file == localPitFile) { - if (!flashFile(bridgeManager, it->first, it->second.partitionName.c_str(), it->second.file)) + PartitionInfo *partitionInfo = &(it->second); + + if (!flashFile(bridgeManager, partitionInfo->partitionType, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file)) return (false); break; @@ -478,21 +483,25 @@ bool attemptFlash(BridgeManager *bridgeManager, map argumentFile } // Flash partitions not involved in the boot process second. - for (map::iterator it = partitionFileMap.begin(); it != partitionFileMap.end(); it++) + for (map::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++) { if (!isKnownPartition(it->second.partitionName.c_str(), kKnownPartitionPit) && !isKnownBootPartition(it->second.partitionName.c_str())) { - if (!flashFile(bridgeManager, it->first, it->second.partitionName.c_str(), it->second.file)) + PartitionInfo *partitionInfo = &(it->second); + + if (!flashFile(bridgeManager, partitionInfo->partitionType, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file)) return (false); } } // Flash boot partitions last. - for (map::iterator it = partitionFileMap.begin(); it != partitionFileMap.end(); it++) + for (map::iterator it = partitionInfoMap.begin(); it != partitionInfoMap.end(); it++) { if (isKnownBootPartition(it->second.partitionName.c_str())) { - if (!flashFile(bridgeManager, it->first, it->second.partitionName.c_str(), it->second.file)) + PartitionInfo *partitionInfo = &(it->second); + + if (!flashFile(bridgeManager, partitionInfo->partitionType, it->first, partitionInfo->partitionName.c_str(), partitionInfo->file)) return (false); } } -- cgit v1.1