苹果系统EFI分区的作用,还有多分区
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了苹果系统EFI分区的作用,还有多分区相关的知识,希望对你有一定的参考价值。
前几天装了一个苹果系统,我在MAC系统下给win系统划分了空间,然后按照提示选择从光驱启动,在里面我删除了EFI分区,然后利用WIN系统自带的分区多划分了D分区,按照提示装好了,我用的是苹果超薄的笔记本,带的一个U盘一样的东西,计划开始按BOOT CAMP ,但是插在USB口上能显示出一个光驱一样的标志来,但是里面读不出东西。(这个东西是好的,因为我重新启动安装ALT的时候能用它安装MAC系统)然后又拿出以前的MAC的盘装丵BOOT CAMP ,也是识别不了,也许是格式不支持吧,但是我以前买电脑的时候人家就是用这盘按BOOT CAMP 。
我现在的疑问是,删除EFI分区是不是影响到了这个功能,其他的吧,都正常,可以在开始的时候按住ALT选择启动盘,所以问下高手,删除EFI分区对安BOOT CAMP 有影响没(用苹果自带的盘,因为这个盘在普通电脑下也不识别)
如果有可能的话,在告诉下不删除EFI分区,多给WIN系统多分区的办法,WIN系统最多支持几个分区
回答对的情况下在多+100分
还有我在苹果点见他们运行一个什么命令就吧磁盘给分区了,知道的可以在补充一下
会自动教你怎么安装XP,分区也是一样在里面。
就用第一个啊!,先移去 windows分区。不过Bootcamp安装出来的只有一个C盘的。如果你要多分区,那么必须要删除掉Mac的隐藏的EFI 200M分区。
想一次成功安装多分区的Windows XP的话,请先准备以下内容:
1、 Windows XP with SP2安装盘与序列号——最好是正版,可以到网上下载ISO,然后自己刻录,核心在于可以使用XP自身光盘引导启动(不是盗版的启动一个DOS然后在 DOS界面下运行WINNT那种!),另外必须要安装同时能够打SP2补丁,否则驱动不可以安装而且系统运行一段时间后蓝屏,极不稳定!序列号可以下载一个序列号生成工具,随机生成一个,为了方便激活!应该可以使用上海大客户版的XP,但是我手中的上海大客户版是SP1版本,安装后不能再打SP2
2、 BOOT CAMP软件——我使用1.3版本,大家去苹果网站下载即可,我不再多说,1.3版本修正了一些驱动错误等,能让机器更稳定一些;
3、 空白CD-RW刻录盘一张——刻录MAC机Windows驱动
准备好以上内容后,可以正式开始工作,请严格按照我的操作进行,否则安装后XP无法启动!
1、 下载BOOT CAMP 1.3,在MAC X中安装到“应用程序-实用程序”后,重新启动操作系统
2、 在重启后进入“应用程序-实用程序”后运行BOOT CAMP助手,按照提示刻录Windows驱动光盘(如果1步没有重启系统容易不认刻录盘,无法刻录),如果出现不认盘的情况,将系统重启后再次运行BOOT CAMP助手!
3、刻录好光盘以后开始划分硬盘空间了,通过拖动中间位置的移动条分配两个系统分别占用空间,我给Windows划分了硬盘的一半,也就是30G的空间——这里的空间指未来Windows可以正常利用访问的所有磁盘空间,也就是未来在Windows下可划分C、D、E三个盘符,C是8G,D、E分别是12G,这样您在这就应该划分32G空间给Windows!!!
4、 接下来将可以光盘引导安装的Windows XP安装光盘放入光驱,点安装即可
5、 接下来三步极重要:系统重启后进入XP的安装界面,首先系统默认的C就是你划分出来的磁盘空间(30G),因为需要安装多个分区,重新划分C的空间!
6、 删除现在的C盘,删除200M的另外一个未知分区,别问我为什么,这么做就对了!
7、 在空白的大空间(30多G)上新建分区,新建分区的大小就是未来C盘的大小(如8G)
8、 新建后不要再新建任何的分区(未来D、E),切记,切记!如果在这里新建了其他分区,XP安装过程里第一次重新启动后将提示缺少获hl.dll文件而导致安装失败!
9、然后在新建的C分区下安装XP,选择FAT格式(快)的选项格式化C盘后,就按照正常XP的安装步骤一步一步进行即可,在此注意XP安装过程里重启过程中 XP安装光盘无法取出,启动是自动读XP光盘时提示Press any key for boot from CD……,这是不要按任何按键即可从硬盘启动继续安装了!!!
10、 如果第一次重启正常,那么恭喜你,成功了一大半了!
11、 XP正常启动以后提示发现新硬件,不要管他,您现在放入刚刚刻录的驱动盘即可,注意因为没有驱动,右上角退盘键不起作用,您可以打开我的电脑在光盘上点右键—弹出光盘即可!
12、 推入光盘后自动运行安装程序,如果您的Windows不是打包SP2的版本是无法安装的!
13、 安装好驱动程序后,重新启动电脑
14、 启动后进入控制面板—计算机管理—磁盘管理
15、 将光盘D调整盘符到F!
16、您可以看到磁盘管理中磁盘1被划分了几块,还有一块空白空间(例如当时考虑的D、E共24G),将此空间(所有24G)划分为从盘空间,然后再从盘空间上划分12G逻辑盘盘符为D,12G逻辑盘,盘符为E!应该还可以将磁盘划为多个主盘,我没有试。在D或者E上应该还可以重复以上动作,能够同时再安装一套 Vista,或另外一套XP!!!
至此为止,恭喜你,大功告成!可以在机器启动时按住Option键选择启动MAC X或XP
Windows XP多盘符的系统可以正常使用了!
这个方法是可行的,我亲自试过。这个方法有2个关键的操作:
1、在安装windows xp/vista 时,要删掉分区表中嘴上面的那个200MB的分区(这个应该是EFI区;apple的Mac OS X 使用这个分区管理磁盘);
2、删掉bootcamp分配的那个区,然后新建一个分区,作为C盘(C盘后面留有“未用空间”,以建立D盘E盘等)。
另,作者在步骤8中说不要继续建D盘或者E盘(D盘E盘留到windows安装好之后再建),我觉得在步骤8新建D盘等等也是没问题等,因为EFI等信息(位于第一个200Mb等分区中)已经删除,因此建D盘E盘并不影响windows等安装。
追问
分区的这个问题我是明白了,为什么我在装机店他们就是直接用盘装的bootcamp呢,在win系统下,
还有那个驱动是重哪儿找啊,我知道苹果带的两张盘,一张是苹果系统盘,另一张是bootcamp的盘!那盘里是不是还有驱动呢
参考资料:http://support.apple.com/zh_CN/downloads/#macoscomponents
参考技术B 你可以去苹果官网上下载一个3.2版本的bootcamp,在windows系统里安装bootcamp就好。Windows没有安装Bootcamp是没法打开HFS+的苹果盘的。Bootcamp就是苹果所有的硬件在windows里的驱动,也包括对HFS+的识别。使用MBR分区表的单块硬盘最多可被Windows系统分4个主分区。 参考资料:http://support.apple.com/zh_CN/downloads/#macoscomponents 参考技术C 删除EFI最简单的方法是Win7 下面输入命令:C:\>diskpart
Microsoft DiskPart 版本 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
在计算机上: MYWIN7
DISKPART> list disk
磁盘 ### 状态 大小 可用 Dyn Gpt
-------- ------------- ------- ------- --- ---
磁盘 0 联机 931 GB 5120 KB
磁盘 1 联机 1397 GB 1024 KB
磁盘 2 联机 233 GB 116 GB *
DISKPART> select disk 2
磁盘 2 现在是所选磁盘。
DISKPART> list partition
分区 ### 类型 大小 偏移量
------------- ---------------- ------- -------
分区 1 系统 200 MB 20 KB
分区 2 主要 117 GB 201 MB
DISKPART> clean
DiskPart 成功地清除了磁盘。
DISKPART>
或者用第三方分区软件,不管Win xp 还是 win7 32 64可以用 EASEUS Partition Manager Software
Partition Wizard Home Edition 参考技术D 去论坛上找教程吧
FindFirstVolume 不返回 EFI 系统分区
【中文标题】FindFirstVolume 不返回 EFI 系统分区【英文标题】:FindFirstVolume does not return EFI system partition 【发布时间】:2017-03-05 15:54:17 【问题描述】:我正在使用 FindFirstVolume/FindNextVolume 来获取机器上所有卷的列表。这工作得很好,但奇怪的是,由于某种原因,EFI 系统分区被跳过了。另一方面,Diskpart 返回 EFI 系统分区,磁盘管理 UI 也会显示它。
这是 diskpart 的输出:
DISKPART> list volume
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 C NTFS Partition 476 GB Healthy Boot
Volume 1 Recovery NTFS Partition 450 MB Healthy Hidden
Volume 2 FAT32 Partition 100 MB Healthy System
Volume 3 D Data NTFS Partition 953 GB Healthy
Volume 4 E ESD-USB FAT32 Removable 14 GB Healthy
在该列表中,EFI 系统分区是第 2 卷。
FindFirstVolume/FindNextVolume 给我其他四个卷,但省略 EFI 系统分区。
任何想法如何获取 EFI 系统分区的卷 GUID 路径或以编程方式访问它的其他方式?
【问题讨论】:
***.com/questions/35102053/… 可能会给你一些想法 您是否以提升的权限运行?我不确切知道 Windows 如何保护 EFI 分区免受非特权用户的攻击,但它可能会导致在枚举时跳过该卷。 @HarryJohnston:是的,即使是本地系统 @HarryJohnston 我找到了分区属性 GPT_BASIC_DATA_ATTRIBUTE_HIDDEN 的描述。根据 MSDN,FindFirstVolume 会忽略具有该属性的分区。 EFI系统分区没有设置隐藏属性,但显然也是如此。来源:msdn.microsoft.com/en-us/library/windows/desktop/… Find*Volume internal sendIOCTL_MOUNTMGR_QUERY_POINTS
to mountmgr MOUNTMGR_DEVICE_NAME - 结果仅列出已安装的卷。 EFI 或 RAW 卷(分区)通常不挂载 - 所以不在 mountmgr 列表中。这与线程权限无关
【参考方案1】:
volume GUID path(即\??\Volume..)如果不是由FindFirstVolume
/FindNextVolume
返回则不存在,但我们可以通过不同的方式枚举系统中的所有卷。我们说可以使用Virtual Disk Service com api。 DISKPART> list volume
正是使用这个。另一种方式(更“低”和更快) - 使用 CM_Get_Device_ID_ListW 和 pszFilter = "71a27cdd-812a-11d0-bec7-08002be2092f"(在 devguid.h
中查看 GUID_DEVCLASS_VOLUME
)而不是通过 @987654323 获取设备实例句柄@ 并使用CM_Get_DevNode_PropertyW 查询DEVPKEY_Device_PDOName - 我们得到了可以在ZwOpenFile 中使用的字符串(如\Device\HarddiskVolume<X>
),然后使用一些ioctls(IOCTL_DISK_GET_PARTITION_INFO_EX 和其他)来获取卷属性。代码示例:
#include <initguid.h>
#include <cfgmgr32.h>
#include <devguid.h>
#include <devpkey.h>
#include <diskguid.h>
void DumpVolume(HANDLE hFile);
void VolEnum()
STATIC_WSTRING(DEVCLASS_VOLUME, "71a27cdd-812a-11d0-bec7-08002be2092f");
enum flags = CM_GETIDLIST_FILTER_CLASS|CM_GETIDLIST_FILTER_PRESENT ;
ULONG len;
ULONG cb = 0, rcb = 64;
HANDLE hFile;
IO_STATUS_BLOCK iosb;
UNICODE_STRING ObjectName;
OBJECT_ATTRIBUTES oa = sizeof(oa), 0, &ObjectName, OBJ_CASE_INSENSITIVE ;
if (!CM_Get_Device_ID_List_SizeW(&len, DEVCLASS_VOLUME, flags))
PWSTR buf = (PWSTR)alloca(len << 1);
if (!CM_Get_Device_ID_ListW(DEVCLASS_VOLUME, buf, len, flags))
PVOID stack = buf;
while (*buf)
DbgPrint("%S\n", buf);
DEVINST dnDevInst;
if (!CM_Locate_DevNodeW(&dnDevInst, buf, CM_LOCATE_DEVNODE_NORMAL))
DEVPROPTYPE PropertyType;
int err;
union
PVOID pv;
PWSTR sz;
PBYTE pb;
;
do
if (cb < rcb)
rcb = cb = RtlPointerToOffset(pv = alloca(rcb - cb), stack);
if (!(err = CM_Get_DevNode_PropertyW(dnDevInst, &DEVPKEY_Device_PDOName, &PropertyType, pb, &rcb, 0)))
if (PropertyType == DEVPROP_TYPE_STRING)
DbgPrint("%S\n", sz);
RtlInitUnicodeString(&ObjectName, sz);
if (0 <= ZwOpenFile(&hFile, FILE_GENERIC_READ, &oa, &iosb, FILE_SHARE_VALID_FLAGS, 0))
DumpVolume(hFile);
ZwClose(hFile);
while (err == CR_BUFFER_SMALL);
buf += 1 + wcslen(buf);
void DumpVolume(HANDLE hFile)
NTSTATUS status;
PARTITION_INFORMATION_EX pi;
IO_STATUS_BLOCK iosb;
if (0 <= (status = ZwDeviceIoControlFile(hFile, 0, 0, 0, &iosb, IOCTL_DISK_GET_PARTITION_INFO_EX, 0, 0, &pi, sizeof(pi))))
CHAR PartitionName[40], *szPartitionName;
PCSTR szps = "??";
switch (pi.PartitionStyle)
case PARTITION_STYLE_MBR: szps = "MBR";
break;
case PARTITION_STYLE_GPT: szps = "GPT";
break;
DbgPrint("%u %s %I64u(%I64x) %I64u ",
pi.PartitionNumber,
szps,
pi.StartingOffset.QuadPart, pi.StartingOffset.QuadPart,
pi.PartitionLength.QuadPart);
switch (pi.PartitionStyle)
case PARTITION_STYLE_MBR:
DbgPrint("type=%x boot=%x", pi.Mbr.PartitionType, pi.Mbr.BootIndicator);
break;
case PARTITION_STYLE_GPT:
if (IsEqualGUID(pi.Gpt.PartitionType, PARTITION_ENTRY_UNUSED_GUID))
szPartitionName = "UNUSED";
else if (IsEqualGUID(pi.Gpt.PartitionType, PARTITION_SYSTEM_GUID))
szPartitionName = "SYSTEM";
else if (IsEqualGUID(pi.Gpt.PartitionType, PARTITION_MSFT_RESERVED_GUID))
szPartitionName = "RESERVED";
else if (IsEqualGUID(pi.Gpt.PartitionType, PARTITION_BASIC_DATA_GUID))
szPartitionName = "DATA";
else if (IsEqualGUID(pi.Gpt.PartitionType, PARTITION_MSFT_RECOVERY_GUID))
szPartitionName = "RECOVERY";
else if (IsEqualGUID(pi.Gpt.PartitionType, PARTITION_MSFT_SNAPSHOT_GUID))
szPartitionName = "SNAPSHOT";
else
sprintf(szPartitionName = PartitionName, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
pi.Gpt.PartitionType.Data1,
pi.Gpt.PartitionType.Data2,
pi.Gpt.PartitionType.Data3,
pi.Gpt.PartitionType.Data4[0],
pi.Gpt.PartitionType.Data4[1],
pi.Gpt.PartitionType.Data4[2],
pi.Gpt.PartitionType.Data4[3],
pi.Gpt.PartitionType.Data4[4],
pi.Gpt.PartitionType.Data4[5],
pi.Gpt.PartitionType.Data4[6],
pi.Gpt.PartitionType.Data4[7]);
DbgPrint("[%s] %I64x \"%S\"",
szPartitionName,
pi.Gpt.Attributes,
pi.Gpt.Name);
break;
ULONG cb = FIELD_OFFSET(FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName[32]);
PFILE_FS_ATTRIBUTE_INFORMATION pffai = (PFILE_FS_ATTRIBUTE_INFORMATION)alloca(cb);
switch (ZwQueryVolumeInformationFile(hFile, &iosb, pffai, cb, FileFsAttributeInformation))
case STATUS_SUCCESS:
case STATUS_BUFFER_OVERFLOW:
DbgPrint(" \"%.*S\"", pffai->FileSystemNameLength >> 1 , pffai->FileSystemName);
break;
DbgPrint("\n");
else
DbgPrint("status=%x\n", status);
和调试输出
STORAGE\Volume\d2bfdb30-4d04-11e5-824e-806e6f6e6963#0000000012D00000
\Device\HarddiskVolume2
2 GPT 315621376(12d00000) 104857600 [SYSTEM] 8000000000000000 "EFI system partition" "FAT32"
STORAGE\Volume\d2bfdb30-4d04-11e5-824e-806e6f6e6963#0000000000100000
\Device\HarddiskVolume1
1 GPT 1048576(100000) 314572800 [RECOVERY] 8000000000000001 "Basic data partition" "NTFS"
STORAGE\Volume\d2bfdb30-4d04-11e5-824e-806e6f6e6963#0000000021100000
\Device\HarddiskVolume4
4 GPT 554696704(21100000) 255506513920 [DATA] 0 "Basic data partition" "NTFS"
STORAGE\Volume\d2bfdb30-4d04-11e5-824e-806e6f6e6963#0000000019100000
\Device\HarddiskVolume3
3 GPT 420478976(19100000) 134217728 [RESERVED] 8000000000000000 "Microsoft reserved partition" "RAW"
STORAGE\Volume\a4d55aa5-4d7f-11e5-8256-5cc5d4ea6270#0000000000007E00
\Device\HarddiskVolume5
1 MBR 32256(7e00) 32017013248 type=7 boot=1 "NTFS"
查看属性 - https://msdn.microsoft.com/en-us/library/windows/desktop/aa365449(v=vs.85).aspx
【讨论】:
非常有用,非常感谢!显然 CM_* 函数是唯一返回 EFI 系统分区(以及 RAW 分区)的函数。 SetupDi* 函数不这样做(我检查过)。以上是关于苹果系统EFI分区的作用,还有多分区的主要内容,如果未能解决你的问题,请参考以下文章