//
typedef struct _DRIVEATTRIBUTEHDR
{
//
WORD wRevision;
//
BYTE bData[1];
}
DRIVEATTRIBUTEHDR, *PDRIVEATTRIBUTEHDR, *LPDRIVEATTRIBUTEHDR;
// SMART
typedef struct _DRIVEATTRIBUTE
{
//
BYTE bAttrID;
// (, ..)
WORD wStatusFlags;
//
BYTE bAttrValue;
// , ,
BYTE bWorstValue;
// ,
BYTE bRawValue[6];
BYTE bReserved;
}
DRIVEATTRIBUTE, *PDRIVEATTRIBUTE, *LPDRIVEATTRIBUTE;
// Threshold ( ) SMART
typedef struct _ATTRTHRESHOLD
{
//
BYTE bAttrID;
//
BYTE bWarrantyThreshold;
BYTE bReserved[10];
}
ATTRTHRESHOLD, *PATTRTHRESHOLD, *LPATTRTHRESHOLD;
* This source code was highlighted with Source Code Highlighter .
HANDLE hDrive = CreateFile( "\\\\.\\PHYSICALDRIVE0" , GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
* This source code was highlighted with Source Code Highlighter .
SENDCMDINPARAMS cmdIn = {0};
//
cmdIn.cBufferSize = READ_ATTRIBUTE_BUFFER_SIZE;
// IDE
cmdIn.irDriveRegs.bCommandReg = SMART_CMD;
//
cmdIn.irDriveRegs.bFeaturesReg = READ_ATTRIBUTES;
// ,
cmdIn.irDriveRegs.bCylLowReg = SMART_CYL_LOW;
// ,
cmdIn.irDriveRegs.bCylHighReg = SMART_CYL_HI;
//
cmdIn.irDriveRegs.bSectorCountReg = 1;
//
cmdIn.irDriveRegs.bSectorNumberReg = 1;
// \ IDE
cmdIn.irDriveRegs.bDriveHeadReg = 0xA0 | (((BYTE)nDrive & 1) << 4);
* This source code was highlighted with Source Code Highlighter .
BYTE bOutAttributes[ sizeof (SENDCMDOUTPARAMS) + READ_ATTRIBUTE_BUFFER_SIZE - 1] = {0};
DeviceIoControl(hDrive, SMART_RCV_DRIVE_DATA, &cmdIn, sizeof (cmdIn), bOutAttributes, sizeof (bOutAttributes), &dwReturn, NULL);
* This source code was highlighted with Source Code Highlighter .
//
LPDRIVEATTRIBUTEHDR lpAttrHdr = (LPDRIVEATTRIBUTEHDR)(((LPSENDCMDOUTPARAMS)bOutAttributes)->bBuffer);
//
LPDRIVEATTRIBUTE lpAttr = (LPDRIVEATTRIBUTE)(lpAttrHdr->bData);
// -
// NUM_ATTRIBUTE_STRUCTS - SMART
// 30-
for ( int iAttr = 0; iAttr < NUM_ATTRIBUTE_STRUCTS; iAttr++)
{
}
* This source code was highlighted with Source Code Highlighter .
cmdIn.cBufferSize = READ_THRESHOLD_BUFFER_SIZE;
cmdIn.irDriveRegs.bFeaturesReg = READ_THRESHOLDS;
//
BYTE bOutThresholds[ sizeof (SENDCMDOUTPARAMS) + READ_THRESHOLD_BUFFER_SIZE - 1] = {0};
bResult = DeviceIoControl(drive, SMART_RCV_DRIVE_DATA, &cmdIn, sizeof (cmdIn), bOutThresholds, sizeof (bOutThresholds), &dwReturn, NULL);
//
LPDRIVEATTRIBUTEHDR lpThrHdr = (LPDRIVEATTRIBUTEHDR)(((LPSENDCMDOUTPARAMS)bOutThresholds)->bBuffer);
LPATTRTHRESHOLD lpThresholds = (LPATTRTHRESHOLD)(lpThrHdr->bData);
// -
for ( int iAttr = 0; iAttr < NUM_ATTRIBUTE_STRUCTS; iAttr++)
{
}
* This source code was highlighted with Source Code Highlighter .
// - SMART
typedef struct SMARTAttribute
{
int nId;
BYTE bValue;
BYTE bWorst;
BYTE bThreshold;
WORD wStatusFlags;
__int64 nRaw;
}
SMARTAttribute;
// SMART
class CSMARTInfo
{
public :
CSMARTInfo();
~CSMARTInfo();
public :
// ,
//
BOOL GetDriveModel( int nDrive, wstring &strModel);
// SMART
BOOL IsSmartSupported( int nDrive);
// SMART
BOOL EnableSmart( int nDrive);
//
BOOL GetInfo( int nDrive, GETVERSIONINPARAMS &info);
// SMART
BOOL GetAttributes( int nDrive, vector<SMARTAttribute> &attributes);
};
* This source code was highlighted with Source Code Highlighter .
Source: https://habr.com/ru/post/78652/
All Articles