Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

HDD s/n [D7, Win95/98, WinXP]


Страницы:   1 2 3

Evg12 ©   (2004-01-21 18:46:00) 

Уважаемые нужно узнать серийный (заводской) номер первого HDD носителя. (не диска C:)
Просмотрел несколько наработок на эту тему, например от Alex Konshin и т.д.
Все они прекрасно работают под NT-подобыми системами. И абсолютно не работоспособны под 95, 98.
Есть ли в природе исходник, работоспособный под всеми системами?
Ссылочку, плиззззз.


ЮрЫк   (2004-01-25 14:59:00) [21]

Вот фрагмент кода:


begin
Result := '';
FillChar(Buffer,BufferSize,#0);
if Win32Platform=VER_PLATFORM_WIN32_NT then
begin // Windows NT, Windows 2000
// Get SCSI port handle
hDevice := CreateFile( '\\.\Scsi0:', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
System.Move('SCSIDISK',srbControl.Signature,8);
srbControl.Timeout := 2;
srbControl.Length := DataSize;
srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
pInData := PSendCmdInParams(PChar(@Buffer)+SizeOf(SRB_IO_CONTROL));
pOutData := pInData;
with pInData^ do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
bDriveNumber := 0;
with irDriveRegs do
begin
bFeaturesReg := 0;
bSectorCountReg := 1;
bSectorNumberReg := 1;
bCylLowReg := 0;
bCylHighReg := 0;
bDriveHeadReg := $A0;
bCommandReg := IDE_ID_FUNCTION;
end;
end;
if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then Exit;
finally
CloseHandle(hDevice);
end;
end
else
begin // Windows 95 OSR2, Windows 98
hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, OPEN_EXISTING, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
pInData := PSendCmdInParams(@Buffer);
pOutData := PChar(@pInData^.bBuffer);
with pInData^ do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
bDriveNumber := 0;
with irDriveRegs do
begin
bFeaturesReg := 0;
bSectorCountReg := 1;
bSectorNumberReg := 1;
bCylLowReg := 0;
bCylHighReg := 0;
bDriveHeadReg := $A0;
bCommandReg := IDE_ID_FUNCTION;
end;
end;
if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil ) then Exit;
finally
CloseHandle(hDevice);
end;
end;
with PIdSector(PChar(pOutData)+16)^ do
begin
ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
end;
end;


Шоб я знал, какой это IdeSN2 и какой даты :)


ЮрЫк   (2004-01-25 14:54:00) [22]

HDD - ST340016A, IDE - ATA/ATAPI Controllers

а вот какой способ я использовал... хороший вопрос. Где это в исходнике... Сейчас буду искать, позже напишу


Evg12   (2004-01-25 11:35:00) [23]

Скажу еще больше. Нашел у себя драйвер, открывающий прямой доступ к портам под любой системой. Исправил исходник, который Alex Konshin выше запостил, так, чтоб все обращения к портам через драйвер делались. Опять, блин, прикол вылез - Под XP все работает, перегружаюсь в 98 и результат = 0.


Alex Konshin   (2004-01-24 23:51:00) [24]

И какой из примеров использовался для проверки (если IdeSN2, то какая дата)?


Alex Konshin   (2004-01-24 23:49:00) [25]

И какой контроллер?


Di   (2004-01-24 18:44:00) [26]

А что за винт стоит на том компе где не читается серийный номер?


ЮрЫк   (2004-01-24 16:22:00) [27]

вот у меня три компа - современных, Пень 4, на двух хард прочитывается серийный номер, а на другом ни под 98, ни под ХР хард не читается.


Alex Konshin   (2004-01-24 14:16:00) [28]

Сразу могу сказать, что есть харды, которые вне зависимости от операционки НЕ ЧИТАЮТСЯ...
Современных не встречал, потому как SMART включен в стандарт ATA.
Его можно отключить, так и включить не проблема.
Насчет smartvsd.vxd: я в 9x/ME велосипедов не изобретал, я просто добавил этот код для создания хоть какой-то совместимости. Реально те примеры создавались для поиска путей решения этой проблемы на NT+ системах, что более-менее удалось - все-таки я научился читать s/n с IDE дисков не имея прав админа. Можно было бы попытаться там двинуться дальше, но лично мне это было уже не интересно, да и времени не нашел.
Если посмотреть, как это делают другие, то видно, что ничего нового на NT с тех пор не изобрели (хотя странно), либо используется мой способ, либо пишется драйвер. До смешного доходит: иногда на просторах интернета слышу о появлении какого-то нового способа, скачиваю, смотрю, а там даже мой копирайт сохранен.
А на 9x/ME, как я уже говорил, мне неинтересно. Мне даже потестировать-то негде.


ЮрЫк   (2004-01-24 11:39:00) [29]

И еще интересный штрих smartvsd.vxd для того, чтобы заработал должен перегрузить комп, а иногда это непозволительная роскошь.


ЮрЫк   (2004-01-24 11:36:00) [30]

Сразу могу сказать, что есть харды, которые вне зависимости от операционки НЕ ЧИТАЮТСЯ...
Первый вариант мне дал VolumeLabel, а это далеко не то, что нужно.


Alex Konshin   (2004-01-24 00:27:00) [31]

