qnx efs文件系统binary修复
從spi flash從dump了qnx的固件。進一步提取出efs文件系統
但是使用qnx dumpefs命令導出文件系統時發現結構體異常。
谷歌到了類似問題患者
http://www.openqnx.com/phpbbforum/viewtopic.php?t=3620
 
 
H[01] L[FFFF] P[00]
 .status=EE8E (WRITE|NO_NEXT|NO_SUPER|NO_SPLIT|BAD|LAST|DIR|BASIC)
 .reserve=B2
 .text_offset_hi=6C
 .text_offset_lo=0018
 (text_offset=01B00060)
 .text_size=0003
 dirent
 .status=0200 (STAT)
 .struct_size=0000
 .first
 ..logi_unit=0002 ..index=0000
 .moves=BA
 .namelen=00
 .reserve=0073
 name="pt?"
 stat
 .status=FE70 (COMP)
 .struct_size=0006
 .uid=0000000C
 .gid=0006FE0C
 .mtime=00402CE6 Wed Feb 18 17:16:38 1970
 .ctime=00000003 Thu Jan 1 01:00:03 1970
 .mode=FFFFFFFC ?rwsrwsr-T
 
 
經過winhex分析,是由于塊底的描述信息有誤。
具體原因就是 text_offset_hi?text_offset_lo的字段的值,系數不一致導致的
dumpefs的系數是4,而文件binary的系數是64,差了16倍導致的。
由于沒找到怎么使用dumpefs修正這個系數
因此寫了一段程序修復這個錯誤
塊底部的描述信息,由winhex+dumpefs信息分析而來。
 
#define _CRT_SECURE_NO_WARNINGS
 #include <stdio.h>
 #include <stdlib.h>
 
 
 void fixhdr(char *sector)
 {
 ? ? unsigned char *hdr;
 
 
 ? ? for(hdr = (unsigned char *)sector + 0x10000 - 0x20; hdr > sector ; hdr -= 0x20)
 ? ? {
 ? ? ? ? unsigned char hi;
 ? ? ? ? unsigned short lo;
 ? ? ? ? int off, fixoff;
 
 
 ? ? ? ? if(hdr[0] == 0xFF && hdr[1] == 0xFF)
 ? ? ? ? ? ? break;
 
 
 ? ? ? ? hi = hdr[0x13];
 ? ? ? ? lo = *(unsigned short *)&hdr[0x14];
 ? ? ? ? off = ((int)hi << 16) | lo;
 
 
 ? ? ? ? fixoff = off * 16;
 ? ? ? ? lo = fixoff & 0xFFFF;
 ? ? ? ? hi = fixoff >> 16;
 ? ? ? ? hdr[0x13] = hi;
 ? ? ? ? *(unsigned short *)&hdr[0x14] = lo;
 ? ? ? ? printf("fix %06x -> %06x\n", off, fixoff);
 ? ? }
 }
 
 
 int main(int argc, char *argv[])
 {
 ? ? FILE *fin, *fout;
 ? ? char *buf;
 
 
 ? ? if(argc != 3)
 ? ? {
 ? ? ? ? printf("efsfix [src] [dst]\r\n");
 ? ? ? ? exit(0);
 ? ? }
 
 
 ? ? fin = fopen(argv[1], "rb");
 ? ? if(!fin)
 ? ? {
 ? ? ? ? printf("fopen %s failed\n", argv[1]);
 ? ? ? ? exit(0);
 ? ? }
 ? ? fout = fopen(argv[2], "wb");
 ? ? if(!fin)
 ? ? {
 ? ? ? ? printf("fopen %s failed\n", argv[1]);
 ? ? ? ? exit(0);
 ? ? }
 
 
 ? ? buf = malloc(0x10000);
 ? ? if(!buf)
 ? ? {
 ? ? ? ? printf("malloc failed\n");
 ? ? ? ? exit(0);
 ? ? }
 
 
 ? ? while(1)
 ? ? {
 ? ? ? ? int ret;
 
 
 ? ? ? ? printf("read sector...\n");
 ? ? ? ? ret = fread(buf, 1, 0x10000, fin);
 ? ? ? ? if(ret != 0x10000)
 ? ? ? ? {
 ? ? ? ? ? ? printf("fread %d exit\n", ret);
 ? ? ? ? ? ? break;
 ? ? ? ? }
 
 
 ? ? ? ? fixhdr(buf);
 
 
 ? ? ? ? printf("write sector...\n");
 ? ? ? ? fwrite(buf, 1, 0x10000, fout);
 ? ? }
 
 
 
 
 ? ? free(buf);
 ? ? fclose(fin);
 ? ? fclose(fout);
 }
 
 
修復后仍然無法正常dumpefs
這種現象形成的原因可能是 64byte alignment ECC。
總結
以上是生活随笔為你收集整理的qnx efs文件系统binary修复的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 解决vc2008 utf8中文字符串报错
- 下一篇: USB转串口TTL板RX电平异常导致无法
