获取物理磁盘和移动磁盘信息
2013-04-13 19:25
435 查看
class CPhysicalDriver { public: void mfGetSerialNumber(int); //序列号 serial number BOOL mfGetCapacity(int); //容量 capacity void mfGetLogicalNum(); void mfSetLogicalNum(); BOOL mfGetDerverDeteilInfo(int); public: CPhysicalDriver(); CPhysicalDriver(int miNumber); void mfGetPhysicalInfo(int); private: void mfSetPhysicalBaseInfo(int); public: double mdPhysicalCapacity; int miPhysicalNumber; int miLogicalNum; char macPhysicalSerial[50]; //用于磁盘信息 显示 硬盘显示序列号 移动磁盘显示 驱动名称 int miPhysicalTypeFlag; //0 硬盘 1 移动磁盘 char macPhysicalName[20]; char macPhysicalLogicalTable[26]; };CPhysicalDriver::CPhysicalDriver() { mdPhysicalCapacity =0; miPhysicalNumber =0; miLogicalNum =0; miPhysicalTypeFlag =-1; memset(macPhysicalName,0,sizeof(macPhysicalName)); memset(macPhysicalSerial,0,sizeof(macPhysicalSerial)); } void CPhysicalDriver::mfSetPhysicalBaseInfo(int miNumber) { this->miPhysicalNumber =miNumber; sprintf(this->macPhysicalName,"\\\\.\\physicaldrive%d",miNumber); } void CPhysicalDriver::mfGetSerialNumber(int miNumber) { miPhysicalNumber =miNumber; char mcPhysicalTempName[20]={0}; sprintf(mcPhysicalTempName,"\\\\.\\physicaldrive%d",miNumber); HANDLE mHandler =CreateFileA(mcPhysicalTempName, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL); if (mHandler == INVALID_HANDLE_VALUE) { printf(" open error"); return ; } SENDCMDINPARAMS inParam = { 0 }; char szOutput[sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1] = { 0 }; DWORD dwRet = 0; inParam.cBufferSize = IDENTIFY_BUFFER_SIZE; inParam.bDriveNumber = miPhysicalNumber; inParam.irDriveRegs.bFeaturesReg = 0; inParam.irDriveRegs.bSectorCountReg = 1; inParam.irDriveRegs.bSectorNumberReg = 1; inParam.irDriveRegs.bCylLowReg = 0; inParam.irDriveRegs.bCylHighReg = 0; inParam.irDriveRegs.bDriveHeadReg = (miPhysicalNumber & 1) ? 0xB0 : 0xA0; // 主盘和从盘所对应的值是不一样的 inParam.irDriveRegs.bCommandReg = ID_CMD; if(::DeviceIoControl(mHandler, SMART_RCV_DRIVE_DATA, &inParam, sizeof(inParam)-1, szOutput, sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1, &dwRet, NULL)) { SIDSECTOR msDrivesInfo; memset(&msDrivesInfo, 0, sizeof(msDrivesInfo)); memcpy(&msDrivesInfo, ((SENDCMDOUTPARAMS*)szOutput)->bBuffer, sizeof(msDrivesInfo)); char szSerialNumber[SERIALNUMBER_LEN] = { 0 }; // 序列号 //获取序列号 { char szTemp[SERIALNUMBER_LEN] = { 0 }; for (int i=0, len=SERIALNUMBER_LEN-1; i<len; i+=2) { szTemp[i+1] = msDrivesInfo.sSerialNumber[i]; szTemp[i] = msDrivesInfo.sSerialNumber[i+1]; } for (int i=0, i_Dst=0; i<SERIALNUMBER_LEN; i++) { if (szTemp[i]>32 && szTemp[i]<127) szSerialNumber[i_Dst++] = szTemp[i]; } } strncpy(macPhysicalSerial, szSerialNumber,strlen(szSerialNumber)); } } BOOL CPhysicalDriver::mfGetCapacity(int miNumber) { DISK_GEOMETRY pdg; HANDLE hDevice; // handle to the drive to be examined BOOL bResult; // results flag DWORD junk; // discard results char mcPhysicalTempBuffer[30]={0}; sprintf(mcPhysicalTempBuffer,"\\\\.\\physicaldrive%d",miNumber); hDevice = CreateFileA(mcPhysicalTempBuffer, // drive to open 0, // no access to the drive FILE_SHARE_READ | // share mode FILE_SHARE_WRITE, NULL, // default security attributes OPEN_EXISTING, // disposition 0, // file attributes NULL); // do not copy file attributes if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive { return (FALSE); } bResult = DeviceIoControl(hDevice, // device to be queried IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform NULL, 0, // no input buffer &pdg, sizeof(pdg), // output buffer &junk, // # bytes returned (LPOVERLAPPED) NULL); // synchronous I/O CloseHandle(hDevice); // 设置磁盘的类型 if(pdg.MediaType == RemovableMedia) miPhysicalTypeFlag =1; else if(pdg.MediaType == FixedMedia) miPhysicalTypeFlag =0; //容量 if(bResult) { mdPhysicalCapacity=pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder * (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector; } else { printf(" bResult error "); } return (bResult); } void CPhysicalDriver::mfGetPhysicalInfo(int miNumber) { mfSetPhysicalBaseInfo(miNumber); if(!this->mfGetCapacity(miNumber)) printf("get capacity error \n"); if(!this->mfGetDerverDeteilInfo(miNumber)) printf("get dervershow info error \n"); } BOOL CPhysicalDriver::mfGetDerverDeteilInfo(int miNumber) { PSTORAGE_DEVICE_DESCRIPTOR msDeverInfo; msDeverInfo=(PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; msDeverInfo->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; STORAGE_PROPERTY_QUERY Query; // 查询输入参数 DWORD dwOutBytes; // IOCTL输出数据长度 BOOL bResult; // IOCTL返回值 char *mpUsbInfo; char mcPhysicalTempBuffer[30]={0}; sprintf(mcPhysicalTempBuffer,"\\\\.\\physicaldrive%d",miNumber); HANDLE hDevice = CreateFileA(mcPhysicalTempBuffer, // drive to open 0, // no access to the drive FILE_SHARE_READ | // share mode FILE_SHARE_WRITE, NULL, // default security attributes OPEN_EXISTING, // disposition 0, // file attributes NULL); // do not copy file attributes if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive { return (FALSE); } // 指定查询方式 Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; // 用IOCTL_STORAGE_QUERY_PROPERTY取设备属性信息 bResult = ::DeviceIoControl(hDevice, // 设备句柄 IOCTL_STORAGE_QUERY_PROPERTY, // 取设备属性信息 &Query, sizeof(STORAGE_PROPERTY_QUERY), // 输入数据缓冲区 msDeverInfo, msDeverInfo->Size, // 输出数据缓冲区 &dwOutBytes, // 输出数据长度 (LPOVERLAPPED)NULL); // 用同步I/O if(bResult) { mpUsbInfo =(char*)msDeverInfo; if(msDeverInfo->RemovableMedia) { if (!msDeverInfo->VendorIdOffset) //厂家设定值 偏移 { printf(" get VendorId error in the GetUsbInfo\n"); } if (!msDeverInfo->ProductIdOffset) //产品ID的偏移 { printf(" get ProductId error in the GetUsbInfo"); } sprintf(macPhysicalSerial,"%s %s %s",&mpUsbInfo[msDeverInfo->VendorIdOffset],&mpUsbInfo[msDeverInfo->ProductIdOffset],&mpUsbInfo[msDeverInfo->SerialNumberOffset]); } else { if(!msDeverInfo->SerialNumberOffset) { printf("get SerialNumber error in the GetUsbInfo"); } sprintf(macPhysicalSerial,"%s",&mpUsbInfo[msDeverInfo->ProductIdOffset]); } printf("%s ",macPhysicalSerial); return true; } else { return false; } } CPhysicalDriver::CPhysicalDriver(int miNumber) { mdPhysicalCapacity =0; miPhysicalNumber =miNumber; miLogicalNum =0; miPhysicalTypeFlag =-1; memset(macPhysicalName,0,sizeof(macPhysicalName)); memset(macPhysicalSerial,0,sizeof(macPhysicalSerial)); sprintf(macPhysicalName,"\\\\.\\physicaldrive%d",miNumber); } void CPhysicalDriver::mfSetLogicalNum() { miLogicalNum++; }
相关文章推荐
- 使用批处理+WMI获取指定文件或目录所在的物理磁盘信息
- C#获取物理磁盘信息
- 获取磁盘(本地磁盘和移动磁盘)信息的Java代码
- linux获取内存、cpu、负载、网口流量、磁盘信息
- WinAPI: GetDiskFreeSpaceEx - 获取磁盘容量信息
- python编程练习之四——获取系统内存、CPU、磁盘、平均负载信息并保存到数据库中
- C++ 通过WIN32 API 获取逻辑磁盘详细信息
- CPU,内存,磁盘,网卡信息获取
- 2014-06-06:IOCTL_STORAGE_GET_DEVICE_NUMBER获取磁盘信息如磁盘号、磁盘类型、分区号
- 学习c++一点一滴---获取所有本地磁盘信息
- windows的磁盘操作之三——获取和删除磁盘分区信息
- linux 获取文件系统信息(磁盘信息)
- snmpdf获取主机磁盘信息
- android上获取imsi码,判断运营商信息(移动,联通,电信)
- C++通过WIN32 API获取逻辑磁盘详细信息
- AppCan移动开发技巧:3步走,获取移动APP签名信息
- 在Windows下通过JConfig获取磁盘剩余空间信息(续)
- Windows下USB磁盘开发系列三:枚举系统中U盘、并获取其设备信息
- 获取磁盘空间信息(十四)
- C#获取CPU占用率、内存占用、磁盘占用、进程信息