⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cksum.c

📁 AT91所有开发板的资料 AT91所有开发板的资料
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include "module.h"#ifndef SEEK_SET#define SEEK_SET	0#define SEEK_CUR	1#define SEEK_END	2#endif#define REAL_ADDRESS(head, address) real_address(head, (void *)(address))int byte_reversing;static unsigned byte_x(unsigned v){    return (v << 24) | ((v << 8) & 0x00ff0000) | ((v >> 8) & 0x0000ff00) | (v >> 24);}#define tv(a) (byte_reversing ? (unsigned *)byte_x((unsigned)a) : (unsigned *)(a))void *real_address(ModuleHeader *head, void *address){    return (char *)address + ((char *)head - (char *)tv(head->self));}unsigned cksum(unsigned *base, unsigned *limit){    unsigned sum = 0;     while (base < limit) sum ^= *base++;    return sum;}unsigned cksum_modules(unsigned *buff, unsigned size){    ModuleHeader *head;    unsigned i;    unsigned *base, *limit;    unsigned nmodules = 0;    unsigned rm;    rm = byte_x(MODULE_MAGIC);    for (i = 0; i < size; i++) {	if (buff[i] == MODULE_MAGIC || buff[i] == rm) {	    byte_reversing = 0;	    if (buff[i] == rm) byte_reversing = 1;	    head = (ModuleHeader *)&buff[i];	    base = (unsigned *)REAL_ADDRESS(head, tv(head->ro_base));	    limit = (unsigned *)REAL_ADDRESS(head, tv(head->ro_limit))+(tv(head->zi_base) - tv(head->rw_base));	    /* EOR checksum is the same either endianness */	    head->checksum = 0;		/* Prevent foolishness */	    head->checksum = cksum(base, limit);	    printf("Found module %s, header at offset 0x%x, checksum = 0x%x\n",		REAL_ADDRESS(head, (char *)tv(head->title)), i * 4, (unsigned)tv(head->checksum));	    nmodules++;	}    }    return nmodules;}int main(int argc, char **argv){    FILE *f;    unsigned size;    unsigned nmodules;    char *infile;    unsigned *buff;    if (argc != 2) {	fprintf(stderr, "Usage: cksum <module>\n");	exit(1);    }    infile = argv[1];    f = fopen(infile, "r");    if (!f) {	fprintf(stderr, "Error opening '%s' with read access. Check filename and permissions\n", infile);	exit(1);    }    if (fseek(f, 0, SEEK_END)) {	fprintf(stderr, "Error performing seek on '%s'. Is it a rgular file\n", infile);	exit(1);    }    size = ftell(f);    if (fseek(f, 0, SEEK_SET)) {	fprintf(stderr, "Error performing seek on '%s'. Is it a rgular file\n", infile);	exit(1);    }    buff = malloc((size + 3) & ~3);    buff[(size-1)/4] = 0;    if (fread(buff, 1, size, f) != size || fclose(f)) {	fprintf(stderr, "Error reading '%s'\n", infile);	exit(1);    }    nmodules = cksum_modules(buff, (size + 3)/4);    if (!nmodules) {	fprintf(stderr, "No modules found in '%s'. Check module header has been linked in.\n", infile);	exit(1);    }    printf("Checksum performed on %d module(s). Rewriting file '%s'.\n", nmodules, infile);    f = fopen(infile, "w");    if (!f) {        fprintf(stderr, "Error opening '%s' with write access. Check permissions\n", infile);        exit(1);    }    if (fwrite(buff, 1, size, f) != size || fclose(f)) {	fprintf(stderr, "SERIOUS ERROR writing '%s', file may be corrupted.\n", infile);	exit(1);    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -