Esempio n. 1
0
/* 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);

}
Esempio n. 2
0
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;
}