无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 不点
打印 上一主题 下一主题

准备基于 fbinst 进行再开发,请各位提供帮助

    [复制链接]
1#
发表于 2014-1-3 12:32:47 | 显示全部楼层
很久没来论坛了,听J大他们说,不点您再进一步开发fbinst,我估计是底层的东西,我也许帮不上什么忙。
上次我和J大还有群里的几个网友发现fbinst一个重大的bug,在Chenall修改的版本里面,可能没有修正这个BUG,
虽然这个不是底层的内容,但我想还是有必要修正一下,下面是修正后的部分代码:

  1. int
  2. check_space (uchar4 *start, uchar4 size, uchar4 *count,
  3.              uchar4 begin, uchar4 end, int is_ext)
  4. {
  5.     /* 下面一段代码比较难看懂,拆分一下:
  6.         1、begin >= fb_pri_size,就是begin在扩展区的时候,其实只有一种情况:
  7.            不管is_ext = 0 还是 1,都只能在扩展区判断空间大小,这个时候,如果
  8.             (end - begin >= *count) 也就是说,碎片的空间(或者尾部空间)大于
  9.             等于文件大小,就满足存放条件。
  10.         2、如果(end <= fb_pri_size),也就是说,最后一个文件在主分区,这个时候如果
  11.            is_ext = 0 并且 (end - begin >= *count),也就是说主分区内有大于等于
  12.            该文件大小的空间,就分配给他。如果没有返回失败信息 0 ,以便循环继续执行。
  13.         3、如果在碎片中找不到适合的空间,那么这个时候begin等于最后一个文件的下一个位置,
  14.            end等于ud区的总大小,这个时候分两种情况:
  15.            1)begin在主分区,再如果指定导入主分区,主分区 - begin 的空间可以容纳文件,满足条件,
  16.               *start = begin;  如果指定导入扩展区后主分区导入失败,这个时候整个扩展区是空的,
  17.               且大小可以容纳文件,就从扩展区开始的地方写入该文件,*start = fb_pri_size;
  18.            2)begin在扩展区,begin >= fb_pri_size,如果扩展区剩余的空间满足要求,就分配空间,
  19.               (end - begin >= *count),*start = begin;       
  20.    
  21.         BUG分析:如果 begin >= fb_pri_size ,就是说begin已经在扩展区了,而这个时候
  22.                 count = (size + 509) / 510 ,count的值一般情况下是大于真实值的,应该改为
  23.                 *count = (size + 511) >> 9;        再进行 (end - begin) 和 *count 的对比.
  24.                 否则造成,刚删除的文件,再导入,不会占用原来的位置,而是占用更大的位置或者
  25.                 排到最后。
  26.                
  27.        plantsoot @ 2012-1-31   
  28.     */
  29.    
  30.         if (begin >= fb_pri_size) // 修复bug语句,2012-2-1
  31.         {
  32.                 *count = (size + 511) >> 9;
  33.         }                                                  // 修复bug结束
  34.     if ((begin >= fb_pri_size) || (end <= fb_pri_size))        // 如果开始扇区在扩展区,或者end在主分区
  35.     {
  36.                 // 如果 开始扇区位于扩展区或者未指定导入扩展区,并且空闲区域大于等于文件大小
  37.         if (((begin >= fb_pri_size) || (! is_ext)) && (end - begin >= *count))
  38.         {
  39.             *start = begin;        // 那么可以存放文件,返回该空闲空间的起始扇区
  40.             return 1;
  41.         }
  42.     }
  43.     else //((begin < fb_pri_size) and (end > fb_pri_size))
  44.     {        /* 如果未指定导入到扩展区,并且begin在主分区内,当前文件的起始扇区在扩展区
  45.                  * 这个时候不能按  end - begin >= *count 来算,为什么呢?因为文件存放不可以跨区,
  46.                  * 要么主分区,要么扩展区。如果主分区剩余的空间大于等于文件大小,begin位置赋值给start */
  47.         if ((! is_ext) && (fb_pri_size - begin >= *count))
  48.         {
  49.             *start = begin;
  50.             return 1;
  51.         }
  52.                
  53.                 //如果指定了扩展区,begin在主分区内,当前文件的起始扇区在扩展区
  54.         *count = (size + 511) >> 9;                        // 扩展区扇区有效大小是512字节
  55.         if (end - fb_pri_size >= *count)        // 扩展区第一个文件和主分区之间如果有足够大的空间       
  56.         {
  57.             *start = fb_pri_size;
  58.             return 1;
  59.         }
  60.     }

  61.     return 0;
  62. }
复制代码


注释写的不是很严谨,见谅。
回复

使用道具 举报

2#
发表于 2014-1-3 12:42:16 | 显示全部楼层
cchessbd 发表于 2013-12-29 09:00
关于ud的文件列表,我希望默认采用ANSI格式,而不是UTF-8。
因为用jianliulian的fbinstool回写fba到u盘时 ...

更换下你的fbinst版本,可以用fbinst修正版,也可以用不才的 fbinst plus。

点评

百大,您有不才的 fbinst plus的下载地址或者帖子吗?找不到,望原谅。  详情 回复 发表于 2014-2-27 15:04
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-15 08:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表