无忧启动论坛

 找回密码
 注册
搜索
一次装机 终生领工资最纯净的「微PE装机优盘」UEPON大师作品卡瑞飞系统和装机二合一超级U盘
诚聘PE工具开发技术员QQ:1607112133系统gho:最纯净好用系统下载站广告联系 QQ:184822951 微信:wuyouceo
查看: 505|回复: 9

yaya 看,动态 VHD 更新出现 bug

[复制链接]
发表于 2019-3-24 18:40:23 | 显示全部楼层 |阅读模式
原始讨论在 reboot.pro:

http://reboot.pro/topic/21972-reducing-wimboot-source-wim-file-using-lzx-compression-and-vhd-using-gzip-compression-to-save-room-and-also-load-faster-on-ram/page-2

第 50 楼 karyonix 的发言:

See the diff of stage2/dec_vhd.c in 2017-12-23.

https://github.com/chenall/grub4dos/commit/05379e7b66b71e5665bc5bedda75a58ca74c485a#diff-8f02b0c8853e02d562dc585d418454e3

The codes to read hard disk footer in line 185 and read dynamic disk header in line 209 were just "disabled".


有问题的更动如下:

  1. stage2/dec_vhd.c

  2. @@ -182,7 +182,7 @@ dec_vhd_open(void)
  3.         memset(&footer, 0, sizeof(footer));
  4.         memset(&dynaheader, 0, sizeof(dynaheader));

  5. -        int bytesread = (int)grub_read((unsigned long)&footer, 0x200, 0xedde0d90);
  6. +        //int bytesread = (int)grub_read((unsigned long)&footer, 0x200, 0xedde0d90);

  7.         //if (bytesread < 511) {
  8.                 // grub_printf("bytesread %d < 511\n",bytesread);
  9. @@ -206,7 +206,7 @@ dec_vhd_open(void)
  10.                         goto quit;
  11.                 }
  12.                 filepos = footer.dataOffset;
  13. -                bytesread = (int)grub_read((unsigned long)&dynaheader, sizeof(dynaheader), 0xedde0d90);
  14. +                //bytesread = (int)grub_read((unsigned long)&dynaheader, sizeof(dynaheader), 0xedde0d90);
  15. //        }

  16.         vhdfc = (VHDFileControl*) grub_malloc(sizeof(VHDFileControl));
复制代码


这个更动导致动态 VHD 不再能够支持了。

发表于 2019-3-24 21:46:52 来自手机 | 显示全部楼层
这个不是我修改的。之所以注释掉,可能有他的道理。也许是为了解决某一问题,而引起现在这个现象。如果采取简单的办法,恢复补丁,可能又重现以前的问题。
回复

使用道具 举报

 楼主| 发表于 2019-3-24 22:17:58 | 显示全部楼层
原始代码是谁写的?如果知道的话,可以联系原始作者。

如果不是你修改的,那有可能是 chenall 修改的。

我觉得你可以试着修复,修复坏了再改回来也没啥要紧的。

另外,也可留意那个讨论,说不定有人会给出修复,也未可知。
回复

使用道具 举报

 楼主| 发表于 2019-3-24 22:36:08 | 显示全部楼层
本帖最后由 不点 于 2019-3-24 22:47 编辑

我猜一下。估计是这样的:

bytesread 变量只被赋值,而未被其它地方使用,因此,编译器可能提示这是个没用的变量。修改的人(不管是谁修改的)为了让编译器不报警,就简单注释掉了。

虽然这个变量确实没用,但是,注释掉的话,连同 grub_read 读盘调用也一起注释掉了,那么缓冲区 footer 和 dynaheader 都没有填充有效数据,显然这两个变量(footer 和 dynaheader)也就都废掉了。因此,简单注释掉是不行的。


为了让编译器不报警,可以增添一句:


bytesread = bytesread;


这一句 “废话”,可以让 bytesread 有被用到一次,这样编译器就不会报警了。


gcc 会把这句废话优化掉。因此,添上这句,不增加生成的代码大小。


评分

参与人数 1无忧币 +5 收起 理由
快雪时晴 + 5 很给力!

查看全部评分

回复

使用道具 举报

发表于 2019-3-25 09:31:55 | 显示全部楼层
昨天是从手机看的这个帖子,打不开补丁文件。今天从电脑上网,打开补丁文件一看,确实是我更改的。正如不点说言,由于编译时报警,说 bytesread 未使用,就给注释掉来,没有考虑 grub_read 读盘。不好意思!

点评

是你就好。那么问题也就解决了。 我猜中了 gcc 报警的场景。 我这就去 reboot.pro 给个消息。  详情 回复 发表于 2019-3-25 11:38
回复

使用道具 举报

发表于 2019-3-25 10:41:42 | 显示全部楼层
已经修正,上传官网。有劳不点通知一下reboot.pro。
回复

使用道具 举报

 楼主| 发表于 2019-3-25 11:38:07 | 显示全部楼层
2011yaya2007777 发表于 2019-3-25 09:31
昨天是从手机看的这个帖子,打不开补丁文件。今天从电脑上网,打开补丁文件一看,确实是我更改的。正如不点 ...

是你就好。那么问题也就解决了。

我猜中了 gcc 报警的场景。

我这就去 reboot.pro 给个消息。
回复

使用道具 举报

 楼主| 发表于 2019-3-26 11:38:12 | 显示全部楼层
来自 reboot.pro 的反馈说,新版现在工作得很好。
回复

使用道具 举报

发表于 2019-3-26 12:48:19 来自手机 | 显示全部楼层
解决了就好
回复

使用道具 举报

发表于 2019-3-27 10:36:02 | 显示全部楼层
本帖最后由 cchessbd 于 2019-3-27 10:40 编辑

不点大大真是太牛了。连编译器在想什么都能猜出来。服。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2019-4-26 17:58

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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