Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2011, 17:53   #1
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
Печаль Программа, получающая серийный номер hdd.

Нужно написать программу, которая выводит серийный номер HDD. Не могу понять в чем ошибка - CreateFile возвращает INVALID_HANDLE_VALUE.
Просьба помочь с исходником на С++ (там помимо этой наверняка ошибки есть).
Вот сам он:

Код:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <windows.h>
#include <winioctl.h>
#include <tchar.h>

#define IDE_ATAPI_IDENTIFY 0xA1
#define DFP_GET_VERSION 0x00074080
#define IDE_ATA_IDENTIFY 0xEC
#define DFP_RECEIVE_DRIVE_DATA 0x0007C088

char HardDriveSerialNumber[1024]; // здесь будет храниться наш SN

// ф-я конвертирования в строку данных
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;
}

int 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(_T("\\.\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 1;
                    }
                }
            }
        }
    }
    return 0;
}



int main()
{
	if(GetHDDSerial())
		std::cout << "Error!!!";
	else
		std::cout << "HDD SERIAL NUMBER: " << HardDriveSerialNumber << "\n";
	system("PAUSE");
	return 0;
}

Последний раз редактировалось Ibanez Wizard; 20.09.2011 в 22:25.
Ibanez Wizard вне форума Ответить с цитированием
Старый 20.09.2011, 22:31   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

ОС какая?

Добитие до дибильных 10.
p51x вне форума Ответить с цитированием
Старый 21.09.2011, 06:32   #3
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
ОС какая?

Добитие до дибильных 10.
Windows конечно же. Windows 7 (32-bit'ка).
Ibanez Wizard вне форума Ответить с цитированием
Старый 21.09.2011, 07:47   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Права какие? UAC?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Серийный номер hdd через wmi xil C# (си шарп) 3 08.09.2011 12:04
Серийный номер HDD ?! $T@LKER Общие вопросы Delphi 32 26.02.2011 10:55
по букве тома определить физический серийный номер накопителя, а не номер тома @лександр Помощь студентам 6 23.09.2010 15:05
Серийный номер флешки best island Общие вопросы .NET 0 19.07.2010 01:47
Серийный номер HDD Mikola-TEAM Win Api 1 25.05.2010 19:38