MiR@Ge |
Отправлено: 19.06.2003, 13:58 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Приветствую всех обитателей форума!
Подскажите кто знает как определить серийный номер процессора и жесткого диска (не раздела, чей номер меняется при каждом форматировании). ОЧЕНЬ НАДО
Заранее спасибо! |
|
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
|
|
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
|
Ну и вот проектик ВСВ
|
|
Deem |
Отправлено: 10.10.2005, 10:15 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
Ой, блин, облом! В 98-м не фурычит! А я уже губу раскатил!
Дело в том, что проги сегодня не приходится ставить только на НТ. Бывают и 98-е.
Знаю такую фигню, как набор WMI. Кажися, дрова для того самого. В 2000 и ХР стоят. В 98-м отдельно надо ставить. Сильно не разобрался еще. Инсталляхи не нашел.
А уважаемый gedeon, как знающий уже истину и глубоко вникший в суть проблемы, может подскажет, как заточить пример под 98? Если есть , канеша, такой вариант.
|
|
Gedeon |
Отправлено: 10.10.2005, 10:27 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE |
А уважаемый gedeon, как знающий уже истину и глубоко вникший в суть проблемы, может подскажет, как заточить пример под 98? Если есть , канеша, такой вариант. |
Я бы рад , да вот в суть-то как раз особо не вникал, собрал, заработало, зашибись, на 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 этот номер был нулевой |
|
|