C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Серийный номер CPU,HDD, Как определить?
MiR@Ge
Отправлено: 19.06.2003, 13:58


Ученик-кочегар

Группа: Участник
Сообщений: 13



Приветствую всех обитателей форума! biggrin.gif
Подскажите кто знает как определить серийный номер процессора и жесткого диска (не раздела, чей номер меняется при каждом форматировании). ОЧЕНЬ НАДО
Заранее спасибо!
Admin
Отправлено: 19.06.2003, 14:58


Владимир

Группа: Администратор
Сообщений: 1190



Есть по винчестеру в Архиве форума.
Вот эти ссылки:


Ссылка 1

Ссылка 2
MiR@Ge
Отправлено: 20.06.2003, 11:56


Ученик-кочегар

Группа: Участник
Сообщений: 13



Большое спасибо за помощь, только по-моему это как раз то, о чем я говорил. Функция GetVolumeInformation, насколько я знаю, возвращает не физический номер винчестера, а номер, присвоенный данному разделу диска при очередном форматировании. А хотелось бы получить серийник именно винта.
Liss
Отправлено: 25.06.2003, 21:31


Не зарегистрирован







Не знаю как ты хочешь умудриться получить эти данные программируя в CBuilder, ты ведь пишешь проги которые работают в защищенном режиме микропроцессора, т.е. ты не можешь из 3 кольца (где и работают твои проги) работать с устройствами на прямую, а вот о существовании Api функций такого рода я не знаю.

Следовательно существует 2 выхода:
1. Написать VxD драйвер, работающий в 0 кольце и юзать его из своих программ, но придется писать разные дрова для разных версий Винды.
2. Написать прогу работающую под Dos, и ходить со своей загрузочной дискеткой.
Admin
Отправлено: 26.06.2003, 00:41


Владимир

Группа: Администратор
Сообщений: 1190



Советую посмотреть здесь:

http://pascal.sources.ru/hardware/

http://pascal.sources.ru/disks/
Георгий
Отправлено: 26.06.2003, 10:44


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Liss
Я вроде нашёл как извлечь заводской намер HDD, но я не умею VxD делать — покажи как и чем это делать. а ещё лучше — покажи пример
CODE
{From : Serg Karpov                   2:5024/7.77                      23.06.97
Subj : серийный номер IDE винта
}
uses CRT;
Type
TIdeInfo = Record
   Config    : word;
   CylsTotal : word;
   Unused    : word;
   HeadTotal : word;
   BPT       : word;
   BPS       : word;
   SPT       : word;
   Vendor    : Array[0..2]  of word;
   Serial    : Array[1..20] of char;
   BufType   : word;
   BufSize   : word;
   ECC       : word;
   Revision  : Array[1..8]  of char;
   Model     : Array[1..40] of char;
end;
var
  InfoArray : Array[0..255] of word;
  IdeInfo   : TIdeInfo absolute InfoArray;
  NumDisk   : byte;
  Count     : byte;


procedure GetIDEInfo( Drive : byte );
var
 I : byte;

 begin
   FillChar( InfoArray, sizeof(InfoArray), 0 );

   while ( Port[$1F7] and $80 <> 0 ) do;

   Port[$3F6] := 2;
   Port[$1F6] := $A0 + ( Drive shl 4);
   Port[$1F7] := $EC;

   while ( Port[$1F7] and $80 <> 0 ) do;

   for I := 0 to 255 do InfoArray[I] := Swap( PortW[$01F0] );

 end;


begin
 ClrScr;
 NumDisk := Mem[$40:$75];
 for Count :=1 to NumDisk do
 begin
   GetIdeInfo( Count — 1 );
   Writeln('Serial number     : ',IdeInfo.Serial           );
   Writeln('Revision          : ',IdeInfo.Revision         );
   Writeln('Model HDD         : ',IdeInfo.Model            );
   Writeln;
   Writeln('Total cylinders   : ',Swap(IdeInfo.CylsTotal):8);
   Writeln('Total heads       : ',Swap(IdeInfo.HeadTotal):8);
   Writeln('Sectors per track : ',Swap(IdeInfo.SPT):8      );
   Writeln('Byte per sector   : ',Swap(IdeInfo.BPS):8      );
   Writeln('Byte per track    : ',Swap(IdeInfo.BPT):8      );
   Writeln('Size of buffer    : ',Swap(IdeInfo.BufSize):8  );
 end;