Так я про NT и не говорю, там-то уж всяко лучше делать моим методом. Если приглядишься, то я в своих примерах систему проверяю, только вот на 9x/ME я пользуюсь smartvsd.vxd, а с ним-то и проблемы.


Evg12   (2004-01-24 00:11:00) [32]

To Alex Konshin: Только глянул, не проверял. А если проще сделать.
Проверять NT-евая система и в зависимости от результата тупо вызывать твою процедуру, или эту


Alex Konshin   (2004-01-23 22:50:00) [33]

Да, надеюсь понятно, что приведенный выше код не нужно пытаться использовать без изменений (так-то он точно не заработает), я его просто привел потому, что там видно какие порты нужно читать и как потом разбирать информацию.


Alex Konshin   (2004-01-23 21:56:00) [34]

Для primary-master точно должно работать. Если нет, то что-то не так в твоей системе. smartvsd.vxd, надеюсь, установлен правильно?

Ну есть, например, http://www.winsim.com/diskid32/diskid32.html
Опять-таки он ставит свой vxd.

Видел я где-то код на asm, который выходит в ring0 и читает порты без каких-либо vxd. Попробую вспомнить, где это было.  

Вот есть еще чей-то код прямого чтения-записи к портам, может это и сработает на Windows 98/ME (но что-то не верится):

{$IFDEF Windows}
 uses WinCrt;
{$ENDIF}
var
 InfoArray : array[0..255] of word;
 IdeInfo  : 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 absolute InfoArray;
 Count : byte;
 i : byte;
begin
 writeln('Информация о дисководах IDE:'^M^J);
{$IFDEF WINDOWS}
 for count := 1 to mem[  $0040:$0075] do begin
{$ELSE}
 for count := 1 to mem[Seg0040:$0075] do begin
{$ENDIF}
   FillChar(InfoArray, SizeOf(InfoArray), 0);
   {Проверить готовность}
   while (port[$1F7] and $80<>0) do ;
   {Запретить прерывания}
   port[$3f6] := 2;
   port[$1f6] := $A0 + ((count-1) shl 4);
   port[$1f7] := $EC;
   {Проверить готовность}
   while (port[$1F7] and $80<>0) do ;
   {Получить информацию}
   for i := 0 to 255 do InfoArray[i] := swap(portw[$1F0]);
   {Hапечатaть информацию}
   writeln('Информация о физическом диске ',count-1,^M^J);
   with IdeInfo do begin
     writeln('Емкость неформатированная :', 9.5367431641E-7* {1/2^20}
       swap(BPT)*swap(CylsTotal)*swap(HeadTotal):5:0, 'Mb');
     writeln('Емкость форматированная   :',
       longint(swap(SPT))*swap(CylsTotal)*swap(HeadTotal) div 2048:5, 'Mb');
     writeln('Число цилиндров           :', swap(CylsTotal):7);
     writeln('Число головок             :', swap(HeadTotal):7);
     writeln('Число секторов на дорожку :', swap(SPT):7);
     writeln('Число байт на дорожку*    :', swap(BPT):7);
     writeln('Число байт на сектор*     :', swap(BPS):7);
     writeln('Размер буфера             :', swap(BufSize):7);
     writeln('Код ECC                   :', swap(ECC):7);
     writeln(' * -- неформатированная емкость', ^M^J);
     writeln('Серийный номер            :', serial);
     writeln('Версия                    :',revision);
     writeln('Модель                    :',model);
   end;
   write('Hажмите любую клавишу...');
{$IFDEF WINDOWS}
   readkey;
{$ELSE}
   asm xor ah,ah ; int 16h end;
{$ENDIF}
   writeln(^M^J);
 end;
end.


Evg12   (2004-01-23 19:22:00) [35]

Повторяю для тупых и убогих: серийный (заводской) номер первого HDD носителя
То Alex Konshin: Действительно не пашет под виндой 98, почти днь потратил. Я бсделал но уменя познаний на низком уровне маловато. Может чье-то чужое есть, яб твою и ту в кучу б собрал.


nikkie   (2004-01-23 19:10:00) [36]

>Если ты укажешь D:\ (тотже вин) то он тотже серийник должен вывести.
а если взять и проверить?

GetVolumeInformation - возвращает серийный номер тома, выставляемый при форматировании.

>В чём разница получения серийника вина таким образом и другим (который ты ищешь)?
опять-таки взять и сравнить.


Intell   (2004-01-23 18:43:00) [37]

Дык. Я не понимаю - C:\ это лишь указатель на вин. В чём разница получения серийника вина таким образом и другим (который ты ищешь)? Или это я не врубаюсь - этот код по твоему получает номер раздела? Если ты укажешь D:\ (тотже вин) то он тотже серийник должен вывести. Я давно подобным кодом пользуюсь - каких либо подвохов не заметил.


pavel_guzhanov   (2004-01-22 10:03:00) [38]

На этом сайте есть компонент msysinfo, с примерами. У меня все работает.
http://www.torry.net/vcl/system/systeminfo/msysinfo.zip


Polevi   (2004-01-22 10:03:00) [39]

>Alex Konshin ©   (22.01.04 06:03) [4]
он не понял, но ведь работает :-)


Alex Konshin   (2004-01-22 06:03:00) [40]

hyper_omsk ©   (22.01.04 05:52) [2]
Ты вопрос-то понял?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо