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

📄 scratchpad.txt

📁 grub_for_dos-0.4.2
💻 TXT
字号:
这个补丁修正了chainloader 不能启动WinME的IO.SYS的问题。基本原理:不同于Win98以及以前的IO.SYS,WinME的IO.SYS是经过压缩的,因此在把IO.SYS复制到内存后,要经过解压后才能使用,其基本过程如下:1、把IO.SYS从0x800开始的数据读入70:0。(此步同Win98)2、把70:0的数据移到常规内存的最高处。3、以块的形式把数据解压回70:04、把di设为解压后数据的长度5、设置dx的值,然后转入70:0执行。(此步同Win98)WinME 的IO.SYS的结构:0-0x7FF: 4个扇区的BOOT程序0x800: word 0x4D43 ( 'CM' ) 压缩IO.SYS的标志。从0x802开始是压缩块,每块以3个字节的属性字段开始。字节0:0 - 块是非压缩块1 - 块是压缩块对于压缩块,从块开始+5处是一个0x5344的字。字节1-2:长度字段len对于压缩块,下一个块的开始位置是本块位置+1+len对于非压缩块,下一个块的开始位置是本块位置+1+2+len若某一块的长度为0,则它标志着数据块的结束。在数据块后紧接着的第一个段,是程序块,它的结构为:字节0-1:标志字节 0x4D43 ( 'CM' )字节2-3: 解压程序相对于本块开始的位移字节4-结束:解压程序的代码和数据我在附件中包含了此补丁的源程序grub-winme-1129,此补丁对应于grub_for_dos-2005-11-29.zip,并且应该在grub-0.97-patch4-emulation后使用。附件中的grub.exe和grldr是编译后的版本,它应用了补丁patch1 - patch5, 以及grub-winme-1129。我所使用的IO.SYS也包含在附件中,它来自于英文版WinME, WinVer是 4.90.3000,大家可以测试一下其它的版本。使用源文件编译的朋友请注意一下,以上的补丁文件因为忘了使用条件编译,因此在编译Grub Shell时会出现变量chain_is_winme没有找到的错误,修正后的补丁文件如下。-----------------------------------------------------bean: grub-winme补丁需要改进一下。你的工作非常有难度,很漂亮。我也发现是压缩的,我本来是打算放弃它了,正如你所看到的那样,11-29 中已经不再能够装入winme了。既然要支持 WINME,那就应该更完美地支持它,否则还是不支持它了好。希望解压过程在 builtins.c 中,如下所标明的位置:            }else{                /* Read the first 640K */                read_length = filemax - chainloader_skip_length;                if (read_length > 0xa0000 - (chainloader_load_segment<<4) - chainloader_load_offset)                  read_length = 0xa0000 - (chainloader_load_segment<<4) - chainloader_load_offset;                filepos = chainloader_skip_length;                if (grub_read ((char *) 0x110000, read_length) != read_length)                  {                    grub_close ();                    kernel_type = KERNEL_TYPE_NONE;                    if (errnum == ERR_NONE)                        errnum = ERR_EXEC_FORMAT;                    return 1;                  }                grub_close ();		//-----------------		//可以在这里进行解压。		//目标代码已经读入到 0x110000,你可以解压到 0x1B0000,		//解压失败,此处就有机会出错退出,也就是说,boot 命令失败,返回到		//GRUB 环境。这比 reboot 机器强多了。		//解压结束后,把 0x1B0000 处的结果复制到 0x110000,		//接下来就不用管了,最多修改一下chainloader_load_length 和		//read_length,让它们都等于解压后的文件长度就行了。		//最好不要用微软的那一段解压程序,而要用自己的程序,用 C 语言写。		//-----------------            }这么一来,asm.S 这个文件,似乎就没必要再改动了。你看看上述方案可行与否?如果短时间不能解决,我们可以留到以后再解决,现在先不支持WINME。----------------------------------------------------附件里包含了新版的WinME补丁,这个版本完全用C语言编写,而且增加了解压的部分(原来版本是使用IO.SYS里面的函数来解压)。IO.SYS里面使用了滑动窗口的压缩(LZ77),而位移和长度字段均使用了变长字节编码∶位移∶00∶后接6位数据,位移范围 0 - 0x3F110: 后接8位数据,位移范围 0x40 - 0x13F111: 后接12位数据,位移范围 0x140 - 0x113F01/10: 后面7位是直接的数据,数据的最高位取0/1当出现位移0x113F是,表明一个段的结束。解压后,除了最后一个段外,其他各个段的长度都应该是512。长度∶1∶没有后接位,长度是201∶后接1位数据,长度范围 3-1001∶后接2位数据,长度范围 5-80001∶后接3位数据,长度范围 9-0x1000001: 后接4位数据,长度范围 0x11-0x20000001∶后接5位数据,长度范围 0x21-0x400000001: 后接6位数据,长度范围 0x41-0x8000000001: 后接7位数据,长度范围 0x81-0x100000000001: 后接8位数据,长度范围 0x101-0x200000000000: 作出错处理附件里还包含一个独立的应用程序expios,它把关于IO.SYS的处理分离出来,可以用作测试。其使用如下∶1、expios io.sys如果没有输出信息,则基本的解压检测通过2、expios io.sys io_out.sys把解压后的io.sys写入io_out.sys中,如果用二进制编辑器打开io_out.sys,应该可以看到英文的字符串。解压后的io_out.sys不能直接作为IO.SYS,不过可以使用grub来启动。expios.exe是编译后的Win32命令行程序,其他系统的用户可以用gcc来编译∶gcc -D__unix -o expios expios.cgrub-winme-c-1129是补丁的源程序,它与前一版本的grub-winme-1129不兼容,请不要同时使用。

⌨️ 快捷键说明

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