PDA

View Full Version : سریال سخت افزاری هارد دیسک و مشکل در کامپونتها.



SYNDROME
سه شنبه 16 بهمن 1386, 17:10 عصر
یک سوال قبلا تکرار شده ولی یک مشکلی وجود دارد.
من می خواهم شماره سخت افزاری هارد را در بیاورم که البته در سایت کامپونتهایی برای این کار دوستان قرار داده اند که من از یکی از آنها استفاده کرده ام.
ولی یک مشکل اساسی دارد و آن آین است که زمانی که هارد IDE است مشکلی نیست ولی اگر هارد ساتا باشد کامپونت فوق سریال CD Rom و یا DVD Rom که متصل به کابل IDE است را بر می گرداند.
آیا دوست از این همه کامپونتی که در سایت است یکی را تست کرده اند که سریال هارد را برگرداند(چه IDE باشد و چه ساتا)
با تشکر از همه دوستان
موفق باشی

Valadi
سه شنبه 16 بهمن 1386, 17:48 عصر
با سلام علی جان
این کد ببین

unit hddinfo;

interface

uses Windows, SysUtils, Classes;

const
IOCTL_STORAGE_QUERY_PROPERTY = $2D1400;

type
THDDInfo = class (TObject)
private
FDriveNumber: Byte;
FFileHandle: Cardinal;
FInfoAvailable: Boolean;
FProductRevision: string;
FProductId: string;
FSerialNumber: string;
FVendorId: string;
procedure ReadInfo;
procedure SetDriveNumber(const Value: Byte);
public
constructor Create;
property DriveNumber: Byte read FDriveNumber write SetDriveNumber;
property VendorId: string read FVendorId;
property ProductId: string read FProductId;
property ProductRevision: string read FProductRevision;
property SerialNumber: string read FSerialNumber;
function SerialNumberInt: Cardinal;
function SerialNumberText: string;
function IsInfoAvailable: Boolean;
end;

implementation

type

STORAGE_PROPERTY_QUERY = packed record
PropertyId: DWORD;
QueryType: DWORD;
AdditionalParameters: array[0..3] of Byte;
end;

STORAGE_DEVICE_DESCRIPTOR = packed record
Version: ULONG;
Size: ULONG;
DeviceType: Byte;
DeviceTypeModifier: Byte;
RemovableMedia: Boolean;
CommandQueueing: Boolean;
VendorIdOffset: ULONG;
ProductIdOffset: ULONG;
ProductRevisionOffset: ULONG;
SerialNumberOffset: ULONG;
STORAGE_BUS_TYPE: DWORD;
RawPropertiesLength: ULONG;
RawDeviceProperties: array[0..511] of Byte;
end;

function ByteToChar(const B: Byte): Char;
begin
Result := Chr(B + $30)
end;

function SerialNumberToCardinal (SerNum: String): Cardinal;
begin
HexToBin(PChar(SerNum), PChar(@Result), SizeOf(Cardinal));
end;

function SerialNumberToString(SerNum: String): String;
var
I, StrLen: Integer;
Pair: string;
B: Byte;
Ch: Char absolute B;

begin
Result := '';
StrLen := Length(SerNum);

if Odd(StrLen) then Exit;

I := 1;

while I < StrLen do
begin
Pair := Copy (SerNum, I, 2);
HexToBin(PChar(Pair), PChar(@B), 1);
Result := Result + Chr(B);
Inc(I, 2);
end;

I := 1;

while I < Length(Result) do
begin
Ch := Result[I];
Result[I] := Result[I + 1];
Result[I + 1] := Ch;
Inc(I, 2);
end;
end;

constructor THddInfo.Create;
begin
inherited;

SetDriveNumber(0);
end;

function THDDInfo.IsInfoAvailable: Boolean;
begin
Result := FInfoAvailable
end;

procedure THDDInfo.ReadInfo;
type
PCharArray = ^TCharArray;
TCharArray = array[0..32767] of Char;

var
Returned: Cardinal;
Status: LongBool;
PropQuery: STORAGE_PROPERTY_QUERY;
DeviceDescriptor: STORAGE_DEVICE_DESCRIPTOR;
PCh: PChar;

begin
FInfoAvailable := False;
FProductRevision := '';
FProductId := '';
FSerialNumber := '';
FVendorId := '';

try
FFileHandle := CreateFile(
PChar('\\.\PhysicalDrive' + ByteToChar(FDriveNumber)),
0,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0
);

if FFileHandle = INVALID_HANDLE_VALUE then RaiseLastOSError;

ZeroMemory(@PropQuery, SizeOf(PropQuery));
ZeroMemory(@DeviceDescriptor, SizeOf(DeviceDescriptor));

DeviceDescriptor.Size := SizeOf(DeviceDescriptor);

Status := DeviceIoControl(
FFileHandle,
IOCTL_STORAGE_QUERY_PROPERTY,
@PropQuery,
SizeOf(PropQuery),
@DeviceDescriptor,
DeviceDescriptor.Size,
Returned,
nil
);

