转载的 ,出处忘记了,不好意思
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
typedef struct _VOLUME_INFO
{
TCHAR chFlag;
DWORD dwDiskNumber;
DWORD dwPartitionNumber;
}VOLUME_INFO, *PVOLUME_INFO;
BOOL GetVolumeInfo(IN TCHAR chFlag, OUT PVOLUME_INFO pVolumeInfo)
{
pVolumeInfo->chFlag = chFlag; //分区盘符
char 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 = {0};
DWORD dwBytes = 0;
BOOL bRet = DeviceIoControl(
hDrv,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL,
0,
&vde,
sizeof(vde),
&dwBytes,
NULL);
if (!bRet)
{
CloseHandle(hDrv);
return FALSE;
}
pVolumeInfo->dwDiskNumber = vde.Extents->DiskNumber; //分区所在硬盘编号,基于0
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;
CloseHandle(hDrv);
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
char chFlag = 'C';
VOLUME_INFO pi = {0};
GetVolumeInfo(chFlag, &pi);
printf("DiskNumber is %d, PartitionNumber is %d\n",pi.dwDiskNumber,pi.dwPartitionNumber);
return 0;
}