276 lines
9.5 KiB
C++
276 lines
9.5 KiB
C++
#ifndef RKANDROIDDEVICE_HEADER
|
||
#define RKANDROIDDEVICE_HEADER
|
||
#include "RKDevice.h"
|
||
#include "gpt.h"
|
||
#pragma pack(1)
|
||
typedef struct
|
||
{
|
||
DWORD dwTag;
|
||
BYTE reserved[4];
|
||
UINT uiRc4Flag;
|
||
USHORT usBootCode1Offset;
|
||
USHORT usBootCode2Offset;
|
||
BYTE reserved1[490];
|
||
USHORT usBootDataSize;
|
||
USHORT usBootCodeSize;
|
||
USHORT usCrc;
|
||
} RKANDROID_IDB_SEC0, *PRKANDROID_IDB_SEC0;
|
||
|
||
typedef struct
|
||
{
|
||
USHORT usSysReservedBlock;
|
||
USHORT usDisk0Size;
|
||
USHORT usDisk1Size;
|
||
USHORT usDisk2Size;
|
||
USHORT usDisk3Size;
|
||
UINT uiChipTag;
|
||
UINT uiMachineId;
|
||
USHORT usLoaderYear;
|
||
USHORT usLoaderDate;
|
||
USHORT usLoaderVer;
|
||
USHORT usLastLoaderVer;
|
||
USHORT usReadWriteTimes;
|
||
DWORD dwFwVer;
|
||
USHORT usMachineInfoLen;
|
||
UCHAR ucMachineInfo[30];
|
||
USHORT usManufactoryInfoLen;
|
||
UCHAR ucManufactoryInfo[30];
|
||
USHORT usFlashInfoOffset;
|
||
USHORT usFlashInfoLen;
|
||
UCHAR reserved[384];
|
||
UINT uiFlashSize;//ÒÔsectorΪµ¥Î»
|
||
BYTE reserved1;
|
||
BYTE bAccessTime;
|
||
USHORT usBlockSize;
|
||
BYTE bPageSize;
|
||
BYTE bECCBits;
|
||
BYTE reserved2[8];
|
||
USHORT usIdBlock0;
|
||
USHORT usIdBlock1;
|
||
USHORT usIdBlock2;
|
||
USHORT usIdBlock3;
|
||
USHORT usIdBlock4;
|
||
} RKANDROID_IDB_SEC1, *PRKANDROID_IDB_SEC1;
|
||
|
||
typedef struct
|
||
{
|
||
USHORT usInfoSize;
|
||
BYTE bChipInfo[CHIPINFO_LEN];
|
||
BYTE reserved[RKANDROID_SEC2_RESERVED_LEN];
|
||
char szVcTag[3];
|
||
USHORT usSec0Crc;
|
||
USHORT usSec1Crc;
|
||
UINT uiBootCodeCrc;
|
||
USHORT usSec3CustomDataOffset;
|
||
USHORT usSec3CustomDataSize;
|
||
char szCrcTag[4];
|
||
USHORT usSec3Crc;
|
||
} RKANDROID_IDB_SEC2, *PRKANDROID_IDB_SEC2;
|
||
|
||
typedef struct
|
||
{
|
||
USHORT usSNSize;
|
||
BYTE sn[RKDEVICE_SN_LEN];
|
||
BYTE reserved[RKANDROID_SEC3_RESERVED_LEN];
|
||
BYTE imeiSize;
|
||
BYTE imei[RKDEVICE_IMEI_LEN];
|
||
BYTE uidSize;
|
||
BYTE uid[RKDEVICE_UID_LEN];
|
||
BYTE blueToothSize;
|
||
BYTE blueToothAddr[RKDEVICE_BT_LEN];
|
||
BYTE macSize;
|
||
BYTE macAddr[RKDEVICE_MAC_LEN];
|
||
} RKANDROID_IDB_SEC3, *PRKANDROID_IDB_SEC3;
|
||
typedef struct
|
||
{
|
||
DWORD dwTag;
|
||
USHORT usSnSize;
|
||
BYTE btSnData[RKDEVICE_SN_LEN];
|
||
BYTE btReserve[RKANDROID_SEC3_RESERVED_LEN - 6];
|
||
BYTE btImeiSize;
|
||
BYTE btImeiData[RKDEVICE_IMEI_LEN];
|
||
BYTE btUidSize;
|
||
BYTE btUidData[RKDEVICE_UID_LEN];
|
||
BYTE btBlueToothSize;
|
||
BYTE btBlueToothData[RKDEVICE_BT_LEN];
|
||
BYTE btMacSize;
|
||
BYTE btMacData[RKDEVICE_MAC_LEN];
|
||
USHORT usCrc;
|
||
BYTE btSpare[SPARE_SIZE];
|
||
} STRUCT_RKANDROID_WBBUFFER, *PSTRUCT_RKANDROID_WBBUFFER;
|
||
const BYTE Wipe_Data[] = {0x72, 0x65, 0x63, 0x6F, 0x76, 0x65,
|
||
0x72, 0x79, 0x0A, 0x2D, 0x2D, 0x77,
|
||
0x69, 0x70, 0x65, 0x5F, 0x64, 0x61, 0x74, 0x61, 0x00
|
||
};
|
||
const BYTE Wipe_All[] = {0x72, 0x65, 0x63, 0x6F, 0x76, 0x65,
|
||
0x72, 0x79, 0x0A, 0x2D, 0x2D, 0x77,
|
||
0x69, 0x70, 0x65, 0x5F, 0x61, 0x6C, 0x6C, 0x00
|
||
};
|
||
|
||
#define LBA_TRANSFER_SIZE_16K (16*1024)
|
||
#define LBA_TRANSFER_SIZE_1M (1024*1024)
|
||
#define LBA_LOOP_SIZE (1024*1024)
|
||
|
||
#define MAX_PACKAGE_FILES 16
|
||
#define RKIMAGE_TAG 0x46414B52
|
||
#define PARTNAME_PACKAGE_FILE "package-file"
|
||
#define PARTNAME_BOOTLOADER "bootloader"
|
||
#define PARTNAME_PARAMETER "parameter"
|
||
#define PARTNAME_KERNEL "kernel"
|
||
#define PARTNAME_BOOT "boot"
|
||
#define PARTNAME_RECOVERY "recovery"
|
||
#define PARTNAME_UBOOT "uboot"
|
||
#define PARTNAME_SYSTEM "system"
|
||
#define PARTNAME_ROOTFS "rootfs"
|
||
#define PARTNAME_MISC "misc"
|
||
#define PARTNAME_BACKUP "backup"
|
||
#define PARTNAME_OEM "oem"
|
||
#define PARTNAME_USERDATA "userdata"
|
||
#define PARTNAME_USER "user"
|
||
|
||
#define INCLUDE_LOADER "bootloader"
|
||
|
||
#define MAX_MANUFACTURER 60
|
||
#define MAX_MACHINE_INFO 30
|
||
#define MAX_MACHINE_MODEL 34
|
||
#define RELATIVE_PATH 60
|
||
#define PART_NAME 32
|
||
|
||
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
|
||
typedef struct
|
||
{
|
||
char name[PART_NAME];// ·ÖÇøÃû³Æ
|
||
char file[RELATIVE_PATH];// Ïà¶Ô·¾¶Ãû£¬ÌáÈ¡ÎļþʱÓõ½
|
||
unsigned int part_size;//·ÖÇøÕ¼ÓÃÉÈÇøÊý
|
||
unsigned int offset;// ÎļþÔÚImageÖÐµÄÆ«ÒÆ
|
||
unsigned int flash_offset;// ÉÕдµ½FlashÖеÄλÖÃ(ÒÔsectorΪµ¥Î»)
|
||
unsigned int usespace;// ÎļþÕ¼Óÿռ䣨°´PAGE¶ÔÆë)
|
||
unsigned int size;// ×Ö½ÚÊý£¬Êµ¼ÊÎļþ´óС
|
||
} STRUCT_RKIMAGE_ITEM, *PSTRUCT_RKIMAGE_ITEM;
|
||
|
||
typedef struct tagRKIMAGE_HDR
|
||
{
|
||
unsigned int tag;
|
||
unsigned int size;// Îļþ´óС£¬²»º¬Ä©Î²µÄCRCУÑéÂë
|
||
char machine_model[MAX_MACHINE_MODEL];
|
||
char machine_info[MAX_MACHINE_INFO];
|
||
char manufacturer[MAX_MANUFACTURER];
|
||
unsigned int dwFWVer;
|
||
int item_count;
|
||
STRUCT_RKIMAGE_ITEM item[MAX_PACKAGE_FILES];
|
||
} STRUCT_RKIMAGE_HDR, *PSTRUCT_RKIMAGE_HDR;
|
||
typedef struct
|
||
{
|
||
UINT uiTag;
|
||
UINT uiVer;
|
||
UINT uiFlag;
|
||
UINT uiHeadSize;
|
||
UINT uiReserved[3];
|
||
USHORT usHashBit;
|
||
USHORT usRsaBit;
|
||
BYTE nFactor[256];
|
||
BYTE eFactor[256];
|
||
BYTE cFactor[256];
|
||
BYTE dataHash[32];
|
||
UINT dataLoadAddr;
|
||
BYTE codeHash[32];
|
||
UINT codeLoadAddr;
|
||
BYTE headSignValue[256];
|
||
} RK_SECURE_HEADER, *PRK_SECURE_HEADER;
|
||
|
||
typedef struct _RK_UPDATE_ORDER
|
||
{
|
||
UINT uiOrder;
|
||
char partName[32];
|
||
STRUCT_RKIMAGE_ITEM stItem;
|
||
long long ulItemSize;
|
||
} RK_UPDATE_ORDER;
|
||
|
||
#pragma pack()
|
||
|
||
class CRKAndroidDevice : public CRKDevice
|
||
{
|
||
public:
|
||
static bool bGptFlag;
|
||
virtual int PrepareIDB();
|
||
virtual int DownloadIDBlock();
|
||
virtual int DownloadImage();
|
||
virtual int EraseIDB();
|
||
virtual int EraseAllBlocks();
|
||
virtual bool BufferWriteBack();
|
||
CRKAndroidDevice(STRUCT_RKDEVICE_DESC &device);
|
||
virtual ~CRKAndroidDevice();
|
||
int UpgradePartition();
|
||
bool GetPublicKey(unsigned char *pKey, unsigned int &nKeySize);
|
||
bool IsExistBootloaderInFw();
|
||
bool IsExistPartitionInFw(const char *partName, UINT &offset, UINT &size);
|
||
UpgradeCallbackFunc m_pCallback;
|
||
UpgradeProgressCallbackFunc m_pProcessCallback;
|
||
protected:
|
||
private:
|
||
DWORD m_dwLoaderSize;
|
||
DWORD m_dwLoaderDataSize;
|
||
DWORD m_dwLoaderHeadSize;
|
||
DWORD m_dwBackupOffset;
|
||
char m_oldIDBCounts;
|
||
USHORT m_usFlashDataSec;
|
||
USHORT m_usFlashBootSec;
|
||
USHORT m_usFlashHeadSec;
|
||
BYTE *m_paramBuffer;
|
||
BYTE *m_gptBuffer;
|
||
UINT m_uiParamFileSize;
|
||
UINT m_uiResevedBlockSize;
|
||
RKANDROID_IDB_SEC0 *m_oldSec0;
|
||
RKANDROID_IDB_SEC1 *m_oldSec1;
|
||
RKANDROID_IDB_SEC2 *m_oldSec2;
|
||
RKANDROID_IDB_SEC3 *m_oldSec3;
|
||
UINT m_uiLBATimes;
|
||
UINT m_uiUserSectors;
|
||
|
||
bool GetLoaderSize();
|
||
bool GetLoaderDataSize();
|
||
bool GetLoaderHeadSize();
|
||
bool GetOldSectorData();
|
||
bool CalcIDBCount();
|
||
bool IsExistSector3Crc(PRKANDROID_IDB_SEC2 pSec);
|
||
|
||
virtual bool FindBackupBuffer();
|
||
virtual CHAR FindIDBlock(char pos, char &IDBlockPos);
|
||
virtual char FindAllIDB();
|
||
virtual bool ReserveIDBlock(char iBlockIndex = 0, char iIdblockPos = 0);
|
||
virtual bool OffsetIDBlock(char pos);
|
||
virtual bool MakeSector0(PBYTE pSector);
|
||
virtual void MakeSector1(PBYTE pSector);
|
||
virtual bool MakeSector2(PBYTE pSector);
|
||
virtual bool MakeSector3(PBYTE pSector);
|
||
virtual int MakeIDBlockData(PBYTE lpIDBlock);
|
||
virtual int MakeNewIDBlockData(PBYTE lpIDBlock);
|
||
virtual bool MakeSpareData(PBYTE lpIDBlock, DWORD dwSectorNum, PBYTE lpSpareBuffer);
|
||
virtual int WriteIDBlock(PBYTE lpIDBlock, DWORD dwSectorNum, bool bErase);
|
||
bool RKA_Param_Download(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
||
bool RKA_Param_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
||
bool RKA_File_Download(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
||
bool RKA_File_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
||
bool RKA_Gpt_Download(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
||
bool RKA_Gpt_Check(STRUCT_RKIMAGE_ITEM &entry, long long ¤tByte, long long totalByte);
|
||
|
||
bool GetParameterPartSize(STRUCT_RKIMAGE_ITEM ¶mItem);
|
||
bool ParsePartitionInfo(string &strPartInfo, string &strName, UINT &uiOffset, UINT &uiLen);
|
||
bool MakeParamFileBuffer(STRUCT_RKIMAGE_ITEM &entry);
|
||
bool CheckParamPartSize(STRUCT_RKIMAGE_HDR &rkImageHead, int iParamPos);
|
||
bool write_partition_upgrade_flag(DWORD dwOffset, BYTE *pMd5, UINT uiFlag);
|
||
bool read_partition_upgrade_flag(DWORD dwOffset, BYTE *pMd5, UINT *uiFlag);
|
||
bool GetParameterGptFlag(STRUCT_RKIMAGE_ITEM ¶mItem);
|
||
};
|
||
void create_gpt_buffer(u8 *gpt, PARAM_ITEM_VECTOR &vecParts, CONFIG_ITEM_VECTOR &vecUuid, u64 diskSectors);
|
||
void prepare_gpt_backup(u8 *master, u8 *backup);
|
||
void gen_rand_uuid(unsigned char *uuid_bin);
|
||
unsigned int crc32_le(unsigned int crc, unsigned char *p, unsigned int len);
|
||
bool parse_parameter(char *pParameter, PARAM_ITEM_VECTOR &vecItem);
|
||
bool get_uuid_from_parameter(char *pParameter, CONFIG_ITEM_VECTOR &vecItem);
|
||
bool ParsePartitionInfo(string &strPartInfo, string &strName, UINT &uiOffset, UINT &uiLen);
|
||
bool ParseUuidInfo(string &strUuidInfo, string &strName, string &strUUid);
|
||
void string_to_uuid(string strUUid, char *uuid);
|
||
int find_uuid_item(CONFIG_ITEM_VECTOR &vecItems, char *pszName);
|
||
#endif
|