View Full Version : کدی ناز برای بدست آوردن شماره سریال HDD
دنیای دلفی
دوشنبه 17 اسفند 1383, 14:41 عصر
این کد شماره سریال HDD بر می گرداند و من روی 20 سیستم مشابه تست کردم
حتی Fdisk هم انجام دادم کد تغییری پیدا نکرد این کد با VB به این دلیل اینجا Upload می کنمش که اگر می توانید تبدیلش کنید به Delphi
سورس
فایل اجرایی
و Dll مورد نیاز
موفق باشید
:موفق:
Delphi Skyline
دوشنبه 17 اسفند 1383, 15:52 عصر
اینا نه ناز هستند نه تبدیلش به Delphi مشکل داره.
اینا همش تو سایت www.Swissdelphicenter.com است .
برو اینجا هستش :
http://www.swissdelphicenter.com/en/showcode.php?id=57
بای ..........
امیدوارم موفق باشی.
:موفق: :موفق: :موفق: :موفق: :موفق: :موفق: :موفق:
دنیای دلفی
دوشنبه 17 اسفند 1383, 17:32 عصر
دست خوش دارم میرم ببینم اگه باشه خیلی عالیه
:موفق:
دنیای دلفی
دوشنبه 17 اسفند 1383, 17:36 عصر
اینا نه ناز هستند نه تبدیلش به Delphi مشکل داره.
اینا همش تو سایت www.Swissdelphicenter.com است .
برو اینجا هستش :
http://www.swissdelphicenter.com/en/showcode.php?id=57
بای ..........
امیدوارم موفق باشی.
عزیز جان برادر این چیزی که شما معرفی کردید شماره سریال HDD را نمیده بلکه شماره سریال یک درایو را میده که با فرمت یا افدیسک تغییر پیدا میکنه ولی چیزی که من ارسال کردم شماره سریال HDD را می دهد که منحصر بفرد است .
موفق باشی دوست گرامی
:)
دنیای دلفی
دوشنبه 17 اسفند 1383, 17:38 عصر
البته کدی فایلی را که Upload کردم فقط در NT, 2000 , XP کار می کنند .
:strange:
Delphi Skyline
دوشنبه 17 اسفند 1383, 18:39 عصر
سلام
برو همون جا (تو همون سایته)شاید باشه . بابا یکم تو INTERNET هم بگرد. مثلا تو GOOOOOOOOOGLE
بای
دنیای دلفی
دوشنبه 17 اسفند 1383, 18:51 عصر
بابا یکم تو INTERNET هم بگرد. مثلا تو GOOOOOOOOOGLE
جونی من همیشه Online هستم و اصلا من یک Search Engine هستم . :mrgreen:
عزیزم اگر نمی دونی چجوری اصلا خودت را خسته نکن . :sorry:
داداش یکم صبور باش .
:oops:
:strange: :موفق: :kaf:
مهدی کرامتی
دوشنبه 17 اسفند 1383, 19:28 عصر
برادر محترم، آقای Search Engine:
البته کدی فایلی را که Upload کردم فقط در NT, 2000 , XP کار می کنند
فکر میکنی اون فایل Smartvsd.vxd رو برای قشنگی درون فایل Rar جا داده اند؟
در ویندوزهای سری 9x برای اینکه بتوانید از توابع مربوطه استفاده کنید باید اون فایل رو در فولدر Windows\System کپی کنید و سیستم را Restart کنید.
در ضمن، من DLL ای در پکیج فوق ندیدم، بلکه تمام کار توسط فراخوانی توابع Windows Api انجام شده است.
اینم معادل اون کد در دلفی:
program IdeSN;
// PURPOSE: Simple console application that extract first IDE disk serial number.
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils; // only for Win32Platform and SysErrorMessage
//-------------------------------------------------------------
function GetIdeDiskSerialNumber : 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. Must be zero.
end;
IDEREGS = TIDERegs;
PIDERegs = ^TIDERegs;
TSendCmdInParams = packed record
cBufferSize : DWORD;
irDriveRegs : TIDERegs;
bDriveNumber : Byte;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte;
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; // PSendCmdOutParams
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 := 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,
CREATE_NEW, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
pInData := PSendCmdInParams(@Buffer);
pOutData := @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(sSerialNumbe r));
end;
end;
//================================================== ===========
var s : String;
rc : DWORD;
begin
s := GetIdeDiskSerialNumber;
if s='' then
begin
rc := GetLastError;
if rc=0 then WriteLn('IDE drive is not support SMART feature')
else WriteLn(SysErrorMessage(rc));
end
else WriteLn('Disk serial number: ''', s,'''');
end.
البته فراموش نشود که در ویندوزهای سری 9x حضور Smartvsd.vxd در فولدر System ویندوز برای اجرای این کد نیز ضروری است.
دنیای دلفی
دوشنبه 17 اسفند 1383, 21:40 عصر
آقای کرامتی مدیریت محترم سایت برنامه نویس
بسیار از شما متشکرم .
:موفق: :تشویق: :flower:
دنیای دلفی
سه شنبه 18 اسفند 1383, 11:22 صبح
جناب آقای کرامتی :
نمی دونم چرا شماره سریال HDD را نشون نمی ده من از اکس پی استفاده می کنم و HDD 80GB است البته نه VB نه Delphi آخه من کد مورد نظر VB را روی 20 سیستم که HDD همه آنها 40GB بود و CDDrive هم نداشتند امتحان کردم و سریال را برمی گرداند ولی الان روی کامپیوتر شخصی خودم که تست می کنم جواب نمی ده خطا نمی ده ولی کدی برنمی گردونه . به نظر شما مشکل کار چیه .
:موفق: :flower:
مهدی کرامتی
سه شنبه 18 اسفند 1383, 13:40 عصر
مشکل اینه که بعضی هارد دیسک ها استاندارد S.M.A.R.T را پشتیبانی نمیکند.
این همان مشخصه ای است که در توابع API فوق از آن برای بدست آوردن مشخصات هارد دیسک استفاده میشود. :wise2:
دنیای دلفی
سه شنبه 18 اسفند 1383, 13:57 عصر
مشکل اینه که بعضی هارد دیسک ها استاندارد S.M.A.R.T را پشتیبانی نمیکند.
آیا کامپوننتی وجود دارد که بتواند شماره سریال HDD را برگرداند اگر دارد لطفا معرفی کنید .
یا اگر شما روش دیگری دارید پیشنهاد بدهید .
ممنون و مچکر :flower: :تشویق: :موفق:
مهدی کرامتی
سه شنبه 18 اسفند 1383, 16:43 عصر
برای بدست آوردن شماره سریال سخت افزاری هارد دیسک راهی بجز استفاده از SMART نیست.
:sorry:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.