怎样取得Windows的启动分区?

wshb007   2008-7-14 20:15 楼主
我的机器上有两个硬盘
我的boot.ini:
[boot loader]
timeout=6
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(1)partition(2)\WINDOWS="Microsoft Windows XP Professional @ test" /noexecute=optin /fastdetect

这里面有两个硬盘(rdisk0和rdisk1), 这两个盘都有可启动的分区,rdisk1上的WindowsXP被安装在了partition(2)。
multi(0)disk(0)rdisk(0)partition(1)\和multi(0)disk(0)rdisk(1)partition(2)\都有 boot.ini ,实际上起作用的是 multi(0)disk(0)rdisk(0)partition(1)\boot.ini ,

C:盘不一定是启动盘, 我的分区为:
(hd0,1) H: (boot partition)
(hd1,1) C:
(hd1,2) D: (bootable partition)

环境变量 %SystemDrive% 和 %HOMEDRIVE% 都是指向 d:, %SystemRoot%=D:\windows, 看来是不可靠的

IOCTL_DISK_GET_PARTITION_INFO 可以找到这两个启动区(d:和h,但是我的启动区实际上是 (hd0,1) H:
Windows XP/2003/2000, VC2005 怎么编程取得实际上起作用的启动盘呢?

回复评论 (20)

GetWindowsDirectory,得到Windows的路径,就相当于得到了对应分区了。
   
  The   GetWindowsDirectory   function   retrieves   the   path   of   the   Windows   directory.   The   Windows   directory   contains   such   files   as   applications,   initialization   files,   and   help   files.     
   
  This   function   is   provided   primarily   for   compatibility.   Applications   should   store   code   in   the   Program   Files   folder   and   persistent   data   in   the   Application   Data   folder   in   the   user's   profile.   For   more   information,   see   ShGetFolderPath.     
   
   
  UINT   GetWindowsDirectory(   
      LPTSTR   lpBuffer,   
      UINT   uSize   
  );   
   
  Parameters   
  lpBuffer     
  [out]   Pointer   to   the   buffer   to   receive   the   null-terminated   string   containing   the   path.   This   path   does   not   end   with   a   backslash   unless   the   Windows   directory   is   the   root   directory.   For   example,   if   the   Windows   directory   is   named   Windows   on   drive   C,   the   path   of   the   Windows   directory   retrieved   by   this   function   is   C:\Windows.   If   the   system   was   installed   in   the   root   directory   of   drive   C,   the   path   retrieved   is   C:\.     
  uSize     
  [in]   Maximum   size   of   the   buffer   specified   by   the   lpBuffer   parameter,   in   TCHARs.   This   value   should   be   set   to   MAX_PATH.     
点赞  2008-7-14 22:00
同上,获得系统目录,再根据系统目录的盘符来确定是哪个硬盘的哪个分区。
点赞  2008-7-14 23:28
GetWindowsDirectory 会得到 %SystemRoot%=D:\windows , 在 hd1,2
实际上我的启动盘是 H: , 在 hd0,1
点赞  2008-7-15 09:03
我是拿一块硬盘启动了另一块硬盘上的 Windows ,才会有这种奇怪的现象。
没找到相应的API,但是应该有一套解决办法,我试过了,Windows2003的安装程序能正确找到这个启动盘,并且改写了正确的 boot.ini
点赞  2008-7-15 09:08
“拿一块硬盘启动了另一块硬盘上的 Windows ”应该是暂时性的吧,难道你的设备或者你的用户都会这么做吗?
点赞  2008-7-15 09:32
引用: 引用 5 楼 shuiyan 的回复:
“拿一块硬盘启动了另一块硬盘上的 Windows ”应该是暂时性的吧,难道你的设备或者你的用户都会这么做吗?

确实很少见,只是想找个完美解决的方案,不行的话只能用判断 Windows 所在盘的方法了
点赞  2008-7-15 13:58
去BIOS找启动信息,应该能找到,但是我不会,而且市面上的BIOS如此多,难免有兼容问题
点赞  2008-7-15 14:01
加了100分,大家帮帮忙
点赞  2008-7-15 14:25
你在cmd模式下,敲set,有SystemDriver, SystemRoot,看看什么结果。
点赞  2008-7-15 15:11
引用: 引用 9 楼 shuiyan 的回复:
你在cmd模式下,敲set,有SystemDriver, SystemRoot,看看什么结果。

环境变量   %SystemDrive%   和   %HOMEDRIVE%   都是指向   d:,   %SystemRoot%=D:\windows,   看来是不可靠的
点赞  2008-7-15 15:13
对于多硬盘的情况,没有准确获得启动盘的方法。你可以试试看启动硬盘是不是PhysicalDrive0,再取分区表中的Active分区。
点赞  2008-7-15 15:19
奇迹,指向D:,却从H引导,不知道Windows是怎么设计的。你还是放弃这种方式吧。

莫非你这个硬盘(H所在的这个盘)原来也就是从D引导,所以注册表中得到的都是D?
点赞  2008-7-15 15:21
原来是一块硬盘的,从D:引导, 后来加了块硬盘,就一个分区H:把 H: 配置成引导盘, 改了 H:\boot.ini, 发现这样也能正常启动, 这样就取不出真正的引导盘了. PhysicalDrive0 是 IDE0, 在我这是 Windows 所在硬盘, 却不是引导盘.
点赞  2008-7-15 22:46
UP↑↑↑
点赞  2008-7-16 13:33
你要取得启动分区的目的是什么?从其它方面再想办法吧。
点赞  2008-7-16 18:32
目的是修改BOOT.ini, 加入一项, 加载WinPE的启动项, 就像网上能找到的很多WinPE一样, 但是好像没有能正常找到这个引导区的
点赞  2008-7-17 11:20
那应该是把所有应用的Active分区中的boot.ini(如果存在)都改一下,因为所有硬盘都可以用来启动。
点赞  2008-7-17 12:39
引用: 引用 17 楼 cnzdgs 的回复:
那应该是把所有应用的Active分区中的boot.ini(如果存在)都改一下,因为所有硬盘都可以用来启动。

那样我就要在每个Active分区都加一个WinPE的文件夹才能启动

有能找到真正引导区的方案吗?
点赞  2008-7-18 10:30
很多主板的BIOS在启动时按F8可以选择从哪个硬盘启动,只该一个硬盘的Active分区肯定没法支持所有情况。我以前做过类似项目,做法是只处理第1个物理硬盘(按接口顺序),其它情况就不考虑了。
点赞  2008-7-18 13:36
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复