end.

только меня мучают сомнения — а как оно с HDD на USB, FireWire, SATA, SCSI т.е. не на IDE работать будет?
Liss
Отправлено: 26.06.2003, 20:51


Не зарегистрирован







QUOTE (Георгий @ 26 Jun 2003, 10:44)
Liss
Я вроде нашёл как извлечь заводской намер HDD, но я не умею VxD делать — покажи как и чем это делать. а ещё лучше — покажи пример
CODE
{From : Serg Karpov 2:5024/7.77 23.06.97
Subj : серийный номер IDE винта
}
uses CRT;
Type
TIdeInfo = Record
Config : word;
CylsTotal : word;
Unused : word;
HeadTotal : word;
BPT : word;
BPS : word;
SPT : word;
Vendor : Array[0..2] of word;
Serial : Array[1..20] of char;
BufType : word;
BufSize : word;
ECC : word;
Revision : Array[1..8] of char;
Model : Array[1..40] of char;
end;
var
InfoArray : Array[0..255] of word;
IdeInfo : TIdeInfo absolute InfoArray;
NumDisk : byte;
Count : byte;


procedure GetIDEInfo( Drive : byte );
var
I : byte;

begin
FillChar( InfoArray, sizeof(InfoArray), 0 );

while ( Port[$1F7] and $80 <> 0 ) do;

Port[$3F6] := 2;
Port[$1F6] := $A0 + ( Drive shl 4);
Port[$1F7] := $EC;

while ( Port[$1F7] and $80 <> 0 ) do;

for I := 0 to 255 do InfoArray[I] := Swap( PortW[$01F0] );

end;


begin
ClrScr;
NumDisk := Mem[$40:$75];
for Count :=1 to NumDisk do
begin
GetIdeInfo( Count — 1 );
Writeln('Serial number : ',IdeInfo.Serial );
Writeln('Revision : ',IdeInfo.Revision );
Writeln('Model HDD : ',IdeInfo.Model );
Writeln;
Writeln('Total cylinders : ',Swap(IdeInfo.CylsTotal):8);
Writeln('Total heads : ',Swap(IdeInfo.HeadTotal):8);
Writeln('Sectors per track : ',Swap(IdeInfo.SPT):8 );
Writeln('Byte per sector : ',Swap(IdeInfo.BPS):8 );
Writeln('Byte per track : ',Swap(IdeInfo.BPT):8 );
Writeln('Size of buffer : ',Swap(IdeInfo.BufSize):8 );
end;
end.

только меня мучают сомнения — а как оно с HDD на USB, FireWire, SATA, SCSI т.е. не на IDE работать будет?

Вообще-то то что ты написал — паскаль в Real Mode, а парень хочет в Widows, т.е. в Protect Mode и то что винда тебе даст тебе проделать тоже в 3 кольце я сомневаюсь.

Насчет драйверов смотри DDK, я писал только VxD (под Win 98) в качестве пробы пера, но все умерло со старым винтом, пример на асме можно найти на Здесь

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

А в принципе я предложил тоже самое, что и написал ты. Просто прогу под дос, а чтобы не было проблем со всякими там Win XP просто надо таскать с собой загрузочный диск или дискету. Я так понимаю это ему для инветаризации нужно?

Отредактировано Liss — 26 Jun 2003, 20:53
Георгий
Отправлено: 26.06.2003, 22:41


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



для инвентаризации — можно и на крышку посмотреть
я (да и не только я — в старом форуме несколько раз поднимали этот вопрос) думал применить это чуть чуть иначе — для привязки ПО к конкретной машине использовать номера железок — HDD MB тип и частоту процессора и т.п. (тоже самое MS пыталась сделать в своей активации WinXP).
кстати я пытался намекнуть :"я как бы нашёл код, а ты как бы напиши драйвер", но придётся ковыряться самому...
Георгий
Отправлено: 27.06.2003, 00:01


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



нашёл я VxD — но оно толи не вызывается то ли ещё что...
вызываю так
CODE

void ShowLastError(void)
{
LPVOID lpMsgBuf;

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);

// Display the string.
MessageBox( NULL,(char*) lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );

// Free the buffer.
LocalFree( lpMsgBuf );
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hVxd;
DWORD z;
char* VxdName="d:\\ser.vxd";
BYTE SerNumber[256];// À ýòîò áóôåð íàì çàïîëíèò VxD, åñëè âñå áóäåò OK
hVxd=CreateFile(VxdName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE,0);
ShowLastError();
for (int i=0;i<256;i++)SerNumber[i]=0;
if (!DeviceIoControl(hVxd,1,SerNumber,sizeof(SerNumber),NULL,NULL,NULL,NULL))
ShowLastError();
z=GetLastError();
CloseHandle(hVxd);
ShowLastError();
}

а демонстрационная прога пишет, что не может загрузить DLL — я пробовал в WinXP — попробуйте в W98 95 2000?

Отредактировано Георгий — 27 Jun 2003, 00:03

User Attached Image Скачать файл
Read_ser.zip


Gedeon
Отправлено: 05.10.2005, 17:34


Ветеран

Группа: Модератор
Сообщений: 1742



Ну че таки нашлось
http://www.sources.ru/cpp/cpp_show_ide_inf...formation.shtml
под VC++ собралось без проблем.
Дальше дело техники.
Gedeon
Отправлено: 06.10.2005, 12:51


Ветеран

Группа: Модератор
Сообщений: 1742



Ну и вот проектик ВСВ

User Attached Image Скачать файл
HDD_Serial.zip


Deem
Отправлено: 10.10.2005, 10:15


Мастер участка

Группа: Участник
Сообщений: 327



Ой, блин, облом! В 98-м не фурычит! А я уже губу раскатил!
Дело в том, что проги сегодня не приходится ставить только на НТ. Бывают и 98-е.

Знаю такую фигню, как набор WMI. Кажися, дрова для того самого. В 2000 и ХР стоят. В 98-м отдельно надо ставить. Сильно не разобрался еще. Инсталляхи не нашел.

А уважаемый gedeon, как знающий уже истину и глубоко вникший в суть проблемы, может подскажет, как заточить пример под 98? Если есть , канеша, такой вариант.
Gedeon
Отправлено: 10.10.2005, 10:27


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE

А уважаемый gedeon, как знающий уже истину и глубоко вникший в суть проблемы, может подскажет, как заточить пример под 98? Если есть , канеша, такой вариант.


Я бы рад smile.gif , да вот в суть-то как раз особо не вникал, собрал, заработало, зашибись, на 98 до сегодня не проверял, щас проверил — не работает, а разобраться там надо репу долго напрягать, т.к. мне без надобности — интерес в основном академический, то в ближайшее время и не планирую, времени у меня нет на такие радости. Но я думаю заинтересованные люди найдутся, тогда почитаем.
Deem
Отправлено: 10.10.2005, 10:52


Мастер участка

Группа: Участник
Сообщений: 327



"Хочешь что-нибудь сделать хорошо — сделай это сам."  — эт верно.
...И грустно...
radiofun
Отправлено: 10.10.2005, 19:20


Ученик-кочегар

Группа: Участник
Сообщений: 20



Функция
GetVolumeInformation();
выдает тоже серийник винта?
Георгий
Отправлено: 10.10.2005, 23:42


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (radiofun @ 10/10/2005, 20:20)
Функция
GetVolumeInformation();
выдает тоже серийник винта?

неа.
он действительно выдаёт серийный номер, но не винта, а логического тома (раздела) который получается при форматировании.
исторически этот номер использовался, что бы ОС могла быстро обнаружить смену диска в дисководе — если номер изменился, значит вставили другую дискету. а для фиксированных дисков толку от этого числа... тем более у меня на ntfs этот номер был нулевой smile.gif

Вернуться в Вопросы программирования в C++Builder