grub installer for MagicLinux硬盘安装 0.1.0版发布
0.1.0版本已经达到原来想要的效果,但是还没有全面的测试,在win7下有可能因为权限的问题出点小毛病,加权限运行就没问题了。在win下对linux的grub备份,然后改win引导,完全能实现,明天我发个我自己机器上的纯win启动器的MBR备份文件,大家选中恢复就可以由win引导了。-------------------------------------------------------------
前几天看到有人说要一个win下的magic体验,后来想想这个类似于wubi的实在不好用,做出来也没多大价值(还不一定能做出来呢,linux和microsoft结合在一块,不敢想象)。鉴于有些人懒得改grub来硬盘安装,这里我写了一个添加grub,添加magiclinux硬盘安装引导项的qt console程序(方便以后用qt构建前台)。
现在实现的就只是在winxp下添加grub(我用的系统只有winxp和linux,手上还没有现成的vista和win7),通过简单修改boot.ini添加文件grldr menu.lst mbvmlinuz mbinitrd-hd.gz到C:盘下。
图形界面还没有做,实在不算什么程序。以后慢慢扩展了 :)
接下来想要实现的功能:
1、列出所有可用磁盘,以及磁盘编号(包括windows下磁盘名称,磁盘卷标,grub下的磁盘分布(hd0,x))实现
2、GUI界面有选择安装iso文件在哪个磁盘。(功能实现已经想好,只剩体力活了)实现,不过没有解析iso文件
3、搞个vista系统,完成vista下安装grub(想用bcd.exe执行系统命令添加启动项)实现
4、扩展功能,在win下修复grub启动项,在menu.lst中写入一段寻找各个盘符下的 /menu.lst /boot/menu.lst /boot/grub/menu.lst 并执行这些fileconfig menu.lst 属于Grub编程了,再说吧
5、如果能更改mbr就可以做一个启动项备份恢复功能了。(这个地方还不知道怎样实现,有谁做过保存更改mbr的程序放出来学习一下吧)实现
----------------------------------------------------------------------
realese0.1.0
警告!MBR恢复功能出现问题,mingw+C++ 编译出来的程序对零扇区读写出现问题。头疼。
更新时间:2009年12月27日23:31:49
文件名:magic_win_0.1.0_release.rar
下载地址:http://www.rayfile.com/files/9bb05619-f2fc-11de-94a7-0014221b798a/
文件名:magic_win_0.1.0_forXP_src.rar
下载地址:http://www.rayfile.com/files/84d3dc1e-f2fc-11de-a0b7-0014221b798a/
文件名:magic_win_0.1.0_forVista_release.rar
下载地址:http://www.rayfile.com/files/15230730-f2fc-11de-b766-0014221b798a/
文件名:magic_win_0.1.0_forVista_src.rar
下载地址:http://www.rayfile.com/files/5f942be6-f2fc-11de-9c59-0014221b798a/
release0.0.3
更新时间:2009年12月19日0:41:05
文件名:0.0.3forWinxp.rar(release For WinXP)
下载地址:http://www.rayfile.com/files/c8b10f5e-ebab-11de-a61f-0014221b798a/
文件名:magic_win_0.0.3_forXP_src.rar(source For WinXp)
下载地址:http://www.rayfile.com/files/9b163b4f-ebe2-11de-967c-0014221b798a/
文件名:0.0.3forVista.rar(release For Vista)
下载地址:http://www.rayfile.com/files/82da087a-ebf4-11de-aca4-0014221b798a/
文件名:magic_win_0.03_forVista_src.rar(source For Vista)
下载地址:http://www.rayfile.com/files/b5aa9fd7-ebf3-11de-99aa-0014221b798a/
release0.0.2
更新时间:2009-12-14 17:10:54
mbr保存功能错误,下一版本会更正和扩展
文件名:magic_win_0.0.2.rar(含source)
下载地址:http://www.rayfile.com/files/364fdc91-e88d-11de-8d99-0014221b798a/
需要的dll文件:
文件名:essentialdll.rar
下载地址:http://www.rayfile.com/files/1b4a44c0-e84f-11de-9024-0014221b798a/
与程序放在同一目录下执行
[ 本帖最后由 zy_sunshine 于 2009-12-28 13:50 编辑 ] 读取硬盘绝对零扇区(MBR)
C:>DEBUG
-a 100 ' 从偏移100H开始输入汇编代码
XXXX:0100 mov ax, 0201 ' int 13H 参数:读取扇区,读一个扇区
XXXX:xxxx mov bx, 1000 ' 读出的数据存入偏移为 1000H 开始的地址
XXXX:xxxx mov cx, 0001 ' int 13H 参数:读取零道、1扇区
XXXX:xxxx mov dx, 0080 ' int 13H 参数:读取零柱面,硬盘(80H为第一硬盘)
XXXX:xxxx int 13 ' 调用DOS中断13H
XXXX:xxxx int 20 ' 调用DOS中断20H(结束运行)
-g=100 ' 运行偏移100H开始的代码
之后,第一硬盘的绝对0扇区的数据就存入了偏移量为1000H的地址中了
(2)写入软盘
续(1),MBR数据读入1000H地址后,(仍然在DEBUG环境中)
-n a:mbr.dat ' 命名文件为A盘的MBR.DAT
-r bx ' 写入的字节数量由BX:CX指定
:0
-r cx ' 修改寄存器CX的值,指定写入的字节数量
:200 ' 准备写入512字节(200H)
-w 1000 ' 将偏移量为1000H开始的数据写入文件
-q ' 退出DEBUG环境
C:>
(3)从软盘读入MBR数据
C:>DEBUG
-n a:mbr.dat ' 指定A盘的文件MBR.DAT
-l 1000 ' 将数据读入到偏移量为1000H开始的区域
(4)将MBR数据写入硬盘绝对零扇区
续(3),将MBR数据从软盘读入1000H地址后,(仍然在DEBUG环境中)
-a 100 ' 从偏移100H开始输入汇编代码
XXXX:0100 mov ax, 0301 ' int 13H 参数:写入扇区,写一个扇区
XXXX:xxxx mov bx, 1000 ' 写入的数据从地址 1000H 开始
XXXX:xxxx mov cx, 0001 ' int 13H 参数:写零道、1扇区
XXXX:xxxx mov dx, 0080 ' int 13H 参数:写零柱面,硬盘(80H为第一硬盘)
XXXX:xxxx int 13 ' 调用DOS中断13H
XXXX:xxxx int 20 ' 调用DOS中断20H(结束运行)
-g=100 ' 运行偏移100H开始的代码
-q
C:> grubinst.exe是一个命令行方式的程序,它的功能基本上与不点的GRUB4DOS发行包中的bootlace.com(可以运行在纯DOS或者 Linux环境)相同,但是跟bootlace.com不同,grubinst完全是用C语言开发的,能够在Windows NT/2K/XP、Linux和FreeBSD等操作系统下编译并运行。 我看兄台只好写个界面就行了。。。
或者下载grub4dos的源码看看
grubinst-1.1-src-2008-01-01]# make
perl ./ver2h.pl version version.h
gcc -nostdlib -DGRLDR_MBR -Wl,-N -Wl,-T -Wl,./ldscript -o grldr grldrstart.S
/usr/bin/ld: warning: .note.gnu.build-id section discarded, --build-id ignored.
objcopy -O binary grldr grldr.mbr
rm grldr
perl ./bin2h.pl grldr.mbr grub_mbr.h grub_mbr
gcc -I./ -I. -DLINUX -c -MMD -o grubinst.o grubinst.c
gcc -I./ -I. -DLINUX -c -MMD -o utils.o utils.c
gcc -I./ -I. -DLINUX -c -MMD -o xdio.o xdio.c
gcc -I./ -I. -DLINUX -c -MMD -o keytab.o keytab.c
gcc -I./ -I. -DLINUX -ogrubinst grubinst.o utils.o xdio.o keytab.o
gcc -I./ -I. -DLINUX -MMD -o grubmenu grubmenu.c
Linux下也都编译成功了。
./grubmenu
Usage:
grubmenu info grldr
grubmenu print grldr
grubmenu [-r] export grldr menu.lst
grubmenu [-r] [-k] import grldr menu.lst
[ 本帖最后由 haulm 于 2009-12-13 11:30 编辑 ] http://www.nohack.cn/bbs/thread-109023-1-1.html#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <fstream>
using namespace std;
int main(void)
{
char type;
char buffer;
ifstream in("\\\\.\\PHYSICALDRIVE0",ios::binary|ios::in);
in.read(buffer,sizeof(buffer));
in.close();
ofstream out("mbr.txt",ios::binary|ios::out);
out.write(buffer,sizeof(buffer));
out.close();
memset(buffer,0,sizeof(buffer));
ofstream ZeroMBR("\\\\.\\PHYSICALDRIVE0",ios::binary|ios::out);
cout << "WARNING:sure to Zero the MBR? type\"y\" to Zero the MBR." << endl;
cin >> type;
if(type=='y')
{
ZeroMBR.write(buffer,sizeof(buffer));
}
ZeroMBR.close();
system("pause");
return 0;
}
[ 本帖最后由 haulm 于 2009-12-13 11:41 编辑 ] lz没用过wubi吗
wubi这是一种安装方式,他建了一个文件,挂载成分区,所以不用分区
安装完除了读写速度和物理机有区别,其他的可以说一模一样
回复 6# haulm 的帖子
:) 这些就足够了,我可以调用grubinst 或者用那段c++代码C/C++来操作磁盘驱动这块还要研读......
grub4dos的源代码?呵呵 还从来没看过大项目的代码。趁这个机会试试。
感谢haulm提供的资料:evil:
回复 2# whistler_wmz 的帖子
等着你的游戏出来呢 原帖由 Jactry 于 2009-12-13 12:28 发表 http://www.linuxfans.org/bbs/images/common/back.giflz没用过wubi吗
wubi这是一种安装方式,他建了一个文件,挂载成分区,所以不用分区
安装完除了读写速度和物理机有区别,其他的可以说一模一样
wubi还真没用过,感觉麻烦就没用,有空试试:mrgreen: 你要注意,读写grub的代码我虽然没有尝试,但我使用dd指令时尝试过grub的保存和写入,具体写入字节应该小于512字节,具体多少我要查下好象是 MBR前446字节,全部写入会出问题,因为里面可能还有硬盘分区的信息,512字节最后64个字节记录了分区的大小、类型,哪个是活动分区等等(具体结构请参考相关资料)。
回复 11# haulm 的帖子
恩,这个了解。。我以后的版本想要加功能,就是分析mbr结构的东西,512个字节,怎么也分析明白了。回复 11# haulm 的帖子
网速慢死了,程序就是传不上去了。。。。。发个帖子都发重了[ 本帖最后由 zy_sunshine 于 2009-12-13 19:08 编辑 ] 原帖由 Jactry 于 2009-12-13 12:28 发表 http://www.linuxfans.org/bbs/images/common/back.gif
lz没用过wubi吗
wubi这是一种安装方式,他建了一个文件,挂载成分区,所以不用分区
安装完除了读写速度和物理机有区别,其他的可以说一模一样
其实不一样的。你仔细用过就知道了。