zy_sunshine 发表于 2009-12-13 10:32:46

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 编辑 ]

whistler_wmz 发表于 2009-12-13 10:53:12

haulm 发表于 2009-12-13 11:18:05

读取硬盘绝对零扇区(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:>

haulm 发表于 2009-12-13 11:22:24

grubinst.exe是一个命令行方式的程序,它的功能基本上与不点的GRUB4DOS发行包中的bootlace.com(可以运行在纯DOS或者 Linux环境)相同,但是跟bootlace.com不同,grubinst完全是用C语言开发的,能够在Windows NT/2K/XP、Linux和FreeBSD等操作系统下编译并运行。

haulm 发表于 2009-12-13 11:25:48

我看兄台只好写个界面就行了。。。
或者下载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 编辑 ]

haulm 发表于 2009-12-13 11:34:19

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 编辑 ]

Jactry 发表于 2009-12-13 12:28:08

lz没用过wubi吗
wubi这是一种安装方式,他建了一个文件,挂载成分区,所以不用分区
安装完除了读写速度和物理机有区别,其他的可以说一模一样

zy_sunshine 发表于 2009-12-13 12:58:31

回复 6# haulm 的帖子

:) 这些就足够了,我可以调用grubinst 或者用那段c++代码
C/C++来操作磁盘驱动这块还要研读......

grub4dos的源代码?呵呵 还从来没看过大项目的代码。趁这个机会试试。

感谢haulm提供的资料:evil:

zy_sunshine 发表于 2009-12-13 12:59:34

回复 2# whistler_wmz 的帖子

等着你的游戏出来呢

zy_sunshine 发表于 2009-12-13 13:00:21

原帖由 Jactry 于 2009-12-13 12:28 发表 http://www.linuxfans.org/bbs/images/common/back.gif
lz没用过wubi吗
wubi这是一种安装方式,他建了一个文件,挂载成分区,所以不用分区
安装完除了读写速度和物理机有区别,其他的可以说一模一样

wubi还真没用过,感觉麻烦就没用,有空试试:mrgreen:

haulm 发表于 2009-12-13 13:32:00

你要注意,读写grub的代码我虽然没有尝试,但我使用dd指令时尝试过grub的保存和写入,具体写入字节应该小于512字节,具体多少我要查下好象是 MBR前446字节,全部写入会出问题,因为里面可能还有硬盘分区的信息,512字节最后64个字节记录了分区的大小、类型,哪个是活动分区等等(具体结构请参考相关资料)。

whistler_wmz 发表于 2009-12-13 14:20:04

zy_sunshine 发表于 2009-12-13 18:44:06

回复 11# haulm 的帖子

恩,这个了解。。我以后的版本想要加功能,就是分析mbr结构的东西,512个字节,怎么也分析明白了。

zy_sunshine 发表于 2009-12-13 18:45:52

回复 11# haulm 的帖子

网速慢死了,程序就是传不上去了。。。。。发个帖子都发重了

[ 本帖最后由 zy_sunshine 于 2009-12-13 19:08 编辑 ]

sejishikong 发表于 2009-12-13 18:59:33

原帖由 Jactry 于 2009-12-13 12:28 发表 http://www.linuxfans.org/bbs/images/common/back.gif
lz没用过wubi吗
wubi这是一种安装方式,他建了一个文件,挂载成分区,所以不用分区
安装完除了读写速度和物理机有区别,其他的可以说一模一样
其实不一样的。你仔细用过就知道了。
页: [1] 2 3 4 5 6
查看完整版本: grub installer for MagicLinux硬盘安装 0.1.0版发布