Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

HDD s/n   Найти похожие ветки 

 
Evg12   (2004-01-21 18:46) [0]

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


 
Intell ©   (2004-01-21 20:51) [1]

А что, они чем-то отличаются?


 
hyper_omsk ©   (2004-01-22 05:52) [2]

Попробуй это:


   procedure TForm1.Button1Click(Sender: TObject);
var

SerialNum : dword;
a, b : dword;
Buffer  : array [0..255] of char;
begin

if GetVolumeInformation("c:\", Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then
Label1.Caption := IntToStr(SerialNum);
end;  


 
Alex Konshin ©   (2004-01-22 05:54) [3]

Устал я, устал бороться...


 
Alex Konshin ©   (2004-01-22 06:03) [4]

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


 
Polevi ©   (2004-01-22 10:03) [5]

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


 
pavel_guzhanov ©   (2004-01-22 10:03) [6]

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


 
Intell ©   (2004-01-23 18:43) [7]

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


 
nikkie ©   (2004-01-23 19:10) [8]

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

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

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


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

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


 
Alex Konshin ©   (2004-01-23 21:56) [10]

Для 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.


 
Alex Konshin ©   (2004-01-23 22:50) [11]

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


 
Alex Konshin ©   (2004-01-24 23:49) [19]

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


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

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


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

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


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

HDD - ST340016A, IDE - ATA/ATAPI Controllers

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


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

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


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 и какой даты :)


 
Alex Konshin ©   (2004-01-26 02:37) [24]

Теперь видно, что старый.
Теперь очень простой вопрос: ты уверен, что твой диск стоит на контроллере Scsi0 и что он там самый первый? Скорее всего нет.
Именно поэтому я и изменил потом IdeSN2 так, чтоб он пытался найти какой-нибудь диск на каком-нибудь контроллере, иначе люди просто использовали пример как есть и, естественно, потом заловались, что он "не работает". В то же время пример демонстрировал как это сделать именно для первого диска первого контроллера и предполагалось, что люди сами допишут то, что им нужно в их конкретной ситуации. Как оказалось, никто на это уточнение внимание не обращал :). Короче, мне надоело отвечать подобные на письма и я дописал свой пример так, чтоб было более понятно, как им пользоваться.
Так что бегом на мой сайт за более новой версией!


 
Alex Konshin ©   (2004-01-26 02:41) [25]

Evg12   (25.01.04 11:35) [21]
http://www.winsim.com/diskid32/diskid32.html чего-нибудь выдает?
Он работает через собственный vxd. Это должно быть более надежно.


 
ЮрЫк   (2004-01-26 21:18) [26]

Блин, большое спасибо, Алекс, все работает. Сейчас еще под 98 протестирую и тогда с меня пиво...


 
Evg12   (2004-01-29 22:53) [27]

To Alex Konshin: Еслиб это еще и на паскале было б...


 
Alex Konshin ©   (2004-01-30 05:14) [28]

Evg12   (29.01.04 22:53) [27]
Не, так если он выдает, то просто используй их vxd.
Какие проблемы?


 
Evg12   (2004-01-30 13:20) [29]

To Alex Konshin: Он то выдает, проверил на всем что под руки попалось.
Проблема вот какая: В VXD передавать команды надо и обрабатывать результат А у меня лично познаний в С столько, что можно сдавать в мерную палату, как абсолютный 0. Врядли смогу перенести DISKID32.CPP в паскаль без багов.
Может у когото есть время немного, Да займется...
А за одно раз уж все это в ринге 0, попутно в VXD добавит функции чтения и записи в аппаратные порты байта, Word и LongWord. (LPT, COM там всеякие). В хозяйстве былаб полезная вещ!


 
Alex Konshin ©   (2004-01-30 22:11) [30]

Насчет записи в порты - таких вещей уже много.
Насчет перевести - посмотрю. Может даже имеет смысл сделать свой vxd. Но у меня не на чем тестировать, ставить же ME мне чего-то не хочется.


 
Evg12   (2004-01-31 01:31) [31]

