以下只提供思路:并已经测试成功;
1、在前篇的基础上继续:
2、给所有的分区分配盘符,包括EFI启动时的,EFI分区,MSR分区;(非必要条件)
3、取得硬盘数 DriverNum:=Countdisk();//取得硬盘数;
4、遍历所有的硬盘:
for i:=0 to DriverNum-1 do //硬盘号从0开始计数,分区号从1开始计数
begin
Driver:=getpartitonfromdiskid(inttostr(i) ); //通过自定义getpartitonfromdiskid取得当前指定硬盘下所有的分区(已分配盘符比如KDCL)
for kk:= 1 to driver.Length do //遍历各分取得各分区StartingOffset.QuadPart,并加到数组中;
begin
tempc:='\\.\'+driver[kk]+':' ;
hDevice := CreateFile(PChar(tempc), 0, FILE_SHARE_READ or FILE_SHARE_WRITE,nil, OPEN_EXISTING, 0, 0);
if hDevice <> INVALID_HANDLE_VALUE then
begin
if DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO_EX, nil, 0,
@PrtInformation, SizeOf(PrtInformation), BytesReturned, nil) =true then
a[i]:= PrtInformation.StartingOffset.QuadPart
end;
end;// for kk:= 1 to driver.Length do
end;//for i:=0 to DriverNum-1 do
5、对A[I]数组进行排序。
A[I]中的结果值可能如下:
A[0]=20480;
A[1]=90480;
A[2]=190480;
A[3]=590480;
6、取得分区值返回序号 :
再次通过CTEATEFILE 和DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO_EX
获得自己 的StartingOffset.QuadPart值,然后到A[i]数组中查找,找到是第几位就是第几分区了。OK
比如取得 D盘的StartingOffset.QuadPart为190480,A[2]当中的2就是表明了D盘在当前硬盘中的物理位置为第2+1个。
又比如取得C盘的StartingOffset.QuadPart为A[0]=20480,则A【0】表明C盘是在当前硬盘中的物理位置为第0+1个。