/* initialized commandline and starts linux. we need todo this for Atheros LSDK based firmwares since they have no ramsize detection */ static void set_cmdline(void) { /* check elf */ if (!s_memcmp(output_data,ELFMAG,SELFMAG)) { unsigned int loadaddr; unsigned int loadaddr_end; fis_load_elf_image(output_data,0,uncompressedSize,&bootoffset,&loadaddr,&loadaddr_end); } char *pcmd; struct parmblock *pb; pb = (struct parmblock *)0x80030000; pcmd = pb->text; pb->memsize.name = pcmd; strcpy(pcmd, "memsize"); pcmd += 7; pb->memsize.val = ++pcmd; strcpy(pcmd, "0x"); pcmd += 2; static char *xlate = "0123456789abcdef"; int i; int c = 0; unsigned int val = RAM_SIZE; for (i = 28; i >= 0; i -= 4) { pcmd[c++] = xlate[(val >> i) & 0xf]; } pcmd += c; pb->modetty0.name = ++pcmd; strcpy(pcmd, "modetty0"); pcmd += 8; pb->modetty0.val = ++pcmd; strcpy(pcmd, "115200,n,8,1,hw"); pcmd += 15; pb->ethaddr.name = NULL; pb->ethaddr.val = NULL; pb->argv[0] = pcmd; pb->argv[1] = ++pcmd; pcmd[0] = 0; //terminate, no user commandline void (*tt) (int a, char **b, void *c); tt = bootoffset; tt(2, pb->argv, pb); }
int ImgFileCheck(char *pIn, int inLen, int type, char **ppOut, int *pOutLen) { char *p; char ImgFileFlag[] = "NRCA"; char CodeFlag[] = "CODE"; char DBDataFlag[] = "DBDT"; char WebFileFlag[] = "WEBF"; char FontFlag[] = "FONT"; char Hash[16]; int fLen; if (inLen < (50+32)) { return -1; } //跳过前面的50字节的MAC+KEY+SN p = pIn + 50; //判断文件头 if (s_memcmp(p, (char *)ImgFileFlag, 4) != 0) { return -1; } p += 4; //判断文件版本 if (p[0] != 0x01) { return -1; } p ++; //跳过3字节保留字 p += 3; //判断文件类型 if (! ( ((s_memcmp(p, CodeFlag, 4) == 0) && (type == IMGFILETYPE_CODE)) || ((s_memcmp(p, DBDataFlag, 4) == 0) && (type == IMGFILETYPE_DBDATA)) || ((s_memcmp(p, WebFileFlag, 4) == 0) && (type == IMGFILETYPE_WEBFILE)) || ((s_memcmp(p, FontFlag, 4) == 0) && (type == IMGFILETYPE_FONT)) ) ) { return -1; } p += 4; //判断文件长度 fLen = ((unsigned char)p[0] << 24) + ((unsigned char)p[1] << 16) + ((unsigned char)p[2] << 8) + ((unsigned char)p[3] << 0); if (fLen > (inLen-50)) { return -1; } p += 4; s_memcpy(Hash, p, 16); s_memset(p, 0, 16); MD5_Init (&context); MD5_Update (&context, (unsigned char *)pIn, fLen+50); MD5_Final ((unsigned char *)digest, &context); if (s_memcmp(Hash, digest, 16) != 0) { return -1; } *ppOut = p + 16; *pOutLen = fLen - 32; return 0; }