Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение серийного номера HDD 
V
    Опции темы
Kirgston
Дата 20.11.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Доброго времени суток! Собственно пытаюсь получить серийник харда. Забава вот в чем... в ХР всё нормально. Как только запускаю у себя под Вин 7 х64 у меня сразу идет ошибка ф-ции. Само собой запускаю через админа. Понятия не имею почему... так же забава еще в том что на некоторых Вин7 нормально работает. Так же под Вин сервер не работает. Что я не правильно сделал?

Код

if ( DeviceIoControl(hDisk, SMART_GET_VERSION, NULL, 0, & VIP, sizeof(VIP), & dwBytesRet, NULL) == NULL )

Вылетает с ошибкой "1". Там где не работает.

Цитата

ERROR_INVALID_FUNCTION
1 (0x1)
Incorrect function.


Пфф но блин! Причем тут инкоррект фанкшен? оО В чем я облажался? smile
PM MAIL   Вверх
Dem_max
Дата 20.11.2011, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Kirgston
Дата 20.11.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



разницы нету. Пример крешится. Заюзал ихний АПИ. Вылетает на той же строке с той же ошибкой. 
PM MAIL   Вверх
Kirgston
Дата 20.11.2011, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Забавно. Мои жесткие держат смарт... но даже Аида64 не может посмотреть СМАРТ. Но в тот же момент пишет что он поддерживается. 

user posted image
PM MAIL   Вверх
Kirgston
Дата 20.11.2011, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Код

#include "THID.h"

#include <string.h>
#include <windows.h>
//-----------
#define BUFSIZE 1024
#define MD5LEN  16
//-----------

//  Valid values for the bCommandReg member of IDEREGS;
#define  IDE_ATAPI_IDENTIFY  0xA1  //  Returns ID sector for ATAPI.
#define  IDE_ATA_IDENTIFY    0xEC  //  Returns ID sector for ATA.
#define  DFP_GET_VERSION          0x00074080
#define  DFP_RECEIVE_DRIVE_DATA   0x0007c088

