реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите получить серийный номер HDD на C#, Изучение C# VS2010
Prinz
сообщение Oct 14 2010, 07:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121



Здравствуйте.
Помогите пожалуйста с получение серийного номера жёсткого диска.
Получить серийный номер тома у меня дулаось успешно, а вот с диском возникла проблема.
Может подскажете ссылочку на работающии отрывки программ.
Пока таких не нашёл.
Заранее спасибо.
Буду рад любому совету.
Go to the top of the page
 
+Quote Post
neiver
сообщение Oct 14 2010, 09:04
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



По первой ссылке smile.gif
Go to the top of the page
 
+Quote Post
Prinz
сообщение Oct 14 2010, 11:42
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121



Цитата(neiver @ Oct 14 2010, 15:04) *


Спасибо.
Я эту прогу уже смотрел.
Что-то как-то она у меня не заработала.
Точнее не полностью.
Я получение серийника на билдере писал, там всё успешно работало.
Go to the top of the page
 
+Quote Post
neiver
сообщение Oct 14 2010, 12:52
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Что именно не заработало?
У работает, правда не у всех HDD серийник извлекается.
Go to the top of the page
 
+Quote Post
Prinz
сообщение Oct 15 2010, 07:36
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121



Цитата(neiver @ Oct 14 2010, 18:52) *
Что именно не заработало?
У работает, правда не у всех HDD серийник извлекается.


Ещё раз проверил.
Как раз серийник ине извлекается, а он мне - то и нужен.
Есть какой-нибудь другой способ?
Я нашёл ещё один, там тоже не извлекается серийник.


Спасибо.
Подскажите пожалуйста ещё чего-нибудь)
Go to the top of the page
 
+Quote Post
neiver
сообщение Oct 15 2010, 10:25
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Видимо не все HDD отдают свой серийник через WMI.
Go to the top of the page
 
+Quote Post
Prinz
сообщение Oct 15 2010, 11:12
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121



Цитата(neiver @ Oct 15 2010, 16:25) *
Видимо не все 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 жёсткого нет.

Была написана на скорую руку и работала удачно.
Go to the top of the page
 
+Quote Post
neiver
сообщение Oct 15 2010, 11:52
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



На C# можно вызывать WinApi функци непосредственно. Описания самих функций и структур есть на http://www.pinvoke.net/. Там-же примеры их использования. Муторное это дело WinApi на шарпе пользовать, но межет получиться. А можно написать отдельную DotNet сборку на С++. Наружу будет торчать DotNet класс, который легко из шарпа использовать, а внутри делай, что хочешь на С++. Так будет даже проще.
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Oct 15 2010, 12:30
Сообщение #9





Guests






http://home.earthlink.net/~akonshin/delphi_ru.htm
Go to the top of the page
 
+Quote Post
Prinz
сообщение Oct 20 2010, 04:37
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121



Спасибо.
попробую воспользоваться вашими советами)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01432 секунд с 7
ELECTRONIX ©2004-2016