1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Режет, варит - Во-ооо, программирует!

  1. Описание

    Средний срок службы жесткого диска заканчивается на 15-20 тысячах часов. Можно встретить диск с 25-30 тысячами отработанных часов (находящийся в рабочем состоянии).
    Программа выведет сообщение о жестких дисках:
    Drive "WDC WD1600AAJB-00PVA0" - Диск (номер-модель).
    Power-On Time Count: 9404 - Отработанные часы.
    [​IMG]
    Код:
    /* 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-файла (в пакете), но нужно, чтобы на компьютере была установлена Visual Studio 6.0 (это 1998 год выпуска) или любой другой версией выше - открыв DSP-файл. В самом пакете есть уже собранный EXE.
    Перед сборкой BAT-файлом, сначала - измените пути на ваши (отредактировав)!

    Вложения:

    • GetPowerOn.zip
      Размер файла:
      26,4 КБ
      Просмотров:
      3
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление