无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3469|回复: 4
打印 上一主题 下一主题

WinVblock 与光盘处理有关的 bug

[复制链接]
跳转到指定楼层
1#
发表于 2018-2-10 19:21:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
今天在 https://github.com/Sha0/winvblock/blob/master/src/winvblock/grub4dos/g4dbus.c

看到了如下的代码:


  1.     /* Check for a RAM disk mapping */
  2.     if (slot->DestDrive == 0xFF) {
  3.         new_dev_obj = WvRamdiskCreateG4dDisk(
  4.             slot,
  5.             bus_dev_obj,
  6.             media_type,
  7.             sector_size
  8.           );
  9.       } else {
  10.         new_dev_obj = WvFilediskCreateG4dDisk(
  11.             slot,
  12.             bus_dev_obj,
  13.             media_type,
  14.             sector_size
  15.           );
  16.       }
复制代码


在这段代码中,开发者把 0xff 号的数据盘都当成内存盘来处理,这是不对的。

当 bios 光驱(El Torito)盘号正好是 0xff 时,也会出现这种情况。

就是说,数据介质盘的盘号 0xff 存在两种可能:其一是内存介质,其二是光盘介质。

如果是内存介质,其扇区大小是正常的(即 512 字节)。如果是光盘介质,其扇区大小是 2048 字节。

以下是修复:


  1.     /* Check for a RAM disk mapping */
  2.     if (slot->DestDrive == 0xFF && ! (slot->DestODD)) {   <------- 只更动了这一句,增加了 “数据介质不是光盘” 的判断
  3.         new_dev_obj = WvRamdiskCreateG4dDisk(
  4.             slot,
  5.             bus_dev_obj,
  6.             media_type,
  7.             sector_size
  8.           );
  9.       } else {
  10.         new_dev_obj = WvFilediskCreateG4dDisk(
  11.             slot,
  12.             bus_dev_obj,
  13.             media_type,
  14.             sector_size
  15.           );
  16.       }
复制代码


顺便说,firadisk 的开发者没有犯这个错误。

虽然 BIOS 赋予 eltorito 光盘盘号正好是 0xff 的情况不多,并且在这种情况下创建 grub4dos 虚拟盘的情况也不多,但是,毕竟存在这种情况。
有了上述修复,代码就更完善、更健壮了。

另外,WinVblock 的以下数据结构也有小错:


  1. /* From GRUB4DOS 0.4.4's stage2/shared.h */
  2. struct S_WV_G4D_DRIVE_MAPPING_ {
  3.     UCHAR SourceDrive;
  4.     UCHAR DestDrive;
  5.     UCHAR MaxHead;
  6.     UCHAR MaxSector:6;
  7.     UCHAR RestrictionX:1;     <---------- 此处应该有 2 位,却只有 1 位。
  8.     UCHAR UnUsed1:1;         <---------- 这是应该新增的,补足 1 位。如果上述 RestrictionX 改成两位的话,就不要再增加 UnUsed1 了。
  9.     UINT16 DestMaxCylinder:13; <--------- 这个位数太多了。柱面号是 10 位,因此应该改成 10。如果改成 10,下面就要增加 UnUsed2 一行了。
  10.     UCHAR UnUsed2:3;         <---------- 这是应该新增的,补足 3 位。如果上述 DestMaxCylinder 保持 13 位的话,就不要再增加 UnUsed2 了。
  11.     UINT16 SourceODD:1;
  12.     UINT16 DestODD:1;
  13.     UINT16 DestLBASupport:1;
  14.     UCHAR DestMaxHead;
  15.     UCHAR DestMaxSector:6;
  16.     UCHAR RestrictionY:1;
  17.     UCHAR InSituOption:1;
  18.     UINT64 SectorStart;
  19.     UINT64 SectorCount;
  20.   };
复制代码


【补充】似乎 winvblock 本来就不支持光盘虚拟。就是说,既不支持在光盘介质上虚拟出软盘、硬盘、光盘,也不支持从软盘、硬盘介质上虚拟出光盘。我不能肯定这一点,我没有研究过,我只是猜测。

5#
 楼主| 发表于 2018-2-11 08:06:36 | 只看该作者
初步看了 Winvblock 的代码,知道它可以处理光盘了。但处理光盘的代码是否存在 bug,还不确定。

可能最严重的问题,就是被 Win7 驱动程序签名机制卡住了。

希望有人整合 firadisk、winvblock 和 imdisk。我不懂 windows 编程,也没有开发环境,但我可以尽自己最大能力提供帮助。
回复

使用道具 举报

4#
发表于 2018-2-11 00:55:57 | 只看该作者
可惜winvblock对win7()包括32位 64位)的map方式硬盘仿真无法成功驱动,也不会修复了.
回复

使用道具 举报

3#
发表于 2018-2-10 20:09:11 | 只看该作者
有道理。不点大师说得很对
回复

使用道具 举报

2#
发表于 2018-2-10 20:08:25 | 只看该作者
有道理。不点大师说得很对
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-26 21:23

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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