ممنون که همتون! که دانلود میکنین نتیجه رو میگین! بله احتمالا کاملا درست کار میکنه فقط در کامپوننت اصلی و برنامه ای که من نوشتم هم وقتی user یا کاربر ویندوز Limit باشه یا Guest باشه نمیتونه سریال رو پیدا کنه یعنی تابع GetDevInfoNTZeroRights درست عمل نمیکنه.اونم تقصیر من نیست به صاحب کامپوننت بگین!
حالا شما دوستان عزیز اگه فکر میکنین این مساله باید حل بشه یه راهنمایی بکنید.
اینم تابعش
function GetDevInfoNTZeroRights(devno : integer; name : string):string;
var
h:Cardinal;
i,j:integer;
query : STORAGE_PROPERTY_QUERY;
dwBytesReturned : dword;
buffer : array [0..9999] of ansichar;
sdd : STORAGE_DEVICE_DESCRIPTOR absolute buffer;
dgex : DISK_GEOMETRY_EX absolute buffer;
xbuf : array [1..127] of ansichar;
xname : string;
begin
scsiflag := true;
if name = '' then xname := '\\.\PhysicalDrive'+inttostr(devno)
else xname := '\\.\'+name;
h := CreateFile (pchar(xname), 0,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, 0, 0);
if h = INVALID_HANDLE_VALUE then raise Exception.Create('Can''t create device handle!');
try
dwBytesReturned := 0;
fillchar(InfoArray,sizeof(InfoArray),#0);
fillchar(query,SizeOf(query),#0);
fillchar(buffer,SizeOf(buffer),#0);
query.PropertyId := StorageDeviceProperty;
query.QueryType := PropertyStandardQuery;
if DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY , @query, SizeOf(query), @buffer, sizeof(buffer), dwBytesReturned, nil )
then
begin
IdeInfo.Config := sdd.DeviceType;
j := 1;
for i := sdd.ProductIdOffset to sdd.ProductIdOffset+39 do
begin
if buffer[i] = #0 then break;
if buffer[i] >= ' ' then
begin
Ideinfo.Model[j] := buffer[i];
inc(j);
end;
end;
j := 1;
for i := sdd.ProductRevisionOffset to sdd.ProductRevisionOffset + 7 do
begin
if buffer[i] = #0 then break;
Ideinfo.Revision[j] := Buffer[i];
inc(j);
end;
j := 1;
fillchar(xbuf,SizeOf(xbuf),#0);
for i := sdd.SerialNumberOffset to sdd.SerialNumberOffset + 127 do
begin
if Buffer[i] = #0 then break;
xbuf[j] := Buffer[i];
inc(j);
end;
converth(@xbuf[1],@Ideinfo.Serial[1],20);
end
else
begin
raise Exception.Create('GetDevInfoZeroRights filed!');
end;
if name <> '' then
begin
devno := 255;
if lowercase(copy(name,1,length(name)-1)) = 'physicaldrive' then
devno := ord(name[length(name)])-ord('0');
end;
if (devno >= 0) and (devno <= 3) then
begin
fillchar(buffer,SizeOf(buffer),#0);
if not DeviceIoControl(h,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX ,nil,0,@buffer,
sizeof(buffer),dwBytesReturned,nil)
then
if IdeInfo.Model[1] = #0 then raise Exception.Create('GetDevInfoZeroRights filed!')
else
begin
exit
end
else
begin
scsiflag := false;
if dgex.Geometry.MediaType = FixedMedia then
IdeInfo.Config := $0040
else
if dgex.Geometry.MediaType = RemovableMedia then
IdeInfo.Config := $0080;
IdeInfo.CylsTotal := dgex.Geometry.Cylinders;
IdeInfo.LBASectors := dgex.DiskSize div dgex.Geometry.BytesPerSector;
IdeInfo.BPS := dgex.Geometry.BytesPerSector;
IdeInfo.SPT := dgex.Geometry.SectorsPerTrack;
IdeInfo.HeadTotal := dgex.Geometry.TracksPerCylinder;
IdeInfo.BPT := dgex.Geometry.BytesPerSector * dgex.Geometry.SectorsPerTrack;
end;
end;
hddserial:=Trim(IdeInfo.Serial);
Result:=hddserial;
finally
CloseHandle(h);
end;
end;