2025-05-10 21:49:39 +08:00

322 lines
8.6 KiB
C++
Raw Permalink Blame History

#include "RKBoot.h"
extern UINT CRC_32(PBYTE pData, UINT ulSize, UINT uiPreviousValue = 0);
bool CRKBoot::GetRc4DisableFlag()
{
return m_bRc4Disable;
}
bool CRKBoot::GetSignFlag()
{
return m_bSignFlag;
}
DWORD CRKBoot::GetVersion()
{
return m_version;
}
DWORD CRKBoot::GetMergeVersion()
{
return m_mergeVersion;
}
STRUCT_RKTIME CRKBoot::GetReleaseTime()
{
return m_releaseTime;
}
ENUM_RKDEVICE_TYPE CRKBoot::GetSupportDevice()
{
return m_supportDevice;
}
UCHAR CRKBoot::GetEntry471Count()
{
return m_471Count;
}
UCHAR CRKBoot::GetEntry472Count()
{
return m_472Count;
}
UCHAR CRKBoot::GetEntryLoaderCount()
{
return m_loaderCount;
}
bool CRKBoot::CrcCheck()
{
UINT *pOldCrc, ulNewCrc;
pOldCrc = (UINT *)(m_BootData + (m_BootSize - 4));
ulNewCrc = CRC_32(m_BootData, m_BootSize - 4);
return (*pOldCrc == ulNewCrc) ? true : false;
}
bool CRKBoot::SaveEntryFile(ENUM_RKBOOTENTRY type, UCHAR ucIndex, tstring fileName)
{
DWORD dwOffset;
UCHAR ucCount, ucSize;
switch (type)
{
case ENTRY471:
dwOffset = m_471Offset;
ucCount = m_471Count;
ucSize = m_471Size;
break;
case ENTRY472:
dwOffset = m_472Offset;
ucCount = m_472Count;
ucSize = m_472Size;
break;
case ENTRYLOADER:
dwOffset = m_loaderOffset;
ucCount = m_loaderCount;
ucSize = m_loaderSize;
break;
default:
return false;
}
if (ucIndex >= ucCount)
{
return false;
}
PSTRUCT_RKBOOT_ENTRY pEntry;
pEntry = (PSTRUCT_RKBOOT_ENTRY)(m_BootData + dwOffset + (ucSize * ucIndex));
FILE *file = NULL;
file = fopen(fileName.c_str(), _T("wb+"));
if (!file)
{
return false;
}
fwrite(m_BootData + pEntry->dwDataOffset, 1, pEntry->dwDataSize, file);
fclose(file);
return true;
}
bool CRKBoot::GetEntryProperty(ENUM_RKBOOTENTRY type, UCHAR ucIndex, DWORD &dwSize, DWORD &dwDelay, tchar *pName)
{
DWORD dwOffset;
UCHAR ucCount, ucSize;
switch (type)
{
case ENTRY471:
dwOffset = m_471Offset;
ucCount = m_471Count;
ucSize = m_471Size;
break;
case ENTRY472:
dwOffset = m_472Offset;
ucCount = m_472Count;
ucSize = m_472Size;
break;
case ENTRYLOADER:
dwOffset = m_loaderOffset;
ucCount = m_loaderCount;
ucSize = m_loaderSize;//Loader<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ѿ<EFBFBD>512<31><32><EFBFBD><EFBFBD>
break;
default:
return false;
}
if (ucIndex >= ucCount)
{
return false;
}
PSTRUCT_RKBOOT_ENTRY pEntry;
pEntry = (PSTRUCT_RKBOOT_ENTRY)(m_BootData + dwOffset + (ucSize * ucIndex));
dwDelay = pEntry->dwDataDelay;
dwSize = pEntry->dwDataSize;
if (pName)
{
WCHAR_To_char(pEntry->szName, pName, 20);
}
return true;
}
bool CRKBoot::GetEntryData(ENUM_RKBOOTENTRY type, UCHAR ucIndex, PBYTE lpData)
{
DWORD dwOffset;
UCHAR ucCount, ucSize;
switch (type)
{
case ENTRY471:
dwOffset = m_471Offset;
ucCount = m_471Count;
ucSize = m_471Size;
break;
case ENTRY472:
dwOffset = m_472Offset;
ucCount = m_472Count;
ucSize = m_472Size;
break;
case ENTRYLOADER:
dwOffset = m_loaderOffset;
ucCount = m_loaderCount;
ucSize = m_loaderSize;
break;
default:
return false;
}
if (ucIndex >= ucCount)
{
return false;
}
PSTRUCT_RKBOOT_ENTRY pEntry;
pEntry = (PSTRUCT_RKBOOT_ENTRY)(m_BootData + dwOffset + (ucSize * ucIndex));
memcpy(lpData, m_BootData + pEntry->dwDataOffset, pEntry->dwDataSize);
return true;
}
CHAR CRKBoot::GetIndexByName(ENUM_RKBOOTENTRY type, tchar *pName)
{
DWORD dwOffset;
UCHAR ucCount, ucSize;
switch (type)
{
case ENTRY471:
dwOffset = m_471Offset;
ucCount = m_471Count;
ucSize = m_471Size;
break;
case ENTRY472:
dwOffset = m_472Offset;
ucCount = m_472Count;
ucSize = m_472Size;
break;
case ENTRYLOADER:
dwOffset = m_loaderOffset;
ucCount = m_loaderCount;
ucSize = m_loaderSize;
break;
default:
return -1;
}
for (UCHAR i = 0; i < ucCount; i++)
{
PSTRUCT_RKBOOT_ENTRY pEntry;
pEntry = (PSTRUCT_RKBOOT_ENTRY)(m_BootData + dwOffset + (ucSize * i));
char szName[20];
WCHAR_To_char(pEntry->szName, szName, 20);
if (_tcsicmp(pName, szName) == 0)
{
return i;
}
}
return -1;
}
bool CRKBoot::IsNewIDBFlag()
{
return m_NewIDBFlag;
}
CRKBoot::~CRKBoot()
{
if (m_BootData != NULL)
{
delete []m_BootData;
}
}
CRKBoot::CRKBoot(PBYTE lpBootData, DWORD dwBootSize, bool &bCheck)
{
Rc4DisableFlag.setContainer(this);
Rc4DisableFlag.getter(&CRKBoot::GetRc4DisableFlag);
SignFlag.setContainer(this);
SignFlag.getter(&CRKBoot::GetSignFlag);
Version.setContainer(this);
Version.getter(&CRKBoot::GetVersion);
MergeVersion.setContainer(this);
MergeVersion.getter(&CRKBoot::GetMergeVersion);
ReleaseTime.setContainer(this);
ReleaseTime.getter(&CRKBoot::GetReleaseTime);
SupportDevice.setContainer(this);
SupportDevice.getter(&CRKBoot::GetSupportDevice);
Entry471Count.setContainer(this);
Entry471Count.getter(&CRKBoot::GetEntry471Count);
Entry472Count.setContainer(this);
Entry472Count.getter(&CRKBoot::GetEntry472Count);
EntryLoaderCount.setContainer(this);
EntryLoaderCount.getter(&CRKBoot::GetEntryLoaderCount);
bCheck = true;
if (lpBootData != NULL)
{
m_BootData = lpBootData;
m_BootSize = dwBootSize;
bCheck = CrcCheck();
if (!bCheck)
{
printf("CRKBoot : CrcCheck happen error\n");
return;
}
PSTRUCT_RKBOOT_HEAD pBootHead;
pBootHead = (PSTRUCT_RKBOOT_HEAD)(m_BootData);
if (pBootHead->uiTag != 0x544F4F42 && (pBootHead->uiTag != 0x2052444C)) //add suppoty rk356x new loader
{
bCheck = false;
printf("CRKBoot : pBootHead->uiTag!=0x544F4F42 or 0x2052444C\n");
return;
}
if (0x2052444C == pBootHead->uiTag)
{
m_NewIDBFlag = true;
printf("RKBoot:this is new IDB flag\n");
}
else
{
m_NewIDBFlag = false;
}
if (pBootHead->ucRc4Flag)
{
m_bRc4Disable = true;
}
else
{
m_bRc4Disable = false;
}
if (pBootHead->ucSignFlag == 'S')
{
m_bSignFlag = true;
}
else
{
m_bSignFlag = false;
}
m_version = pBootHead->dwVersion;
m_mergeVersion = pBootHead->dwMergeVersion;
m_BootHeadSize = pBootHead->usSize;
m_releaseTime.usYear = pBootHead->stReleaseTime.usYear;
m_releaseTime.ucMonth = pBootHead->stReleaseTime.ucMonth;
m_releaseTime.ucDay = pBootHead->stReleaseTime.ucDay;
m_releaseTime.ucHour = pBootHead->stReleaseTime.ucHour;
m_releaseTime.ucMinute = pBootHead->stReleaseTime.ucMinute;
m_releaseTime.ucSecond = pBootHead->stReleaseTime.ucSecond;
m_supportDevice = pBootHead->emSupportChip;
m_471Offset = pBootHead->dw471EntryOffset;
m_471Count = pBootHead->uc471EntryCount;
m_471Size = pBootHead->uc471EntrySize;
m_472Offset = pBootHead->dw472EntryOffset;
m_472Count = pBootHead->uc472EntryCount;
m_472Size = pBootHead->uc472EntrySize;
m_loaderOffset = pBootHead->dwLoaderEntryOffset;
m_loaderCount = pBootHead->ucLoaderEntryCount;
m_loaderSize = pBootHead->ucLoaderEntrySize;
memcpy(m_crc, m_BootData + (m_BootSize - 4), 4);
}
else
{
bCheck = false;
printf("CRKBoot : lpBootData = null\n");
m_BootData = NULL;
}
}
void CRKBoot::WCHAR_To_char(WCHAR *src, char *dst, int len)
{
int i;
memset(dst, 0, len * sizeof(char));
for (i = 0; i < len; i++)
{
memcpy(dst, src, 1);
src++;
dst++;
}
}