if not Status then RaiseLastOSError;

if DeviceDescriptor.VendorIdOffset <> 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.VendorIdOffset];
FVendorId := PCh;
end;

if DeviceDescriptor.ProductIdOffset <> 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.ProductIdOffset];
FProductId := PCh;
end;

if DeviceDescriptor.ProductRevisionOffset <> 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.ProductRevisionOffset];
FProductRevision := PCh;
end;

if DeviceDescriptor.SerialNumberOffset <> 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.SerialNumberOffset];
FSerialNumber := PCh;
end;

FInfoAvailable := True;
finally
if FFileHandle <> INVALID_HANDLE_VALUE then CloseHandle(FFileHandle);
end;
end;

function THDDInfo.SerialNumberInt: Cardinal;
begin
Result := 0;
if ((IsInfoAvailable = True) and (FSerialNumber <> '')) then Result := SerialNumberToCardinal(FSerialNumber)
end;

function THDDInfo.SerialNumberText: string;
begin
Result := '';
if ((IsInfoAvailable = True) and (FSerialNumber <> '')) then Result := SerialNumberToString(FSerialNumber)
end;

procedure THDDInfo.SetDriveNumber(const Value: Byte);
begin
FDriveNumber := Value;
ReadInfo;
end;

end.

اگر با این کد مشکلت حل نشد دو تا کامپونت حرفه ای دارم در این زمینه یکی شون برنامه که ضمیمه کردم
راستی علی جان برای قفل نرم افزاری بخواهی کامپونت جالبتری هم دارم

SYNDROME
سه شنبه 16 بهمن 1386, 21:58 عصر
چطوری Valadi عزیز.
کدی که گذاشتی مربوط به کامپونت HDDinfo است که دقیقاً مشکل فوق را دارد.
برنامه ای هم که گذاشتی فقط Exe است و نتوانستم Source را نگاه کن.
دوست عزیز من فقط یک کامپونت یا یک تکه Source می خواهم که بتواند سریال هارد را به درستی برگرداند چه هارد IDE باشد و چه ساتا.
منتظر راهنمایی همه دوستان هستم
موفق باشید

دنیای دلفی
چهارشنبه 17 بهمن 1386, 00:12 صبح
دوست عزیز کامپوننت HDDInfo مشکلی ندارد استفاده صحیح از آن نشده یعنی پارامترها را باید به صورت دستی داخلش ست کرد تا هارد شما چه IDE باشد چه SATA چه SCASI جواب درست دهید . این هم روش صحیح استفاده . تست و بعد نتیجه رو اعلام کن


// Try
// HDD:=THDDInfo.Create(HDD);
// HDD.Method := gimAuto;
// for ii :=0 to 7 do
// begin
// try
// case ii of
// 0:HDD.Drive:=dPrimaryMaster;
// 1:HDD.Drive:=dPrimarySlave;
// 2:HDD.Drive:=dQuaternaryMaster;
// 3:HDD.Drive:=dQuaternarySlave;
// 4:HDD.Drive:=dSecondaryMaster;
// 5:HDD.Drive:=dSecondarySlave;
// 6:HDD.Drive:=dTertiaryMaster;
// 7:HDD.Drive:=dTertiarySlave;
// end;
// case HDD.HDDType of
// dtFixed:
// if HDD.isIDE then
// if HDD.Serial[1] <> #0 then
// if Trim(HDD.Serial)<>'' then
// begin
// SerialCode:=HDD.Serial;
// Break;
// end;
// end;
//
// except
// end;
//
// end;
//
// HDD.Free;
// Except
// HDD.Free;
// end;

Valadi
چهارشنبه 17 بهمن 1386, 10:49 صبح
برنامه ای هم که گذاشتی فقط Exe است و نتوانستم Source را نگاه کن
برنامه ای گذاشتم سریال هارد Sata را می دهد یا نه ؟؟

mohebbi_en
چهارشنبه 17 بهمن 1386, 13:52 عصر
با سلام
component wmi set کارش دادن مشخصات تمام سخت افزارهاست.

SYNDROME
چهارشنبه 17 بهمن 1386, 15:40 عصر
برنامه ای گذاشتم سریال هارد Sata را می دهد یا نه ؟؟
من هاردم Sata نیست و نتوانستم تست کنم.
موفق باشید

Valadi
چهارشنبه 17 بهمن 1386, 17:03 عصر
علی جان این کامپونت و دمو هم داره ببین
موفق وموید باشید

SYNDROME
پنج شنبه 18 بهمن 1386, 22:17 عصر
علی جان این کامپونت و دمو هم داره ببین
موفق وموید باشید
دستت در د نکنه کارم راه افتاد.
کامپونتی که در این مجموعه بود هم نام کامپونتی بود که من داشتم ولی یکی از تابع هایی که برای شما داشتید کامپونت من نداشت و مشکل از همان جا بود.
موفق باشید