typedef struct _GETVERSIONOUTPARAMS
{
    BYTE bVersion;      // Binary driver version.
    BYTE bRevision;     // Binary driver revision.
    BYTE bReserved;     // Not used.
    BYTE bIDEDeviceMap; // Bit map of IDE devices.
    DWORD fCapabilities; // Bit mask of driver capabilities.
    DWORD dwReserved[4]; // For future use.
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;

//---------------------------------------------------------------------------


std::string THID::GetHDDSerial()
{
    PrepareClass();
    // ----
    int iTheHDDNumber        = 0; // номер диска;
    // ----
    // создаем хэндл диска PHYSICALDRIVEX - номер диска;
    HANDLE hDisk    = CreateFile(L"\\\\.\\PHYSICALDRIVE0", GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    // ----
    if ( hDisk == INVALID_HANDLE_VALUE )
    {
        int i = GetLastError();
        SafeReturn();
        return m_szHardDriveSerialNumber;
    }
    // ----
    DWORD                dwBytesRet        = 0;
    // ----
    GETVERSIONINPARAMS    VIP;
    memset( & VIP, 0, sizeof(VIP));
    // ----
    if ( DeviceIoControl(hDisk, SMART_GET_VERSION, NULL, 0, & VIP, sizeof(VIP), & dwBytesRet, NULL) == NULL )
    {
        int i = GetLastError();
        wchar_t buf[10];
        wsprintf(buf,L"%d",i);
        MessageBox(NULL,buf,L"Error",MB_OK);
        CloseHandle(hDisk);
        SafeReturn();
        return m_szHardDriveSerialNumber;
    }
    // ----
    if ( VIP.bIDEDeviceMap <= 0 )
    {
        CloseHandle(hDisk);
        SafeReturn();
        return m_szHardDriveSerialNumber;
    }
    // ----
    BYTE bIDCmd        = (((VIP.bIDEDeviceMap >> iTheHDDNumber) & 0x10) != 0) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
    // ----
    if ( bIDCmd != IDE_ATA_IDENTIFY )
    {
        CloseHandle(hDisk);
        SafeReturn();
        return m_szHardDriveSerialNumber;
    }
    // ----
    SENDCMDINPARAMS        scip;
    memset( & scip, 0, sizeof(scip));
    // ----
    scip.irDriveRegs.bFeaturesReg        = 0;
    scip.irDriveRegs.bSectorCountReg    = 1;
    scip.irDriveRegs.bSectorNumberReg    = 1;
    scip.irDriveRegs.bCylLowReg            = 0;
    scip.irDriveRegs.bCylHighReg        = 0;
    scip.irDriveRegs.bDriveHeadReg        = 0xA0 | ((iTheHDDNumber & 1) << 4);
    scip.irDriveRegs.bCommandReg        = IDE_ATA_IDENTIFY;
    scip.bDriveNumber                    = iTheHDDNumber;
    scip.cBufferSize                    = 512;
    // ----
    int iBufSize        = sizeof(SENDCMDOUTPARAMS) + 512 - 1;
    // ----
    BYTE * IdOutCmd        = new BYTE[iBufSize];
    memset(IdOutCmd, 0, iBufSize);
    // ----
    if ( DeviceIoControl(hDisk, SMART_RCV_DRIVE_DATA,
        (LPVOID) & scip, sizeof(SENDCMDINPARAMS) - 1,
        (LPVOID)IdOutCmd, iBufSize, & dwBytesRet, NULL) != NULL )
    {
        // Указатель на адрес сектора HDD, в котором хранится разная полезная инфа;
        USHORT * pIdSector    = (USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer;
        // ----
        if ( pIdSector != NULL )
        {
            WORD wDiskData[256];
            memset(wDiskData, 0, sizeof(wDiskData));
            // ----
            // Заполняем наши данные;
            //for (int ijk = 0; ijk < 256; ijk++) wDiskData[ijk] = pIdSector[ijk];
            memcpy(wDiskData, pIdSector, sizeof(WORD) * 256);
            // ----
            // Конвертируем в строку SN;
            ConvertToString(wDiskData, 10, 19, m_szHardDriveSerialNumber);
        }
    }
    // ----
    CloseHandle(hDisk);
    // ----
    delete IdOutCmd;
    // ----
    return m_szHardDriveSerialNumber;
}
//---------------------------------------------------------------------------

std::string THID::ReadPhysicalDriveInNTWithAdminRights (void)
{
    PrepareClass();
    int done = FALSE;
    int drive = 0;
    BYTE IdOutCmd [sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];

    HANDLE hPhysicalDriveIOCTL = 0;

    //  Try to get a handle to PhysicalDrive IOCTL, report failure
    //  and exit if can't.
    TCHAR driveName [256];

    //  Windows NT, Windows 2000, must have admin rights
    
    hPhysicalDriveIOCTL = CreateFile(L"\\\\.\\PHYSICALDRIVE0", GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

    if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
    {
        GETVERSIONOUTPARAMS VersionParams;
        DWORD               cbBytesReturned = 0;

        // Get the version, etc of PhysicalDrive IOCTL
        memset ((void*) &VersionParams, 0, sizeof(VersionParams));

        if (  DeviceIoControl (hPhysicalDriveIOCTL, DFP_GET_VERSION,
            NULL, 
            0,
            &VersionParams,
            sizeof(VersionParams),
            &cbBytesReturned, NULL) )
        {         


            // If there is a IDE device at number "i" issue commands
            // to the device
            if (VersionParams.bIDEDeviceMap > 0)
            {
                BYTE             bIDCmd = 0;   // IDE or ATAPI IDENTIFY cmd
                SENDCMDINPARAMS  scip;

                // 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 >> drive & 0x10) ? \
IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;

                memset (&scip, 0, sizeof(scip));
                memset (IdOutCmd, 0, sizeof(IdOutCmd));

                if ( DoIDENTIFY (hPhysicalDriveIOCTL, 
                    &scip, 
                    (PSENDCMDOUTPARAMS)&IdOutCmd, 
                    (BYTE) bIDCmd,
                    (BYTE) drive,
                    &cbBytesReturned))
                {


                    USHORT *pIdSector = (USHORT *)
                        ((PSENDCMDOUTPARAMS) IdOutCmd) -> bBuffer;

                    if ( pIdSector != NULL )
                    {
                        WORD wDiskData[256];
                        memset(wDiskData, 0, sizeof(wDiskData));
                        // ----
                        // Заполняем наши данные;
                        //for (int ijk = 0; ijk < 256; ijk++) wDiskData[ijk] = pIdSector[ijk];
                        memcpy(wDiskData, pIdSector, sizeof(WORD) * 256);
                        // ----
                        // Конвертируем в строку SN;
                        ConvertToString(wDiskData, 10, 19, m_szHardDriveSerialNumber);
                    }
                }
            }
        }
        int i = GetLastError();
        CloseHandle (hPhysicalDriveIOCTL);
    }


    return MD5(m_szHardDriveSerialNumber);
}

BOOL THID::DoIDENTIFY (HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,
    PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum,
    PDWORD lpcbBytesReturned)
{
    // Set up data structures for IDENTIFY command.
    pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
    pSCIP -> irDriveRegs.bFeaturesReg = 0;
    pSCIP -> irDriveRegs.bSectorCountReg = 1;
    pSCIP -> irDriveRegs.bSectorNumberReg = 1;
    pSCIP -> irDriveRegs.bCylLowReg = 0;
    pSCIP -> irDriveRegs.bCylHighReg = 0;

    // Compute the drive number.
    pSCIP -> irDriveRegs.bDriveHeadReg = 0xA0 | ((bDriveNum & 1) << 4);

    // The command can either be IDE identify or ATAPI identify.
    pSCIP -> irDriveRegs.bCommandReg = bIDCmd;
    pSCIP -> bDriveNumber = bDriveNum;
    pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;

    return ( DeviceIoControl (hPhysicalDriveIOCTL, DFP_RECEIVE_DRIVE_DATA,
        (LPVOID) pSCIP,
        sizeof(SENDCMDINPARAMS) - 1,
        (LPVOID) pSCOP,
        sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
        lpcbBytesReturned, NULL) );
}


// ф-я конвертирования в строку данных
void THID::ConvertToString(WORD wDiskData[256], int firstIndex, int lastIndex, PCHAR szOutString)
{
    char string[1024];
    memset(string, 0, sizeof(string));
    // ----
    int i            = 0;
    int    j            = 0;
    int position    = 0;
    // ----
    //  each integer has two characters stored in it backwards;
    for (i = firstIndex; i <= lastIndex; i++)
    {
        // get high byte for 1st character;
        string[position] = (char)(wDiskData[i] / 256);
        position++;
        // ----
        // get low byte for 2nd character;
        string[position] = (char)(wDiskData[i] % 256);
        position++;
    }
    // ----
    // cut off the trailing blanks;
    // ----
    for (i = 0, j = 0; i <= position; i++)
    {
        if ( string[i] != ' ' )
        {
            szOutString[j] = string[i];
            j++;
        }
    }
}
//---------------------------------------------------------------------------

PM MAIL   Вверх
Dem_max
Дата 21.11.2011, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Покажи код подробней как делаешь.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bass
Дата 21.11.2011, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Попробуй WMI .... Правда медленное.... Но с горем пополам работает......)))) 
PM MAIL   Вверх
Kirgston
Дата 21.11.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Цитата(Dem_max @  21.11.2011,  03:08 Найти цитируемый пост)
Покажи код подробней как делаешь. 

о_О так куда уже подробней. Вон класс. Вон ф-ция которая так и просится вызваться smile) 


Цитата(bass @  21.11.2011,  04:57 Найти цитируемый пост)
Попробуй WMI .... Правда медленное.... Но с горем пополам работает......))))  

его можно обойти как я помню smile
PM MAIL   Вверх
xvr
Дата 21.11.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Это уже обсуждали - не все драйвера поддерживают SMART функциональность.

Вот, в MSDN:
Цитата

SMART_GET_VERSION control code

Returns version information, a capabilities mask, and a bitmask for the device. This IOCTL must be handled by drivers that support Self-Monitoring Analysis and Reporting Technology (SMART).


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1792 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.