To Alex Konshin: 1. Ну а так будет два в одном. по моему разумно. Тем более, что если отсеять все дерьмо - остается практически один - ZLPortIO со включеным  zliosetiopm(true)
(Особо отвратительный из всех - LPTIO Автор: Гречко Ю.Б.).
2. Не надо делать свой. Не знаю как кто я лично придерживаюсь мнения автомехаников - "Не мешай машине ездить" работает, и хрен сней. Я уверен если перегнать максимально близко к сишному исходнику то пойдет с первого раза. На крайняк мне сольеш, я тестону. Только обрати внимание на DeviceIoControl ->  IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER, что то я этого момента в упор не понял.


 
Alex Konshin ©   (2004-01-31 09:00) [32]

IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER по идее это для media, то есть, например, для CD или для USB flash.
Но тут http://msdn.microsoft.com/library/default.asp?url=/library/en-us/storage/hh/storage/k307_6r02.asp
вот что пишут:

Queries the USB generic parent driver for the serial number of a USB device. If a USB device has a CSM-1 content security interface, a USB client driver can query for its serial number using this request. USB client drivers that help implement a digital rights management (DRM) system can use this information to ensure that only legitimate customers have access to digitized intellectual property.


 
alexey_ar   (2004-02-01 11:11) [33]

все кто писали, что программа от Alex Konshin не работает - проверьте прав ли я в своем предположении: не работает, если запускать под Win95/98/Me и винт стоит Primary/Slave без мастера?


 
Alex Konshin ©   (2004-02-02 05:54) [34]

Попрубуйте это:
http://home.earthlink.net/~akonshin/files/IdeSN3b.zip
На Windows 9x/ME нужно скопировать прилагаемый ide21201.vxd в директорий \windows\system\iosubsys и возможно перезагрузится.
Если он работает, то тогда уже попробуем избавится от перезагрузки.

Я его не проверял на 95/ME, так как негде. Попробуйте и сообщите о результатах.


 
Pavel   (2004-02-02 10:39) [35]

Попробуй этот вариант. Проверено под Win98se.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics,
 Controls, Forms, Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

function GetIdeDiskSerialNumber(nn: integer) : String;
type
 TSrbIoControl = packed record
   HeaderLength : ULONG;
   Signature : Array[0..7] of Char;
   Timeout : ULONG;
   ControlCode : ULONG;
   ReturnCode : ULONG;
   Length : ULONG;
 end;
 SRB_IO_CONTROL = TSrbIoControl;
 PSrbIoControl = ^TSrbIoControl;

 TIDERegs = packed record
   bFeaturesReg : Byte; // Used for specifying SMART "commands".
   bSectorCountReg : Byte; // IDE sector count register
   bSectorNumberReg : Byte; // IDE sector number register
   bCylLowReg : Byte; // IDE low order cylinder value
   bCylHighReg : Byte; // IDE high order cylinder value
   bDriveHeadReg : Byte; // IDE drive/head register
   bCommandReg : Byte; // Actual IDE command.
   bReserved : Byte; // reserved for future use. Must be zero.
 end;
 IDEREGS = TIDERegs;
 PIDERegs = ^TIDERegs;

 TSendCmdInParams = packed record
   cBufferSize : DWORD; // Buffer size in bytes
   irDriveRegs : TIDERegs; // Structure with drive register values.
   bDriveNumber : Byte; // Physical drive number to send command to (0,1,2,3).
   bReserved : Array[0..2] of Byte; // Reserved for future expansion.
   dwReserved : Array[0..3] of DWORD; // For future use.
   bBuffer : Array[0..0] of Byte; // Input buffer.
 end;
 SENDCMDINPARAMS = TSendCmdInParams;
 PSendCmdInParams = ^TSendCmdInParams;

 TIdSector = packed record
   wGenConfig : Word;
   wNumCyls : Word;
   wReserved : Word;
   wNumHeads : Word;
   wBytesPerTrack : Word;
   wBytesPerSector : Word;
   wSectorsPerTrack : Word;
   wVendorUnique : Array[0..2] of Word;
   sSerialNumber : Array[0..19] of Char;
   wBufferType : Word;
   wBufferSize : Word;
   wECCSize : Word;
   sFirmwareRev : Array[0..7] of Char;
   sModelNumber : Array[0..39] of Char;
   wMoreVendorUnique : Word;
   wDoubleWordIO : Word;
   wCapabilities : Word;
   wReserved1 : Word;
   wPIOTiming : Word;
   wDMATiming : Word;
   wBS : Word;
   wNumCurrentCyls : Word;
   wNumCurrentHeads : Word;
   wNumCurrentSectorsPerTrack : Word;
   ulCurrentSectorCapacity : ULONG;
   wMultSectorStuff : Word;
   ulTotalAddressableSectors : ULONG;
   wSingleWordDMA : Word;
   wMultiWordDMA : Word;
   bReserved : Array[0..127] of Byte;
 end;
 PIdSector = ^TIdSector;

const
 IDE_ID_FUNCTION = $EC;
 IDENTIFY_BUFFER_SIZE = 512;
 DFP_RECEIVE_DRIVE_DATA = $0007c088;
 IOCTL_SCSI_MINIPORT = $0004d008;
 IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
 DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
 BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
 W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
var
 hDevice : THandle;
 cbBytesReturned : DWORD;
 pInData : PSendCmdInParams;
 pOutData : Pointer; // PSendCmdInParams;
 Buffer : Array[0..BufferSize-1] of Byte;
 srbControl : TSrbIoControl absolute Buffer;

 procedure ChangeByteOrder( var Data; Size : Integer );
 var ptr : PChar;
     i : Integer;
     c : Char;
 begin
   ptr := @Data;
   for i := 0 to (Size shr 1)-1 do
   begin
     c := ptr^;
     ptr^ := (ptr+1)^;
     (ptr+1)^ := c;
     Inc(ptr,2);
   end;
 end;

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 := nn;
         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, CREATE_NEW, 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 := nn;
         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;

procedure TForm1.Button1Click(Sender: TObject);
var s : String;
  rc : DWORD;
   i : Byte;
begin
Memo1.Lines.Clear;
for i:=0 to 3 do
begin
 s := GetIdeDiskSerialNumber(i);
 if s="" then
   begin
     rc := GetLastError;
     if rc=0 then
      Memo1.Lines.Add(IntToStr(i)+":   "+"IDE drive is not support SMART feature")
      else Memo1.Lines.Add("SysErrorMessage "+IntToStr(rc));
   end
 else Memo1.Lines.Add(IntToStr(i)+":   "+"Disk serial number: "+s);
end;
end;

end.


 
Alex Konshin ©   (2004-02-02 10:51) [36]

:)))
Ты это мне предлагаешь? :-)))

Вот почему вредно не сохранять копирайты.


 
Evg12   (2004-02-02 15:13) [37]

Попробовал.
IdeSN строка 310 Ошибка: System Error Code 87 "Параметр задан не верно".


 
Alex Konshin ©   (2004-02-02 21:15) [38]

А, ну да, тяжело писать на нескольких языках сразу :).
Убери удвоение backslash (символов "\"), должно быть так:
hVxd := CreateFile( "\\.\IDE21201.VXD", 0, 0, nil, 0, FILE_FLAG_DELETE_ON_CLOSE, 0 );
Все остальное вроде выглядит как в оригинале.
Попробуй еще.


 
Evg12   (2004-02-03 04:47) [39]

Ты прав. Пашет на ура. Правда я уже и сам исправил.
Хреново что в хэлпе что-то на эту тему очень слабовато написано. Пришлось смотреть как народ делает.
Спасибо!!!


 
Alex Konshin ©   (2004-02-03 05:08) [40]

А перезагрузка требуется?



Страницы: 1 2 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.037 c
1-1081434681
hawkins
2004-04-08 18:31
2004.04.25
Помогите в разработке компонента


8-1074540760
nonameoo
2004-01-19 22:32
2004.04.25
Полноэкранный режим


4-1076996765
lucky4me
2004-02-17 08:46
2004.04.25
как работать с VersionInfo?


3-1080473634
Крутыш
2004-03-28 15:33
2004.04.25
На панели задач остаётся иконка приложения


1-1080740114
TankMan
2004-03-31 17:35
2004.04.25
Какое сообщение приходит при прокручивании скрола в ListBox?