Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Как получить сериальный номер винчестера, Get Physical Hardware serial number SATA 
:(
    Опции темы
MuForum
Дата 16.11.2010, 00:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Доброго времени суток.
Недавно у меня была задача программно без использования WMI получить сериальный номер винчестера, не тома!
На старых осях: Windows XP, 2003, всё работало нормально, но вот на Windows Vista/Seven - проблемы.


Прошу помочь данную проблему, пнуть в нужную сторону, или помочь ссылкой, кодом и т.д.

# THID.cpp:
Код

#include "THID.h"
//---------------------------------------------------------------------------

//  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.
//---------------------------------------------------------------------------

PCHAR 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 )
    {
        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 )
    {
        CloseHandle(hDisk);
        return m_szHardDriveSerialNumber;
    }
    // ----
    if ( VIP.bIDEDeviceMap <= 0 )
    {
        CloseHandle(hDisk);
        return m_szHardDriveSerialNumber;
    }
    // ----
    BYTE bIDCmd        = (((VIP.bIDEDeviceMap >> iTheHDDNumber) & 0x10) != 0) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
    // ----
    if ( bIDCmd != IDE_ATA_IDENTIFY )
    {
        CloseHandle(hDisk);
        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;
}
//---------------------------------------------------------------------------

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


# THID.h:
Код

#ifndef THID_H
#define THID_H
//---------------------------------------------------------------------------

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <windows.h>
#include <winioctl.h>
//---------------------------------------------------------------------------
class THID
{
    private:
        char    m_szHardDriveSerialNumber[1024];
        // ----
        void PrepareClass()
        {
            memset(m_szHardDriveSerialNumber, 0, sizeof(m_szHardDriveSerialNumber));
        }
        // ----
        void ConvertToString(WORD wDiskData[256], int firstIndex, int lastIndex, PCHAR szOutString);
    public:
        THID() {};
        ~THID() {};
        // ----
        PCHAR GetHDDSerial();
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------



# Добавлено: При попытки запустить данный код на Windows Vista/Seven, то hDisk == INVALID_HANDLE_VALUE.
- То есть тупо даже не получается получить дескриптор на объект.



P.S. -> Надеюсь на помощь.



# Добавлено:
- Разобрался в чём проблема, оказывается что в Windows Vista/Seven программу нужно запускать от имени администратора, чтобы данный код работал =(
- А вот это уже проблема =(
- Кто-что может порекомендовать?

# Добавлено:
- Ещё один интересный факт. У меня ноут и персоналка, одна и таже ось, разные винты.
- Под персоналкой от администратора показывает HID, на ноуте даже из под админа не показывает HID.
- Такс, для ноута я вижу нужно писать отдельную функцию получения HID, так как VIP.bIDEDeviceMap == 0.



Это сообщение отредактировал(а) MuForum - 16.11.2010, 00:54

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  GHSN.zip 553,06 Kb


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
boostcoder
Дата 16.11.2010, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



что-то вы тут наворотили smile 
для подобных задач существует WMI(список слева).
ответ на ваш вопрос - тут.

PM WWW   Вверх
MuForum
Дата 16.11.2010, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Цитата(boostcoder @ 16.11.2010,  01:20)
что-то вы тут наворотили smile 
для подобных задач существует WMI(список слева).
ответ на ваш вопрос - тут.

Я помойму чётко написал, что мне нужно без использования службы "WMI".
Во-первых: Она часто отключена. (А для включения данной службы нужны будут права админа, а мне это очень катастрафично)
Во-вторых: С WMI смогут пошаманить и мне будет возвращаться бред...


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
ApolloKiD
Дата 21.8.2013, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 7.6.2011
Где: Молдавия

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



Столкнулся с такой же проблемой, знает кто в чём проблема?
PM MAIL   Вверх
victor79
Дата 25.8.2013, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


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

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



там где нужно под администратором и все же возвращает - писать свой драйвер - иначе никак. При инсталции программы устанавливаешь это драйвер, и после через него получаешь.

PM MAIL WWW   Вверх
xvr
Дата 26.8.2013, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(victor79 @  25.8.2013,  16:15 Найти цитируемый пост)
там где нужно под администратором и все же возвращает - писать свой драйвер - иначе никак. 

Ну, успехов в написании. Особенно под 64х битной версией Windows. Сертифицировать драйвер не забудьте  smile 
Включить WMI будет гораздо проще  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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