Узнать серийный номер винчестера

Тема в разделе "WASM.BEGINNERS", создана пользователем TOLSTOPUZ, 13 дек 2008.

  1. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Собственно, решил попрактиковаться
    в привязке программы к аппаратной части.
    Для начала решил попробовать к винчестеру.
    Больше вроде и не к чему привязывать.
    Подскажите функцию плиз... Если такая есть...
     
  2. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
    Можно к процессору привязать... Кури CPUID ))))
     
  3. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    Clear_Energy, права половина голосов на твоей страничке .\
    тебе лишь бы ляпнуть чёто!

    GetVolumeInformation("C:\\",buff,25,&VolumeSerialNo,&MaxComponentLength,&FileSystemFlags, FileSystemName,buff_len);
    и вот VolumeSerialNo будет твоим серийником.
     
  4. sp1k

    sp1k New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    24
    Comer_
    Она возвращает номер тома. После форматирования он будет другим. Так что это не привязка к аппаратной части.

    p.s. В МДСНе рекомендуют для получения номера диска назначенного производителем использовать WMI
     
  5. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    :-(

    А к чему тогда можно надёжно привязать?
     
  6. sp1k

    sp1k New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    24
    Можешь попробовать привязать к hardware id usb флэшки - смотри в сторону SetupApi. Могу исходник привести (правда на дельфи ((
     
  7. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    А зачем мне к флешке привязывать?
    Мне надо к аппаратной части компьютера.
     
  8. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Код я нашёл, но он походу написан на Си...
    Попытался своими силами переписать его на МАСМ,
    вроде там видны процедуры, буферы...
    Но что-то не получается.
    Кто знает СИ, помогите плиз перевести его на МАСМ.

    =========================================

    #include <stdlib.h>
    #include <stdio.h>
    #include <stddef.h>
    #include <string.h>
    #include <windows.h>
    #include <winioctl.h>
    char HardDriveSerialNumber [1024]; // здесь будет храниться наш SN
    CString GetHDDSerial()
    {
    BYTE bIDCmd = 0; // крманда IDE или ATAPI IDENTIFY
    SENDCMDINPARAMS scip; // см MSDN для описания
    USHORT *pIdSector; // указатель на адрес сектора HDD, в котором хранится разная полезная инфа =)
    GETVERSIONINPARAMS VP; // см MSDN для описания
    int i = 0; // номер диска
    BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS)+512-1];
    DWORD br; // байт прочтено

    // выделяем памаять под переменную VP
    memset((void*)&VP,0,sizeof(VP));
    // создаем хэндл диска PHYSICALDRIVEX - номер диска
    HANDLE hDisk = CreateFile("\\\\.\\PHYSICALDRIVE0",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
    if ( hDisk != INVALID_HANDLE_VALUE )
    {
    if (DeviceIoControl(hDisk,DFP_GET_VERSION,NULL,0,&VP,sizeof(VP),&br,NULL))
    {
    if (VP.bIDEDeviceMap>0)
    {
    bIDCmd=(VP.bIDEDeviceMap>>i&0x10)?\
    IDE_ATAPI_IDENTIFY:IDE_ATA_IDENTIFY;
    if ( bIDCmd == IDE_ATA_IDENTIFY )
    {
    memset ( &scip, 0, sizeof(scip) );
    memset ( IdOutCmd, 0, sizeof(IdOutCmd) );

    scip.irDriveRegs.bFeaturesReg = 0;
    scip.irDriveRegs.bSectorCountReg = 1;
    scip.irDriveRegs.bSectorNumberReg = 1;
    scip.irDriveRegs.bCylLowReg = 0;
    scip.irDriveRegs.bCylHighReg = 0;
    scip.irDriveRegs.bDriveHeadReg = 0xA0 | ((i & 1) << 4);
    scip.irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
    scip.bDriveNumber = i;
    scip.cBufferSize = 512;

    if (DeviceIoControl(hDisk,DFP_RECEIVE_DRIVE_DATA,
    (LPVOID)&scip,
    sizeof(SENDCMDINPARAMS)-1,
    (LPVOID)IdOutCmd,
    sizeof(SENDCMDOUTPARAMS)+512-1,
    &br,NULL))
    {
    DWORD diskdata [256]; // нужные нам данные
    int ijk = 0;

    pIdSector = (USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer; // получаем указатель на сектор

    for (ijk = 0; ijk < 256; ijk++)
    diskdata [ijk] = pIdSector [ijk]; // заполняем наши данные

    strcpy(HardDriveSerialNumber,ConvertToString(diskdata,10,19)); // конвертируем в строку SN
    return HardDriveSerialNumber;
    }
    }
    }
    }
    }
    return "Some Stupid Error";
    }

    // ф-я конвертирования в строку данных
    char *ConvertToString(DWORD diskdata [256],int firstIndex,int lastIndex)
    {
    static char string [1024];
    int index = 0;
    int position = 0;

    // each integer has two characters stored in it backwards
    for (index = firstIndex; index <= lastIndex; index++)
    {
    // get high byte for 1st character
    string [position] = (char) (diskdata [index] / 256);
    position++;

    // get low byte for 2nd character
    string [position] = (char) (diskdata [index] % 256);
    position++;
    }

    // end the string
    string [position] = '\0';

    // cut off the trailing blanks
    for (index = position - 1; index > 0 && ' ' == string [index]; index--)
    string [index] = '\0';

    return string;
    }
    ========================================================================
     
  9. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    а ну вас, бестолочей.. разбирайтесь сами как хотите.
     
  10. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Комер, я конечно это могу изобразить на асме...

    Но вот люди говорят, что эта функция ( GetVolumeInformation) определяет не серийный номер винчестера, а номер логического диска, и после форматирования он изменится.
     
  11. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    http://wasm.ru/baixado.php?mode=src&id=276 - загляни сюда. поиск как ни странно рулит со страшной силой! ;)
     
  12. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Вот мой пример. Должен работать даже под урезанными правами. Переписывал это с примера на делфи, только не помню где его брал, да и исходник на делфи тоже не сохранился.
     
  13. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Вспомнил на каком сайте брал исходник: http://www.delphisources.ru/pages/faq/base/get_hdd_serial.html
    Вкладываю файл со структурами, правда там может быть ошибка, не помню исправлял я ее или нет.
     
  14. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    TOLSTOPUZ
    Серийный номер харда прописан в его паспорте. Читаешь паспорт АТА-функцией ECh, переворачиваешь байтики - и серийник в твоих руках.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clear_Energy
    возникло большое желание удалять большую часть твоих сообщений, которые не несут никакого смысла