若我的小家

-编程,读书,感悟,旅游,设计
posts - 21, comments - 0, trackbacks - 0, articles - 0

用DeviceIoControl获取系统磁盘信息

Posted on 2008-09-23 13:19 若我 阅读(4564) 评论(0)  编辑 收藏 引用

代码:
#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;
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理