chainloader WinMEIO.SYS⡣

ԭ
ͬWin98ԼǰIO.SYSWinMEIO.SYSǾѹģڰIO.SYSƵڴҪѹʹã£

1IO.SYS0x800ʼݶ70:0(˲ͬWin98)
270:0Ƶڴߴ
3Կʽݽѹ70:0
4diΪѹݵĳ
5dxֵȻת70:0ִС(˲ͬWin98)

WinME IO.SYSĽṹ

0-0x7FF: 4BOOT
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.exegrldrǱİ汾Ӧ˲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 - 0x3F
110: 8λݣλƷΧ 0x40 - 0x13F
111: 12λݣλƷΧ 0x140 - 0x113F
01/10: 7λֱӵݣݵλȡ0/1

λ0x113FǣһεĽѹ󣬳һ⣬εĳȶӦ512

ȡ
1ûкλ2
01ú1λݣȷΧ 3-1
001ú2λݣȷΧ 5-8
0001ú3λݣȷΧ 9-0x10
00001: 4λݣȷΧ 0x11-0x20
000001ú5λݣȷΧ 0x21-0x40
0000001: 6λݣȷΧ 0x41-0x80
00000001: 7λݣȷΧ 0x81-0x100
000000001: 8λݣȷΧ 0x101-0x200
000000000: 

ﻹһӦóexpiosѹIO.SYSĴԡʹ¡

1expios io.sys

ûϢĽѹͨ

2expios 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.c

grub-winme-c-1129ǲԴǰһ汾grub-winme-1129ݣ벻Ҫͬʱʹá

