Перейти к содержанию
    

Помогите получить серийный номер HDD на C#

Здравствуйте.

Помогите пожалуйста с получение серийного номера жёсткого диска.

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

Может подскажете ссылочку на работающии отрывки программ.

Пока таких не нашёл.

Заранее спасибо.

Буду рад любому совету.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Спасибо.

Я эту прогу уже смотрел.

Что-то как-то она у меня не заработала.

Точнее не полностью.

Я получение серийника на билдере писал, там всё успешно работало.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что именно не заработало?

У работает, правда не у всех HDD серийник извлекается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что именно не заработало?

У работает, правда не у всех HDD серийник извлекается.

 

Ещё раз проверил.

Как раз серийник ине извлекается, а он мне - то и нужен.

Есть какой-нибудь другой способ?

Я нашёл ещё один, там тоже не извлекается серийник.

 

 

Спасибо.

Подскажите пожалуйста ещё чего-нибудь)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо не все HDD отдают свой серийник через WMI.

 

Вот моя прожка на C++.

Работа отлично.

#include "Unit1.h"

#include <stdlib.h>

#include <stdio.h>

#include <stddef.h>

#include <string.h>

#include <windows.h>

#include <winioctl.h>

#include <WinIoCtl.h>

#define IDE_ATAPI_IDENTIFY 0xA1

#define DFP_GET_VERSION 0x00074080

#define IDE_ATA_IDENTIFY 0xEC

#define DFP_RECEIVE_DRIVE_DATA 0x0007C088

AnsiString GetHDDSerial(void)

{

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

HardDriveSerialNumber[0] = 0;

BYTE bIDCmd; // крманда IDE или ATAPI IDENTIFY

SENDCMDINPARAMS scip; // см MSDN для описания

USHORT *pIdSector; // указатель на адрес сектора HDD, в котором хранится разная полезная инфа =)

GETVERSIONINPARAMS VP; // см MSDN для описания

int i; // номер диска

BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS)+512-1];

DWORD br; // байт прочтено

char NamePhysicalDisk[256];

memset((void*)&VP,0,sizeof(VP)); // выделяем памаять под переменную VP

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

//определяем номер физического диска на котором лежит приложение

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

AnsiString FileName;

int DevNum = -1;

char F[2024];

GetModuleFileName(HInstance,F,2023);

FileName.printf("\\\\.\\%c:",F[0]);

HANDLE hDisk = CreateFile(FileName.c_str(),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHAR

E_WRITE,NULL,OPEN_EXISTING,0,NULL);

if(hDisk != INVALID_HANDLE_VALUE)

{

STORAGE_DEVICE_NUMBER dInfo;

DWORD Ret;

if(DeviceIoControl (hDisk, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &dInfo, sizeof (dInfo), &Ret, NULL)) DevNum = dInfo.DeviceNumber;

CloseHandle (hDisk);

}

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

//Определяеем серийный номер физического диска

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

if(DevNum >= 0)

{

i = DevNum;

sprintf(NamePhysicalDisk,"\\\\.\\PHYSICALDRIVE%d",i);

HANDLE hDisk = CreateFile(NamePhysicalDisk,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHAR

E_WRITE,NULL,OPEN_EXISTING,0,NULL); // создаем хэндл диска PHYSICALDRIVEX - номер диска

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]; // нужные нам данные

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

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

strncpy(HardDriveSerialNumber,ConvertToString(diskdata,10,19),1023); // конвертируем в строку SN

HardDriveSerialNumber[1023] = 0;

}

}

}

}

CloseHandle(hDisk);

}

}

AnsiString ResultTempStr = "";

if(HardDriveSerialNumber[0]) ResultTempStr.printf("%s",HardDriveSerialNumber);

return ResultTempStr;

}

 

// ф-я конвертирования в строку данных

char *ConvertToString(DWORD diskdata [256],int firstIndex,int lastIndex)

{

static char string [1024];

int index;

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;

}

 

 

Может поможете переделать на C# или есть что-то на нём подобно.

Сегодня весь день интет листал.

МАк адрес уже получил, а ID жёсткого нет.

 

Была написана на скорую руку и работала удачно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На C# можно вызывать WinApi функци непосредственно. Описания самих функций и структур есть на http://www.pinvoke.net/. Там-же примеры их использования. Муторное это дело WinApi на шарпе пользовать, но межет получиться. А можно написать отдельную DotNet сборку на С++. Наружу будет торчать DotNet класс, который легко из шарпа использовать, а внутри делай, что хочешь на С++. Так будет даже проще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...