#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
typedef struct _VOLUME_INFO
{
TCHAR chFlag;
DWORD dwDiskNumber;
DWORD dwPartitionNumber;
}VOLUME_INFO, *PVOLUME_INFO;
//chFlag为对应磁盘的盘符
BOOL GetVolumeInfo(IN TCHAR chFlag, OUT PVOLUME_INFO pVolumeInfo)
{
TCHAR szVol[] = { '\\', '\\', '.', '\\', chFlag, ':', 0 };
HANDLE hDrv = CreateFile(szVol, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE == hDrv)
{
return FALSE;
}
//--
VOLUME_DISK_EXTENTS vde;
DWORD dwBytes;
BOOL bRet = DeviceIoControl(hDrv, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &vde, sizeof(vde), &dwBytes, NULL);
if (!bRet)
{
CloseHandle(hDrv);
return FALSE;
}
//--
pVolumeInfo->chFlag = chFlag; //分区盘符
pVolumeInfo->dwDiskNumber = vde.Extents->DiskNumber; //分区所在硬盘编号,基于0,第一个硬盘的编号为0,第二个硬件的编号为1,如此类推
//------------------------
dwBytes = 0;
PARTITION_INFORMATION pinfo = { 0 };
bRet = DeviceIoControl((HANDLE)hDrv, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, &pinfo, sizeof(pinfo), &dwBytes, NULL);
if (!bRet) {
CloseHandle(hDrv);
return FALSE;
}
//--
pVolumeInfo->dwPartitionNumber = pinfo.PartitionNumber; //分区编号,从1开始编号;
//--
CloseHandle(hDrv);
//------------------------
return TRUE;
}
int main()
{
for (TCHAR chFlag = 'A'; chFlag <= 'Z'; ++chFlag)
{
VOLUME_INFO pi = { 0 };
GetVolumeInfo(chFlag, &pi);
}
}