获得自己电脑硬盘的分区信息,代码如下:
int DiskIndex=m_ComboUsbDrive.GetCurSel();
CString DiskFileName;
DiskFileName.Format(L"\\\\.\\PhysicalDrive%d",DiskIndex);
//AfxMessageBox(DiskFileName); HANDLE hDisk=::CreateFile(DiskFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if (hDisk==INVALID_HANDLE_VALUE)
{   
AfxMessageBox(L"打开磁盘驱动器失败:"+GetLastError());
return;
}
     //获取分区信息
DWORD DiskBytesRead=0;
DWORD DiskBufferSize=sizeof(DRIVE_LAYOUT_INFORMATION_EX)+sizeof(PARTITION_INFORMATION_EX)*104;
PDRIVE_LAYOUT_INFORMATION pDiskPartInfo=(PDRIVE_LAYOUT_INFORMATION_EX)malloc(DiskBufferSize);
//DRIVE_LAYOUT_INFORMATION_EX DiskPartInfo[20];
//DWORD DiskBufferSize=sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20;
memset(pDiskPartInfo,0,DiskBufferSize);//清空缓冲区
if (pDiskPartInfo==NULL)
{
AfxMessageBox(L"缓冲区分配出错:"+GetLastError());
return;
}
 

BOOL ret=::DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,
                       NULL,NULL,
   (LPVOID)pDiskPartInfo,
   DiskBufferSize,
   &DiskBytesRead,
   NULL);
DWORD temp;
if (!ret)
{
temp=GetLastError();
}最后这个pDiskPartInfo这个变量里面应该保存了硬盘的分区信息,
debug的情况如下:这个PartitionStyle的值为0,按照MSDN的说法,为0的话是磁盘分区不可用,这个是我笔记本的硬盘,分了3个区,怎么回事,下面的PartitionCount的值也不对,有了解的么?谢了
磁盘disklayout

解决方案 »

  1.   

    PDRIVE_LAYOUT_INFORMATION pDiskPartInfo=(PDRIVE_LAYOUT_INFORMATION_EX)malloc(DiskBufferSize);
    这句代码有错哦!
    而且,PartitionStyle为0也不是不可用哦,原话:
    PartitionCount值原文:
      

  2.   


    PDRIVE_LAYOUT_INFORMATION pDiskPartInfo
        =(PDRIVE_LAYOUT_INFORMATION_EX)malloc(DiskBufferSize);到底是PDRIVE_LAYOUT_INFORMATION pDiskPartInfo还是PDRIVE_LAYOUT_INFORMATION_EX pDiskPartInfo能否仔细点儿?
      

  3.   

    这个是我贴错了,不好意思,我重新调试了下,发现通过PartionEntry确实可以得到每个分区的一些信息,现在就是有一些疑问,想请教下
    1.PartitionCount倒是是不是表示整个硬盘的分区数目,在我这这个数字一直是4。
    2.在PartitionEntry里面的PartitionStyle一直是PARTITION_STYTL_MBR,这个值是代表这个分区可以引导的意思么?不好意思,麻烦你了,对这个API不是很熟悉
      

  4.   

    1.PartitionCount表示分区数。如果硬盘是MRB,这个值始终是4的倍数。
    2.PARTITION_STYTL_MBR表示主启动分区。
    我只能这么解释,MSDN说的也不明白。
    我电脑上刚好4个分区,测试出来的PartitionCount刚好是4。
    你可以打开windows的磁盘管理来对照看看测试结果。