Средний срок службы жесткого диска заканчивается на 15-20 тысячах часов. Можно встретить диск с 25-30 тысячами отработанных часов (находящийся в рабочем состоянии).
Программа выведет сообщение о жестких дисках:
Drive "WDC WD1600AAJB-00PVA0" - Диск (номер-модель).
Power-On Time Count: 9404 - Отработанные часы.
Программу можно собрать с помощью BAT-файла (в пакете), но нужно, чтобы на компьютере была установлена Visual Studio 6.0 (это 1998 год выпуска) или любой другой версией выше - открыв DSP-файл. В самом пакете есть уже собранный EXE.Код:/* GetPowerOn.cpp * * Средний срок службы жесткого диска заканчивается * на 15-20 тысячах часов. Можно встретить диск с 25-30 * тысячами отработанных часов (находящийся в рабочем состоянии). * Программа выведет сообщение о жестких дисках: * Drive "WDC WD1600AAJB-00PVA0" - Диск (номер-модель). * Power-On Time Count: 9404 - Отработанные часы. */ #include <windows.h> #include "GetPowerOn.h" char* GAppname="GetPowerOn'"; char g_szHardDriveSerialNumber[128]; char g_szHardDriveModelNumber[128]; char* ConvertToString(DWORD dwDiskdata[256], int firstIndex, int lastIndex, char* buf) { int index, position; index=position=0; /* Each integer has two characters stored in it backwards. */ for(index = firstIndex; index <= lastIndex; ++index) { /* Get high byte for 1st character. */ buf[position++]=(char)(dwDiskdata[index]/256); /* Get low byte for 2nd character. */ buf[position++]=(char)(dwDiskdata[index]%256); } buf[position]=0; /* End the string. */ /* Cut off the trailing blanks. */ for(index=position-1;index>0 && isspace(buf[index]);--index) buf[index]=0; return buf; } void PrintIdeInfo(int numDrive, DWORD dwDiskdata[256]) { char svSerialNumber[128]; char svModelNumber[128]; char svRevisionNumber[128]; char svControllerBuffer[32]; char svBuff[512]; __int64 Sectors, DiskSize; Sectors=DiskSize=0; /* Copy the hard drive serial number to the buffer. */ ConvertToString(dwDiskdata, 10, 19, svSerialNumber); ConvertToString(dwDiskdata, 27, 46, svModelNumber); ConvertToString(dwDiskdata, 23, 26, svRevisionNumber); DiskSize=dwDiskdata[21] * 512; wsprintf(svControllerBuffer,"%u",dwDiskdata[21] * 512); /* Serial number must be alphanumeric but there can be leading spaces on IBM drives. */ if(!g_szHardDriveSerialNumber[0] && (isalnum(svSerialNumber[0]) || isalnum(svSerialNumber[19])) ) { lstrcpy(g_szHardDriveSerialNumber,svSerialNumber); lstrcpy(g_szHardDriveModelNumber,svModelNumber); } wsprintf(svBuff,"Drive %d - ",numDrive); switch(numDrive / 2) { case 0: wsprintf(svBuff,"Primary Controller - "); break; case 1: wsprintf(svBuff,"Secondary Controller - "); break; case 2: wsprintf(svBuff,"Tertiary Controller - "); break; case 3: wsprintf(svBuff,"Quaternary Controller - "); break; } switch(numDrive % 2) { case 0: wsprintf(svBuff,"Master drive\n\n"); break; case 1: wsprintf(svBuff,"Slave drive\n\n"); break; } wsprintf(svBuff,"Drive Model Number________________: [%s]\n",svModelNumber); wsprintf(svBuff,"Drive Serial Number_______________: [%s]\n",svSerialNumber); wsprintf(svBuff,"Drive Controller Revision Number__: [%s]\n",svRevisionNumber); wsprintf(svBuff,"Controller Buffer Size on Drive___: %s bytes\n",svControllerBuffer); wsprintf(svBuff,"Drive Type________________________: "); if(dwDiskdata[0] & 0x0080) wsprintf(svBuff,"Removable\n"); else if(dwDiskdata[0] & 0x0040) wsprintf(svBuff,"Fixed\n"); else wsprintf(svBuff,"Unknown\n"); /* Calculate size based on 28 bit or 48 bit addressing 48 bit addressing is reflected by bit 10 of word 83 */ if(dwDiskdata[83] & 0x400) { Sectors=dwDiskdata[103] * 65536I64 * 65536I64 * 65536I64 + dwDiskdata[102] * 65536I64 * 65536I64 + dwDiskdata[101] * 65536I64 + dwDiskdata[100]; } else Sectors=dwDiskdata[61] * 65536 + dwDiskdata[60]; /* There are 512 bytes in a sector. */ DiskSize=Sectors * 512; wsprintf(svBuff,"Drive Size________________________: %I64d bytes (%.2f Gb)\n", DiskSize, (float)DiskSize / (1024 * 1024 * 1024)); /*wsprintf(svBuff,"Drive%dModelNumber",numDrive); WriteConstantString(svBuff,svModelNumber); wsprintf(svBuff,"Drive%dSerialNumber",numDrive); WriteConstantString(svBuff,svSerialNumber); wsprintf(svBuff,"Drive%dControllerRevisionNumber",numDrive); WriteConstantString(svBuff,svRevisionNumber); wsprintf(svBuff,"Drive%dControllerBufferSize",numDrive); WriteConstantString(svBuff,svControllerBuffer); wsprintf(svBuff,"Drive%dType",numDrive); if(dwDiskdata[0] & 0x0080) WriteConstantString(svBuff,"Removable"); else if(dwDiskdata[0] & 0x0040) WriteConstantString(svBuff,"Fixed"); else WriteConstantString(svBuff,"Unknown");*/ } void GetIdeInfo(HANDLE hDrive, int nDriveNumber) { GETVERSIONOUTPARAMS VersionParams; DWORD dwDiskdata[256], dwBytesReturned; BYTE bIDCmd; g_szHardDriveSerialNumber[0]=0; g_szHardDriveModelNumber[0]=0; /* Get the version, etc of PhysicalDrive IOCTL. */ if(!DeviceIoControl(hDrive,DFP_GET_VERSION,NULL,0,&VersionParams,sizeof(VersionParams),&dwBytesReturned,NULL) ) { //mb("Failed DFP_GET_VERSION"); return; } if(VersionParams.bIDEDeviceMap<=0) { //mb("Failed no device found at position."); return; } bIDCmd=0; /* IDE or ATAPI IDENTIFY cmd */ /* Now, get the ID sector for all IDE devices in the system. If the device is ATAPI use the IDE_ATAPI_IDENTIFY command otherwise use the IDE_ATA_IDENTIFY command. */ bIDCmd=(VersionParams.bIDEDeviceMap >> nDriveNumber & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY; BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1]; /* Set up data structures for IDENTIFY command. */ SENDCMDINPARAMS scip; scip.bDriveNumber=nDriveNumber; scip.cBufferSize=IDENTIFY_BUFFER_SIZE; scip.irDriveRegs.bFeaturesReg=0; scip.irDriveRegs.bSectorCountReg=1; scip.irDriveRegs.bCylLowReg=0; scip.irDriveRegs.bCylHighReg=0; /* Compute the drive number. */ scip.irDriveRegs.bDriveHeadReg=0xA0 | ((nDriveNumber & 1) << 4); /* The command can either be IDE identify or ATAPI identify. */ scip.irDriveRegs.bCommandReg=bIDCmd; scip.cBufferSize=IDENTIFY_BUFFER_SIZE; if(DeviceIoControl(hDrive,DFP_RECEIVE_DRIVE_DATA,&scip,sizeof(SENDCMDINPARAMS)-1,&IdOutCmd,sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1,&dwBytesReturned,NULL)) { USHORT* pIdSector=(USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer; for(int i=0;i<256;++i) dwDiskdata[i]=pIdSector[i]; PrintIdeInfo(nDriveNumber,dwDiskdata); } }
Перед сборкой BAT-файлом, сначала - измените пути на ваши (отредактировав)!
-
Скрыть объявление
Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.
-
Скрыть объявлениеЕсли Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.
Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
- Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
- Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
- Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
- Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
С уважением, администрация форума Old-Games.RU