用DeviceIoControl获取系统磁盘信息

原文地址:http://www.cppblog.com/dingding/archive/2008/09/23/62570.html


代码:
#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
 SECURITY_ATTRIBUTES secStru;
 secStru.bInheritHandle=0;
 secStru.lpSecurityDescriptor=0;
 secStru.nLength=0; 
 HANDLE hDevice=CreateFile("\\\\.\\PhysicalDrive0",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

 if(hDevice==INVALID_HANDLE_VALUE)
 {
  return -1;
 }

 //DWORD outBuff[1000];
 GET_LENGTH_INFORMATION infoStruct;

 memset(&infoStruct,0,sizeof(infoStruct));
 DWORD bytesReturned;
 if(DeviceIoControl(hDevice,IOCTL_DISK_GET_LENGTH_INFO,NULL,0,&infoStruct,sizeof(infoStruct),&bytesReturned,NULL)==0)
 {
  cout<<"Failed to get disk information."<<endl;
  DWORD error;
  error=GetLastError();
  HRESULT hRe=HRESULT_FROM_WIN32(error);
  char errorData[10];
  sprintf(errorData,"%x",hRe);
  cout<<"Error code:"<</*hRe*/errorData<<endl;
  CloseHandle(hDevice);
  return -1;
 }

 DISK_GEOMETRY_EX geoStruct;
 memset(&geoStruct,0,sizeof(geoStruct));
 if(DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX ,NULL,0,&geoStruct,sizeof(geoStruct),&bytesReturned,NULL)==0)
 {
  cout<<"Failed to get disk information."<<endl;
  DWORD error;
  error=GetLastError();
  HRESULT hRe=HRESULT_FROM_WIN32(error);
  char errorData[10];
  sprintf(errorData,"%x",hRe);
  cout<<"Error code:"<</*hRe*/errorData<<endl;
  CloseHandle(hDevice);
  return -1;
 }

 cout<<"The disk's size is:"<<infoStruct.Length.QuadPart/1024/1024/1024<<" G Bytes."<<endl;
 cout<<"The disk's cylinder number:"<<geoStruct.Geometry.Cylinders.QuadPart<<endl;
 cout<<"The disk's media type:"<<geoStruct.Geometry.MediaType<<endl;
 cout<<"Number of tracks per cylinder:"<<geoStruct.Geometry.TracksPerCylinder<<endl;
 cout<<"Number of sectors per track:"<<geoStruct.Geometry.SectorsPerTrack<<endl;
 cout<<"Number of bytes per sector:"<<geoStruct.Geometry.BytesPerSector<<endl;

 PDISK_PARTITION_INFO  partitionInfo=DiskGeometryGetPartition(&geoStruct);

 DRIVE_LAYOUT_INFORMATION_EX layOutInfo[20];

 memset(&layOutInfo,0,sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20);

 //layOutInfo.PartitionEntry=*(new PARTITION_INFORMATION_EX[10]);

 if(DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,NULL,0,&layOutInfo,sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20,&bytesReturned,NULL)==0)
 {
  cout<<"Failed to get disk information."<<endl;
  DWORD error;
  error=GetLastError();
  HRESULT hRe=HRESULT_FROM_WIN32(error);
  char errorData[10];
  sprintf(errorData,"%x",hRe);
  cout<<"Error code:"<</*hRe*/errorData<<endl;
  CloseHandle(hDevice);
  return -1;
 }

 int partitionCount=layOutInfo[0].PartitionCount;
 cout<<"Number of partitions:"<<layOutInfo[0].PartitionCount<<endl;
 cout<<"Partitions' information:"<<endl;
 for(int i=0;i<partitionCount;i++)
 {
  //PDISK_PARTITION_INFO pParInfo=partitionInfo+i*sizeof(DISK_PARTITION_INFO);
  if(layOutInfo[i].PartitionEntry[0].PartitionNumber!=0)
  {
   cout<<"Partition "<<layOutInfo[i].PartitionEntry[0].PartitionNumber<<",  partition size is "<<layOutInfo[i].PartitionEntry[0].PartitionLength.QuadPart/1024/1024/1024<<" G Bytes, partition style is "<<layOutInfo[i].PartitionEntry[0].PartitionStyle<<endl;
  }
 }

 //cout<<"The type of partition:"<<((partitionInfo.PartitionStyle==PARTITION_STYLE_MBR) ?"MBR":((partitionInfo.PartitionStyle==PARTITION_STYLE_GPT )?"GPT":((partitionInfo.PartitionStyle==PARTITION_STYLE_RAW)?"RAW":"")))<<endl;

 CloseHandle(hDevice);

 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值