您的位置:首页 > 其它

获取物理磁盘和移动磁盘信息

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++;
}





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: