Форум: "Система";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
ВнизКак узнать серийный номер винта Найти похожие ветки
← →
snake7 (2003-07-14 18:38) [0]Подскажите как узнать серийный номер винта ФИЗИЧЕСКИЙ
не серийный номер раздела (getvolumeinfo)
а именно физический номер винта из под делфи!
Спасибо!
← →
Marser (2003-07-14 19:00) [1]var
SerialNum : dword;
a, b : dword;
Buffer : array [0..255] of char;
begin
GetVolumeInformation("c:\", Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0)
end;
← →
Marser (2003-07-14 19:07) [2]Прошу прощения, невнимательно прочитал, хотя в загашнике есть и это. Может, поможет:
Sernumu;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TMediaID = Record
InfoLevel : Word;
SerialNumber : LongInt;
VolumeLabel : Array[0..10] of Char;
SysName : Array[0..7] of Char;
End;
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
MediaID : TMediaID;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
type
DPMIRegisters =
record
DI : LongInt;
SI : LongInt;
BP : LongInt;
Reserved : LongInt;
BX : LongInt;
DX : LongInt;
CX : LongInt;
AX : LongInt;
Flags : Word;
ES : Word;
DS : Word;
FS : Word;
GS : Word;
IP : Word;
CS : Word;
SP : Word;
SS : Word;
end;
function RealIntr(IntNo : Byte; var Regs : DPMIRegisters) : Word; Assembler;
asm
xor bx,bx
mov bl,IntNo
xor cx,cx {StackWords = 0}
les di,Regs
mov ax,0300h
int 31h
jc @@ExitPoint
xor ax,ax
@@ExitPoint:
end;
function GetDiskInfo(Drive : Word; var MediaID : TMediaID) : Boolean;
type
tLong = Record
LoWord, HiWord : Word;
End;
var
Regs : DPMIRegisters;
dwAddress : LongInt;
Address : tLong absolute dwAddress;
begin
Result := False;
FillChar(MediaID, SizeOf(MediaID), 0);
dwAddress := GlobalDosAlloc(SizeOf(MediaID)); { два параграфа памяти DOS }
if dwAddress = 0
then { в случае ошибки адрес будет нулевым }
exit;
With Regs do
begin
bx := Drive;
cx := $66;
ds := Address.HiWord;
ax := $6900;
dx := 0;
es := 0;
flags := 0;
end;
If RealIntr($21, Regs) <> 0
Then
Exit;
Move(ptr(Address.LoWord, 0)^, MediaID, SizeOf(MediaID));
GlobalDosFree(Address.LoWord) ( Sender: TObject) Прошу прощения, невнимательно прочитал, хотя в загашнике есть и это. Может, поможет:
Sernumu;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TMediaID = Record
InfoLevel : Word;
SerialNumber : LongInt;
VolumeLabel : Array[0..10] of Char;
SysName : Array[0..7] of Char;
End;
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
MediaID : TMediaID;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
type
DPMIRegisters =
record
DI : LongInt;
SI : LongInt;
BP : LongInt;
Reserved : LongInt;
BX : LongInt;
DX : LongInt;
CX : LongInt;
AX : LongInt;
Flags : Word;
ES : Word;
DS : Word;
FS : Word;
GS : Word;
IP : Word;
CS : Word;
SP : Word;
SS : Word;
end;
function RealIntr(IntNo : Byte; var Regs : DPMIRegisters) : Word; Assembler;
asm
xor bx,bx
mov bl,IntNo
xor cx,cx {StackWords = 0}
les di,Regs
mov ax,0300h
int 31h
jc @@ExitPoint
xor ax,ax
@@ExitPoint:
end;
function GetDiskInfo(Drive : Word; var MediaID : TMediaID) : Boolean;
type
tLong = Record
LoWord, HiWord : Word;
End;
var
Regs : DPMIRegisters;
dwAddress : LongInt;
Address : tLong absolute dwAddress;
begin
Result := False;
FillChar(MediaID, SizeOf(MediaID), 0);
dwAddress := GlobalDosAlloc(SizeOf(MediaID)); { два параграфа памяти DOS }
if dwAddress = 0
then { в случае ошибки адрес будет нулевым }
exit;
With Regs do
begin
bx := Drive;
cx := $66;
ds := Address.HiWord;
ax := $6900;
dx := 0;
es := 0;
flags := 0;
end;
If RealIntr($21, Regs) <> 0
Then
Exit;
Move(ptr(Address.LoWord, 0)^, MediaID, SizeOf(MediaID));
GlobalDosFree(Address.LoWord) { освобождаем блок DOS памяти }
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetDiskInfo(1, MediaID);
With MediaID do
Begin
Label1.Caption := IntToHex(SerialNumber, 8);
Label2.Caption := VolumeLabel;
Label3.Caption := SysName;
End;
end;
end.
← →
ZZ (2003-07-14 19:12) [3]http://blackman.wp-club.net/myfaq/1212_23122002a.php#anc12
Читаем.. (знакомые лица :) и заходим на страницу http://home.earthlink.net/~akonshin/index.htm
Нашлось в google по запросу Как узнать серийный номер винта
← →
snake7 (2003-07-15 11:21) [4]ВСем спасибо за внимания , но примеры на сайте
http://home.earthlink.net/~akonshin/ работают конечно хорошо под
win 2k а под win98 не работают :(
Что делать? Где искать исходники?
Помогите!!!!!!!!
← →
snake7 (2003-07-15 11:55) [5]а пример присланый Marser в delphi7 вообще не компилица (много ошибок)
← →
Е-Моё имя (2003-07-15 12:05) [6]
> snake7 (15.07.03 11:55)
он его по памяти писал
← →
Alex Konshin (2003-07-15 12:19) [7]А ты прочитай readme, он специально для тебя написан.
Если же все сделано, как сказано, то он вполне может не работать по многим причинам:
- IdeSN читает серийный номер мастера на первом контроллере, чтоб читать другие - нужно изменить этот пример или использовать другой;
- у вас не ATA винчестер (редкость на Win9x, но почему бы и нет?);
- используется кривой драйвер для IDE контроллера, который не пропускает команды SMART (такое бывает с драйверами для ATA100);
Если все равно не работает - в сад, то есть не ко мне: я 9x видеть не вижу и видеть не хочу. В конце концов можете поискать примеры для прямой работы с портами под 9x.
← →
snake7 (2003-07-16 11:15) [8]Все что было написано в readme я зделал(файл SMARTVSD.VXD есть)
и винти у меня АТА66 WD 8GB, но ладно.
Я чуть-чуть поискал в инете и нашел исходник на VC++ который
нормально все читает и под win98 и win2k даже не требует никаких
vxd драйверов
Вот теперь пытаюсь засунуть этот исходник в dll чтобы потом из
делфи взять его ф-ии, но опять не получаеться!
Почемуто передача параметров гльчит!:(
← →
Alex Konshin (2003-07-16 11:36) [9]Охотно верю. Я не открывал Америку. В интернете есть много примеров о том, как использовать прямую работу с портами под 9x или использовать SMART API под NT+. Разница моих примеров только в том, что они работают в NT/2K/XP под ЛЮБЫМ аккаунтом, а не только под админом. Это не готовое решение, я только показываю как это сделать, и если с руками все в порядке, то все будет работать (естественно, если это принципиально возможно).
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c