xref: /OK3568_Linux_fs/external/rkupdate/RKImage.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include "RKImage.h"
2*4882a593Smuzhiyun #include "MD5Checksum.h"
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun extern int IsRK3308_Platform();
5*4882a593Smuzhiyun extern int Compatible_rk3308bs_loader();
6*4882a593Smuzhiyun 
GetVersion()7*4882a593Smuzhiyun DWORD CRKImage::GetVersion()
8*4882a593Smuzhiyun {
9*4882a593Smuzhiyun     return m_version;
10*4882a593Smuzhiyun }
GetMergeVersion()11*4882a593Smuzhiyun DWORD CRKImage::GetMergeVersion()
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun     return m_mergeVersion;
14*4882a593Smuzhiyun }
GetReleaseTime()15*4882a593Smuzhiyun STRUCT_RKTIME CRKImage::GetReleaseTime()
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun     return m_releaseTime;
18*4882a593Smuzhiyun }
GetSupportDevice()19*4882a593Smuzhiyun ENUM_RKDEVICE_TYPE CRKImage::GetSupportDevice()
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun     return m_supportDevice;
22*4882a593Smuzhiyun }
GetOsType()23*4882a593Smuzhiyun ENUM_OS_TYPE CRKImage::GetOsType()
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun     UINT *pOsType;
26*4882a593Smuzhiyun     pOsType = (UINT *)&m_reserved[4];
27*4882a593Smuzhiyun     return (ENUM_OS_TYPE) * pOsType;
28*4882a593Smuzhiyun }
GetBackupSize()29*4882a593Smuzhiyun USHORT CRKImage::GetBackupSize()
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun     USHORT *pBackupSize;
32*4882a593Smuzhiyun     pBackupSize = (USHORT *)&m_reserved[12];
33*4882a593Smuzhiyun     return *pBackupSize;
34*4882a593Smuzhiyun }
GetBootOffset()35*4882a593Smuzhiyun DWORD CRKImage::GetBootOffset()
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun     return m_bootOffset;
38*4882a593Smuzhiyun }
GetBootSize()39*4882a593Smuzhiyun DWORD CRKImage::GetBootSize()
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun     return m_bootSize;
42*4882a593Smuzhiyun }
GetFWOffset()43*4882a593Smuzhiyun DWORD CRKImage::GetFWOffset()
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun     return m_fwOffset;
46*4882a593Smuzhiyun }
GetFWSize()47*4882a593Smuzhiyun long long CRKImage::GetFWSize()
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun     return m_fwSize;
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun 
GetFWFileHandle()52*4882a593Smuzhiyun FILE *CRKImage::GetFWFileHandle()
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun     return m_pFile;
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun 
GetFwPath()57*4882a593Smuzhiyun char *CRKImage::GetFwPath()
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun     return m_imgPath;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
Md5Check(long long nCheckSize)62*4882a593Smuzhiyun bool CRKImage::Md5Check(long long nCheckSize)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun     printf("In Md5Check\n");
65*4882a593Smuzhiyun     tstring strNewMd5 = _T("");
66*4882a593Smuzhiyun     strNewMd5 = CMD5Checksum::GetMD5(m_pFile, nCheckSize);
67*4882a593Smuzhiyun     if (strNewMd5.size() == 32)
68*4882a593Smuzhiyun     {
69*4882a593Smuzhiyun         BYTE newMd5[32];
70*4882a593Smuzhiyun         memcpy(newMd5, strNewMd5.c_str(), 32);
71*4882a593Smuzhiyun         int i, j;
72*4882a593Smuzhiyun         printf("New Md5:\n");
73*4882a593Smuzhiyun         for (i = 0; i < 2; i++)
74*4882a593Smuzhiyun         {
75*4882a593Smuzhiyun             for (j = 0; j < 16; j++)
76*4882a593Smuzhiyun             {
77*4882a593Smuzhiyun                 printf("%02X ", newMd5[i * 16 + j]);
78*4882a593Smuzhiyun             }
79*4882a593Smuzhiyun             printf("\r\n");
80*4882a593Smuzhiyun         }
81*4882a593Smuzhiyun         printf("Old Md5:\n");
82*4882a593Smuzhiyun         for (i = 0; i < 2; i++)
83*4882a593Smuzhiyun         {
84*4882a593Smuzhiyun             for (j = 0; j < 16; j++)
85*4882a593Smuzhiyun             {
86*4882a593Smuzhiyun                 printf("%02X ", m_md5[i * 16 + j]);
87*4882a593Smuzhiyun             }
88*4882a593Smuzhiyun             printf("\r\n");
89*4882a593Smuzhiyun         }
90*4882a593Smuzhiyun         if (memcmp(newMd5, m_md5, 32) != 0)
91*4882a593Smuzhiyun         {
92*4882a593Smuzhiyun             return false;
93*4882a593Smuzhiyun         }
94*4882a593Smuzhiyun         else
95*4882a593Smuzhiyun         {
96*4882a593Smuzhiyun             return true;
97*4882a593Smuzhiyun         }
98*4882a593Smuzhiyun     }
99*4882a593Smuzhiyun     else
100*4882a593Smuzhiyun     {
101*4882a593Smuzhiyun         return false;
102*4882a593Smuzhiyun     }
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
SaveBootFile(tstring filename)105*4882a593Smuzhiyun bool CRKImage::SaveBootFile(tstring filename)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun     FILE *file = NULL;
108*4882a593Smuzhiyun     file = fopen(filename.c_str(), _T("wb+"));
109*4882a593Smuzhiyun     if (!file)
110*4882a593Smuzhiyun     {
111*4882a593Smuzhiyun         return false;
112*4882a593Smuzhiyun     }
113*4882a593Smuzhiyun     BYTE buffer[1024];
114*4882a593Smuzhiyun     DWORD dwBufferSize = 1024;
115*4882a593Smuzhiyun     DWORD dwBootSize = m_bootSize;
116*4882a593Smuzhiyun     DWORD dwReadSize;
117*4882a593Smuzhiyun     fseek(m_pFile, m_bootOffset, SEEK_SET);
118*4882a593Smuzhiyun     do
119*4882a593Smuzhiyun     {
120*4882a593Smuzhiyun         dwReadSize = (dwBootSize >= 1024) ? dwBufferSize : dwBootSize;
121*4882a593Smuzhiyun         size_t ret = fread(buffer, 1, dwReadSize, m_pFile);
122*4882a593Smuzhiyun         if (ret != dwReadSize)
123*4882a593Smuzhiyun         {
124*4882a593Smuzhiyun             printf("fread error: read:%d, req read:%d", ret, dwReadSize);
125*4882a593Smuzhiyun         }
126*4882a593Smuzhiyun         fwrite(buffer, 1, dwReadSize, file);
127*4882a593Smuzhiyun         dwBootSize -= dwReadSize;
128*4882a593Smuzhiyun     } while (dwBootSize > 0);
129*4882a593Smuzhiyun     fclose(file);
130*4882a593Smuzhiyun     return true;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun 
SaveFWFile(tstring filename)133*4882a593Smuzhiyun bool CRKImage::SaveFWFile(tstring filename)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun     FILE *file = NULL;
136*4882a593Smuzhiyun     file = fopen(filename.c_str(), _T("wb+"));
137*4882a593Smuzhiyun     if (!file)
138*4882a593Smuzhiyun     {
139*4882a593Smuzhiyun         return false;
140*4882a593Smuzhiyun     }
141*4882a593Smuzhiyun     BYTE buffer[1024];
142*4882a593Smuzhiyun     DWORD dwBufferSize = 1024;
143*4882a593Smuzhiyun     long long dwFWSize = m_fwSize;
144*4882a593Smuzhiyun     DWORD dwReadSize;
145*4882a593Smuzhiyun     fseeko(m_pFile, m_fwOffset, SEEK_SET);
146*4882a593Smuzhiyun     do
147*4882a593Smuzhiyun     {
148*4882a593Smuzhiyun         dwReadSize = (dwFWSize >= 1024) ? dwBufferSize : dwFWSize;
149*4882a593Smuzhiyun         size_t ret = fread(buffer, 1, dwReadSize, m_pFile);
150*4882a593Smuzhiyun         if (ret != dwReadSize)
151*4882a593Smuzhiyun         {
152*4882a593Smuzhiyun             printf("fread error: read:%d, req read:%d", ret, dwReadSize);
153*4882a593Smuzhiyun         }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun         fwrite(buffer, 1, dwReadSize, file);
156*4882a593Smuzhiyun         dwFWSize -= dwReadSize;
157*4882a593Smuzhiyun     } while (dwFWSize > 0);
158*4882a593Smuzhiyun     fclose(file);
159*4882a593Smuzhiyun     return true;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
GetData(long long dwOffset,DWORD dwSize,PBYTE lpBuffer)162*4882a593Smuzhiyun bool CRKImage::GetData(long long dwOffset, DWORD dwSize, PBYTE lpBuffer)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun     if (dwOffset < 0 || dwSize == 0)
165*4882a593Smuzhiyun     {
166*4882a593Smuzhiyun         return false;
167*4882a593Smuzhiyun     }
168*4882a593Smuzhiyun     if (dwOffset + dwSize > m_fileSize)
169*4882a593Smuzhiyun     {
170*4882a593Smuzhiyun         return false;
171*4882a593Smuzhiyun     }
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun     fseeko64(m_pFile, dwOffset, SEEK_SET);
174*4882a593Smuzhiyun     UINT uiActualRead;
175*4882a593Smuzhiyun     uiActualRead = fread(lpBuffer, 1, dwSize, m_pFile);
176*4882a593Smuzhiyun     if (dwSize != uiActualRead)
177*4882a593Smuzhiyun     {
178*4882a593Smuzhiyun         return false;
179*4882a593Smuzhiyun     }
180*4882a593Smuzhiyun     return true;
181*4882a593Smuzhiyun }
GetReservedData(PBYTE & lpData,USHORT & usSize)182*4882a593Smuzhiyun void CRKImage::GetReservedData(PBYTE &lpData, USHORT &usSize)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun     lpData = m_reserved;
185*4882a593Smuzhiyun     usSize = IMAGE_RESERVED_SIZE;
186*4882a593Smuzhiyun }
GetMd5Data(PBYTE & lpMd5,PBYTE & lpSignMd5)187*4882a593Smuzhiyun int CRKImage::GetMd5Data(PBYTE &lpMd5, PBYTE &lpSignMd5)
188*4882a593Smuzhiyun {
189*4882a593Smuzhiyun     lpMd5 = m_md5;
190*4882a593Smuzhiyun     lpSignMd5 = m_signMd5;
191*4882a593Smuzhiyun     return m_signMd5Size;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun 
CRKImage(tstring filename,bool & bCheck)194*4882a593Smuzhiyun CRKImage::CRKImage(tstring filename, bool &bCheck)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun     Version.setContainer(this);
197*4882a593Smuzhiyun     Version.getter(&CRKImage::GetVersion);
198*4882a593Smuzhiyun     MergeVersion.setContainer(this);
199*4882a593Smuzhiyun     MergeVersion.getter(&CRKImage::GetMergeVersion);
200*4882a593Smuzhiyun     ReleaseTime.setContainer(this);
201*4882a593Smuzhiyun     ReleaseTime.getter(&CRKImage::GetReleaseTime);
202*4882a593Smuzhiyun     SupportDevice.setContainer(this);
203*4882a593Smuzhiyun     SupportDevice.getter(&CRKImage::GetSupportDevice);
204*4882a593Smuzhiyun     OsType.setContainer(this);
205*4882a593Smuzhiyun     OsType.getter(&CRKImage::GetOsType);
206*4882a593Smuzhiyun     BackupSize.setContainer(this);
207*4882a593Smuzhiyun     BackupSize.getter(&CRKImage::GetBackupSize);
208*4882a593Smuzhiyun     BootOffset.setContainer(this);
209*4882a593Smuzhiyun     BootOffset.getter(&CRKImage::GetBootOffset);
210*4882a593Smuzhiyun     BootSize.setContainer(this);
211*4882a593Smuzhiyun     BootSize.getter(&CRKImage::GetBootSize);
212*4882a593Smuzhiyun     FWOffset.setContainer(this);
213*4882a593Smuzhiyun     FWOffset.getter(&CRKImage::GetFWOffset);
214*4882a593Smuzhiyun     FWSize.setContainer(this);
215*4882a593Smuzhiyun     FWSize.getter(&CRKImage::GetFWSize);
216*4882a593Smuzhiyun     FwPath.setContainer(this);
217*4882a593Smuzhiyun     FwPath.getter(&CRKImage::GetFwPath);
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun     bool bDoMdb5Check = bCheck;
220*4882a593Smuzhiyun     struct stat64 statBuf;
221*4882a593Smuzhiyun     m_bootObject = NULL;
222*4882a593Smuzhiyun     m_pFile = NULL;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun     m_signMd5Size = 0;
225*4882a593Smuzhiyun     memset(m_md5, 0, 32);
226*4882a593Smuzhiyun     memset(m_signMd5, 0, 256);
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun     tchar szName[256];
229*4882a593Smuzhiyun     _tcscpy(szName, filename.c_str());
230*4882a593Smuzhiyun     if (stat64(szName, &statBuf) < 0)
231*4882a593Smuzhiyun     {
232*4882a593Smuzhiyun         bCheck = false;
233*4882a593Smuzhiyun         printf("CRKImage : stat <%s> happen error.error_reason = %s\n", szName, strerror(errno));
234*4882a593Smuzhiyun         return;
235*4882a593Smuzhiyun     }
236*4882a593Smuzhiyun     if (S_ISDIR(statBuf.st_mode))
237*4882a593Smuzhiyun     {
238*4882a593Smuzhiyun         bCheck = false;
239*4882a593Smuzhiyun         printf("CRKImage : Error! stat mode is DIR\n");
240*4882a593Smuzhiyun         return;
241*4882a593Smuzhiyun     }
242*4882a593Smuzhiyun     m_fileSize = statBuf.st_size;
243*4882a593Smuzhiyun     memcpy(m_imgPath, szName, sizeof(szName));
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun     bool bOnlyBootFile = false;
246*4882a593Smuzhiyun     transform(filename.begin(), filename.end(), filename.begin(), (int(*)(int))tolower);
247*4882a593Smuzhiyun     if (filename.find(_T(".bin")) != tstring::npos)
248*4882a593Smuzhiyun     {
249*4882a593Smuzhiyun         bOnlyBootFile = true;
250*4882a593Smuzhiyun     }
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun     m_pFile = fopen(szName, "rb");
253*4882a593Smuzhiyun     if (!m_pFile)
254*4882a593Smuzhiyun     {
255*4882a593Smuzhiyun         bCheck = false;
256*4882a593Smuzhiyun         printf("CRKImage : fopen <%s> fail,will try use fopen64 \n", szName);
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun         m_pFile = fopen64(szName, "rb");
259*4882a593Smuzhiyun         if (!m_pFile)
260*4882a593Smuzhiyun         {
261*4882a593Smuzhiyun             bCheck = false;
262*4882a593Smuzhiyun             printf("CRKImage : fopen64 <%s> fail\n", szName);
263*4882a593Smuzhiyun             return;
264*4882a593Smuzhiyun         }
265*4882a593Smuzhiyun     }
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun     //code will be error if firmware is signed.md5 is not last 32 byte.
268*4882a593Smuzhiyun     //  fseeko(m_pFile,-32,SEEK_END);
269*4882a593Smuzhiyun     //  fread(m_md5,1,32,m_pFile);
270*4882a593Smuzhiyun     //  fseeko(m_pFile,0,SEEK_SET);
271*4882a593Smuzhiyun     //  if (!Md5Check())
272*4882a593Smuzhiyun     //  {
273*4882a593Smuzhiyun     //      bCheck = false;
274*4882a593Smuzhiyun     //      return;
275*4882a593Smuzhiyun     //  }
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun     int nMd5DataSize;
278*4882a593Smuzhiyun     long long ulFwSize;
279*4882a593Smuzhiyun     STRUCT_RKIMAGE_HEAD imageHead;
280*4882a593Smuzhiyun     if (!bOnlyBootFile)
281*4882a593Smuzhiyun     {
282*4882a593Smuzhiyun         fseeko64(m_pFile, 0, SEEK_SET);
283*4882a593Smuzhiyun         size_t ret = fread((PBYTE)(&imageHead), 1, sizeof(STRUCT_RKIMAGE_HEAD), m_pFile);
284*4882a593Smuzhiyun         if (ret != sizeof(STRUCT_RKIMAGE_HEAD))
285*4882a593Smuzhiyun         {
286*4882a593Smuzhiyun             return;
287*4882a593Smuzhiyun         }
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun         if (imageHead.uiTag != 0x57464B52)
290*4882a593Smuzhiyun         {
291*4882a593Smuzhiyun             bCheck = false;
292*4882a593Smuzhiyun             printf("CRKImage :Error! imageHead.uiTag != 0x57464B52\n");
293*4882a593Smuzhiyun             return;
294*4882a593Smuzhiyun         }
295*4882a593Smuzhiyun         if ((imageHead.reserved[14] == 'H') && (imageHead.reserved[15] == 'I'))
296*4882a593Smuzhiyun         {
297*4882a593Smuzhiyun             ulFwSize = *((DWORD *)(&imageHead.reserved[16]));
298*4882a593Smuzhiyun             ulFwSize <<= 32;
299*4882a593Smuzhiyun             ulFwSize += imageHead.dwFWOffset;
300*4882a593Smuzhiyun             ulFwSize += imageHead.dwFWSize;
301*4882a593Smuzhiyun         }
302*4882a593Smuzhiyun         else
303*4882a593Smuzhiyun         {
304*4882a593Smuzhiyun             ulFwSize = imageHead.dwFWOffset + imageHead.dwFWSize;
305*4882a593Smuzhiyun         }
306*4882a593Smuzhiyun         nMd5DataSize = GetImageSize() - ulFwSize;
307*4882a593Smuzhiyun         if (nMd5DataSize >= 160)
308*4882a593Smuzhiyun         {
309*4882a593Smuzhiyun             //sign image
310*4882a593Smuzhiyun             m_bSignFlag = true;
311*4882a593Smuzhiyun             m_signMd5Size = nMd5DataSize - 32;
312*4882a593Smuzhiyun             fseeko64(m_pFile, ulFwSize, SEEK_SET);
313*4882a593Smuzhiyun             size_t ret = fread(m_md5, 1, 32, m_pFile);
314*4882a593Smuzhiyun             if (ret != 32)
315*4882a593Smuzhiyun             {
316*4882a593Smuzhiyun                 printf("%s:read error\n", __func__);
317*4882a593Smuzhiyun             }
318*4882a593Smuzhiyun             ret = fread(m_signMd5, 1, nMd5DataSize - 32, m_pFile);
319*4882a593Smuzhiyun             if (ret != nMd5DataSize - 32)
320*4882a593Smuzhiyun             {
321*4882a593Smuzhiyun                 printf("%s :ret = %d\n", __func__, ret);
322*4882a593Smuzhiyun             }
323*4882a593Smuzhiyun         }
324*4882a593Smuzhiyun         else
325*4882a593Smuzhiyun         {
326*4882a593Smuzhiyun             fseeko64(m_pFile, -32, SEEK_END);
327*4882a593Smuzhiyun             size_t read = fread(m_md5, 1, 32, m_pFile);
328*4882a593Smuzhiyun             if (read != 32)
329*4882a593Smuzhiyun             {
330*4882a593Smuzhiyun                 printf("%s: read error\n", __func__);
331*4882a593Smuzhiyun             }
332*4882a593Smuzhiyun         }
333*4882a593Smuzhiyun         if (bDoMdb5Check)
334*4882a593Smuzhiyun         {
335*4882a593Smuzhiyun             if (!Md5Check(ulFwSize))
336*4882a593Smuzhiyun             {
337*4882a593Smuzhiyun                 printf("Md5Check update.img ulFwSize:%ld", ulFwSize);
338*4882a593Smuzhiyun                 //bCheck = false;
339*4882a593Smuzhiyun                 //return;
340*4882a593Smuzhiyun                 bCheck = true;
341*4882a593Smuzhiyun             }
342*4882a593Smuzhiyun         }
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun         m_version = imageHead.dwVersion;
345*4882a593Smuzhiyun         m_mergeVersion = imageHead.dwMergeVersion;
346*4882a593Smuzhiyun         m_releaseTime.usYear = imageHead.stReleaseTime.usYear;
347*4882a593Smuzhiyun         m_releaseTime.ucMonth = imageHead.stReleaseTime.ucMonth;
348*4882a593Smuzhiyun         m_releaseTime.ucDay = imageHead.stReleaseTime.ucDay;
349*4882a593Smuzhiyun         m_releaseTime.ucHour = imageHead.stReleaseTime.ucHour;
350*4882a593Smuzhiyun         m_releaseTime.ucMinute = imageHead.stReleaseTime.ucMinute;
351*4882a593Smuzhiyun         m_releaseTime.ucSecond = imageHead.stReleaseTime.ucSecond;
352*4882a593Smuzhiyun         m_supportDevice = imageHead.emSupportChip;
353*4882a593Smuzhiyun         m_bootOffset = imageHead.dwBootOffset;
354*4882a593Smuzhiyun         m_bootSize = imageHead.dwBootSize;
355*4882a593Smuzhiyun         m_fwOffset = imageHead.dwFWOffset;
356*4882a593Smuzhiyun         m_fwSize = ulFwSize - m_fwOffset;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun         memcpy(m_reserved, imageHead.reserved, IMAGE_RESERVED_SIZE);
359*4882a593Smuzhiyun     }
360*4882a593Smuzhiyun     else
361*4882a593Smuzhiyun     {
362*4882a593Smuzhiyun         m_bootOffset = 0;
363*4882a593Smuzhiyun         m_bootSize = m_fileSize;
364*4882a593Smuzhiyun     }
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun     PBYTE lpBoot;
367*4882a593Smuzhiyun     lpBoot = new BYTE[m_bootSize];
368*4882a593Smuzhiyun     fseeko64(m_pFile, m_bootOffset, SEEK_SET);
369*4882a593Smuzhiyun     size_t ret = fread(lpBoot, 1, m_bootSize, m_pFile);
370*4882a593Smuzhiyun     if (ret != m_bootSize)
371*4882a593Smuzhiyun     {
372*4882a593Smuzhiyun         printf("%s : read error\n", __func__);
373*4882a593Smuzhiyun     }
374*4882a593Smuzhiyun     bool bRet;
375*4882a593Smuzhiyun     m_bootObject = new CRKBoot(lpBoot, m_bootSize, bRet);
376*4882a593Smuzhiyun     if (!bRet)
377*4882a593Smuzhiyun     {
378*4882a593Smuzhiyun         bCheck = false;
379*4882a593Smuzhiyun         printf("CRKImage :Error! new CRKBoot fail!\n");
380*4882a593Smuzhiyun         return;
381*4882a593Smuzhiyun     }
382*4882a593Smuzhiyun     if (bOnlyBootFile)
383*4882a593Smuzhiyun     {
384*4882a593Smuzhiyun         m_supportDevice = m_bootObject->SupportDevice;
385*4882a593Smuzhiyun         UINT *pOsType;
386*4882a593Smuzhiyun         pOsType = (UINT *)&m_reserved[4];
387*4882a593Smuzhiyun         *pOsType = (UINT)RK_OS;
388*4882a593Smuzhiyun         fclose(m_pFile);
389*4882a593Smuzhiyun         m_pFile = NULL;
390*4882a593Smuzhiyun     }
391*4882a593Smuzhiyun     bCheck = true;
392*4882a593Smuzhiyun }
~CRKImage()393*4882a593Smuzhiyun CRKImage::~CRKImage()
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun     if (m_pFile)
396*4882a593Smuzhiyun     {
397*4882a593Smuzhiyun         fclose(m_pFile);
398*4882a593Smuzhiyun         m_pFile = NULL;
399*4882a593Smuzhiyun     }
400*4882a593Smuzhiyun     if (m_bootObject)
401*4882a593Smuzhiyun     {
402*4882a593Smuzhiyun         delete m_bootObject;
403*4882a593Smuzhiyun         m_bootObject = NULL;
404*4882a593Smuzhiyun     }
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun 
GetImageSize()407*4882a593Smuzhiyun long long CRKImage::GetImageSize()
408*4882a593Smuzhiyun {
409*4882a593Smuzhiyun     return m_fileSize;
410*4882a593Smuzhiyun }
411