IOCT_disk取得硬盘分区号和硬盘号,如何求得其物理顺序? 解决篇

以下只提供思路:并已经测试成功;

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个。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值