مكون HDDINFO لمعرفة الرقم التسلسلي للقرص الصلب
#1
الرجاء المساعدة من الإخوة في كيفية الحصول على الرقم التسلسلي للقرص الصلب باستعمال المكون HDDINFO وكيفية التعامل معه
الرد
#2
(05-10-2018, 07:01 PM)rachid1984 كتب : الرجاء المساعدة من الإخوة في كيفية الحصول على الرقم التسلسلي للقرص الصلب باستعمال المكون HDDINFO وكيفية التعامل معه

ممكن هذا المثال يفيدك


الملفات المرفقة
.rar   Volume Information.rar (الحجم : 52.61 ك ب / التحميلات : 34)
[-] كل من 1 user says قال شكرا ل bouh25 على المشاركة المفيدة
  • Intermediate Delphi programmer
الرد
#3
السلام عليكم تفضل
PHP كود :
uses
  Winapi
.WindowsSystem.SysUtils;

function 
GetDiskSerialNumberstring;
type
  TSrbIoControl 
packed record
    HeaderLength
ULONG;
 
   Signature: Array [.. 7of AnsiChar;
 
   TimeoutULONG;
 
   ControlCodeULONG;
 
   ReturnCodeULONG;
 
   LengthULONG;
 
 end;

 
 SRB_IO_CONTROL TSrbIoControl;
 
 PSrbIoControl = ^TSrbIoControl;

 
 TIDERegs packed record
    bFeaturesReg
Byte// Used for specifying SMART "commands".
 
   bSectorCountRegByte// IDE sector count register
 
   bSectorNumberRegByte// IDE sector number register
 
   bCylLowRegByte// IDE low order cylinder value
 
   bCylHighRegByte// IDE high order cylinder value
 
   bDriveHeadRegByte// IDE drive/head register
 
   bCommandRegByte// Actual IDE command.
 
   bReservedByte// reserved for future use. Must be zero.
 
 end;

 
 IDEREGS TIDERegs;
 
 PIDERegs = ^TIDERegs;

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

 
 SENDCMDINPARAMS TSendCmdInParams;
 
 PSendCmdInParams = ^TSendCmdInParams;

 
 TIdSector packed record
    wGenConfig
Word;
 
   wNumCylsWord;
 
   wReservedWord;
 
   wNumHeadsWord;
 
   wBytesPerTrackWord;
 
   wBytesPerSectorWord;
 
   wSectorsPerTrackWord;
 
   wVendorUnique: Array [.. 2of Word;
 
   sSerialNumber: Array [.. 19of AnsiChar;
 
   wBufferTypeWord;
 
   wBufferSizeWord;
 
   wECCSizeWord;
 
   sFirmwareRev: Array [.. 7of AnsiChar;
 
   sModelNumber: Array [.. 39of AnsiChar;
 
   wMoreVendorUniqueWord;
 
   wDoubleWordIOWord;
 
   wCapabilitiesWord;
 
   wReserved1Word;
 
   wPIOTimingWord;
 
   wDMATimingWord;
 
   wBSWord;
 
   wNumCurrentCylsWord;
 
   wNumCurrentHeadsWord;
 
   wNumCurrentSectorsPerTrackWord;
 
   ulCurrentSectorCapacityULONG;
 
   wMultSectorStuffWord;
 
   ulTotalAddressableSectorsULONG;
 
   wSingleWordDMAWord;
 
   wMultiWordDMAWord;
 
   bReserved: Array [.. 127of 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) - IDENTIFY_BUFFER_SIZE;
 
 BufferSize sizeof(SRB_IO_CONTROL) + DataSize;
 
 W9xBufferSize IDENTIFY_BUFFER_SIZE 16;
var
 
 hDeviceTHandle;
 
 cbBytesReturnedDWORD;
 
 pInDataPSendCmdInParams;
 
 pOutDataPointer// PSendCmdInParams;
 
 Buffer: Array [.. BufferSize 1of Byte;
 
 srbControlTSrbIoControl absolute Buffer;
 
 procedure ChangeByteOrder(var DataSizeInteger);
 
 var
    ptr
PAnsiChar;
 
   iInteger;
 
   cAnsiChar;
 
 begin
    ptr 
:= @Data;
 
   for i := 0 to (Size shr 1) - do
 
   begin
      c 
:= ptr^;
 
     ptr^ := (ptr 1)^;
 
     (ptr 1)^ := c;
 
     Inc(ptr2);
 
   end;
 
 end;

begin
  Result 
:= '';
 
 FillChar(BufferBufferSize#0);
 
 hDevice := CreateFile('\\.\PhysicalDrive0'GENERIC_READ or GENERIC_WRITE,
 
   FILE_SHARE_READ or FILE_SHARE_WRITEnilOPEN_EXISTING00);
 
 if hDevice INVALID_HANDLE_VALUE then
    Exit
;
 
 try
    pInData 
:= PSendCmdInParams(@Buffer);
 
   pOutData := PAnsiChar(@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(hDeviceDFP_RECEIVE_DRIVE_DATApInData,
 
     sizeof(TSendCmdInParams) - 1pOutDataW9xBufferSize,
 
     cbBytesReturnednilthen
      Exit
;
 
 finally
    CloseHandle
(hDevice);
 
 end;
 
 with PIdSector(PAnsiChar(pOutData) + 16)^ do
 
 begin
    ChangeByteOrder
(sSerialNumbersizeof(sSerialNumber));
 
   SetString(ResultsSerialNumbersizeof(sSerialNumber));
 
 end;
end
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
[-] كل من 2 users say قال شكرا ل S.FATEH على المشاركة المفيدة
  • invocker, Intermediate Delphi programmer
الرد
#4
(06-10-2018, 12:16 PM)S.FATEH كتب : السلام عليكم تفضل
PHP كود :
uses
  Winapi
.WindowsSystem.SysUtils;

function 
GetDiskSerialNumberstring;
type
  TSrbIoControl 
packed record
    HeaderLength
ULONG;
 
   Signature: Array [.. 7of AnsiChar;
 
   TimeoutULONG;
 
   ControlCodeULONG;
 
   ReturnCodeULONG;
 
   LengthULONG;
 
 end;

 
 SRB_IO_CONTROL TSrbIoControl;
 
 PSrbIoControl = ^TSrbIoControl;

 
 TIDERegs packed record
    bFeaturesReg
Byte// Used for specifying SMART "commands".
 
   bSectorCountRegByte// IDE sector count register
 
   bSectorNumberRegByte// IDE sector number register
 
   bCylLowRegByte// IDE low order cylinder value
 
   bCylHighRegByte// IDE high order cylinder value
 
   bDriveHeadRegByte// IDE drive/head register
 
   bCommandRegByte// Actual IDE command.
 
   bReservedByte// reserved for future use. Must be zero.
 
 end;

 
 IDEREGS TIDERegs;
 
 PIDERegs = ^TIDERegs;

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

 
 SENDCMDINPARAMS TSendCmdInParams;
 
 PSendCmdInParams = ^TSendCmdInParams;

 
 TIdSector packed record
    wGenConfig
Word;
 
   wNumCylsWord;
 
   wReservedWord;
 
   wNumHeadsWord;
 
   wBytesPerTrackWord;
 
   wBytesPerSectorWord;
 
   wSectorsPerTrackWord;
 
   wVendorUnique: Array [.. 2of Word;
 
   sSerialNumber: Array [.. 19of AnsiChar;
 
   wBufferTypeWord;
 
   wBufferSizeWord;
 
   wECCSizeWord;
 
   sFirmwareRev: Array [.. 7of AnsiChar;
 
   sModelNumber: Array [.. 39of AnsiChar;
 
   wMoreVendorUniqueWord;
 
   wDoubleWordIOWord;
 
   wCapabilitiesWord;
 
   wReserved1Word;
 
   wPIOTimingWord;
 
   wDMATimingWord;
 
   wBSWord;
 
   wNumCurrentCylsWord;
 
   wNumCurrentHeadsWord;
 
   wNumCurrentSectorsPerTrackWord;
 
   ulCurrentSectorCapacityULONG;
 
   wMultSectorStuffWord;
 
   ulTotalAddressableSectorsULONG;
 
   wSingleWordDMAWord;
 
   wMultiWordDMAWord;
 
   bReserved: Array [.. 127of 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) - IDENTIFY_BUFFER_SIZE;
 
 BufferSize sizeof(SRB_IO_CONTROL) + DataSize;
 
 W9xBufferSize IDENTIFY_BUFFER_SIZE 16;
var
 
 hDeviceTHandle;
 
 cbBytesReturnedDWORD;
 
 pInDataPSendCmdInParams;
 
 pOutDataPointer// PSendCmdInParams;
 
 Buffer: Array [.. BufferSize 1of Byte;
 
 srbControlTSrbIoControl absolute Buffer;
 
 procedure ChangeByteOrder(var DataSizeInteger);
 
 var
    ptr
PAnsiChar;
 
   iInteger;
 
   cAnsiChar;
 
 begin
    ptr 
:= @Data;
 
   for i := 0 to (Size shr 1) - do
 
   begin
      c 
:= ptr^;
 
     ptr^ := (ptr 1)^;
 
     (ptr 1)^ := c;
 
     Inc(ptr2);
 
   end;
 
 end;

begin
  Result 
:= '';
 
 FillChar(BufferBufferSize#0);
 
 hDevice := CreateFile('\\.\PhysicalDrive0'GENERIC_READ or GENERIC_WRITE,
 
   FILE_SHARE_READ or FILE_SHARE_WRITEnilOPEN_EXISTING00);
 
 if hDevice INVALID_HANDLE_VALUE then
    Exit
;
 
 try
    pInData 
:= PSendCmdInParams(@Buffer);
 
   pOutData := PAnsiChar(@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(hDeviceDFP_RECEIVE_DRIVE_DATApInData,
 
     sizeof(TSendCmdInParams) - 1pOutDataW9xBufferSize,
 
     cbBytesReturnednilthen
      Exit
;
 
 finally
    CloseHandle
(hDevice);
 
 end;
 
 with PIdSector(PAnsiChar(pOutData) + 16)^ do
 
 begin
    ChangeByteOrder
(sSerialNumbersizeof(sSerialNumber));
 
   SetString(ResultsSerialNumbersizeof(sSerialNumber));
 
 end;
end

السلام عليكم
يشتغل مع وينداوز 7 فقط و لايشتغل مع وينداوز 10
هل من تعديل لكي يشتغل مع النسخ الاعلى و شكرا
و من طلب العلوم بغير كد _________ سيدركها إذا شاب الغراب
[-] كل من 1 user says قال شكرا ل bassem_43 على المشاركة المفيدة
  • Intermediate Delphi programmer
الرد
#5
وعليكم السلام

جرب هذا


uses
Windows;

function GetHardDiskSerialNumber: string;
const
IOCTL_STORAGE_QUERY_PROPERTY = $2D1400;
StorageDeviceProperty = 0;
IsWindows10OrGreater = $A0;
MAX_PATH = 260;
type
STORAGE_PROPERTY_QUERY = record
PropertyId: DWORD;
QueryType: DWORD;
AdditionalParameters: array [0..3] of Byte;
end;
STORAGE_DESCRIPTOR_HEADER = record
Version: DWORD;
Size: DWORD;
end;
STORAGE_DEVICE_DESCRIPTOR = record
Version: DWORD;
Size: DWORD;
DeviceType: Byte;
DeviceTypeModifier: Byte;
RemovableMedia: Boolean;
CommandQueueing: Boolean;
VendorIdOffset: DWORD;
ProductIdOffset: DWORD;
ProductRevisionOffset: DWORD;
SerialNumberOffset: DWORD;
BusType: DWORD;
RawPropertiesLength: DWORD;
RawDeviceProperties: array [0..0] of Byte;
end;
var
hDevice: THandle;
bytesReturned: DWORD;
propQuery: STORAGE_PROPERTY_QUERY;
descHeader: STORAGE_DESCRIPTOR_HEADER;
descBuffer: array [0..MAX_PATH] of Byte;
deviceDescriptor: STORAGE_DEVICE_DESCRIPTOR absolute descBuffer;
serialNumber: PAnsiChar;
begin
Result := '';

hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then
Exit;

propQuery.PropertyId := StorageDeviceProperty;
propQuery.QueryType := PropertyStandardQuery;

if not DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, @propQuery,
SizeOf(STORAGE_PROPERTY_QUERY), @descBuffer, SizeOf(descBuffer),
bytesReturned, nil) then
begin
CloseHandle(hDevice);
Exit;
end;

descHeader := STORAGE_DESCRIPTOR_HEADER(descBuffer);
serialNumber := PAnsiChar(@descBuffer[deviceDescriptor.SerialNumberOffset]);
Result := string(serialNumber);

CloseHandle(hDevice);
end;
[-] كل من 2 users say قال شكرا ل ALG2009 على المشاركة المفيدة
  • bassem_43, Intermediate Delphi programmer
الرد
#6
(11-05-2024, 08:58 PM)ALG2009 كتب : وعليكم السلام

جرب هذا


uses
Windows;

function GetHardDiskSerialNumber: string;
const
IOCTL_STORAGE_QUERY_PROPERTY = $2D1400;
StorageDeviceProperty = 0;
IsWindows10OrGreater = $A0;
MAX_PATH = 260;
type
STORAGE_PROPERTY_QUERY = record
PropertyId: DWORD;
QueryType: DWORD;
AdditionalParameters: array [0..3] of Byte;
end;
STORAGE_DESCRIPTOR_HEADER = record
Version: DWORD;
Size: DWORD;
end;
STORAGE_DEVICE_DESCRIPTOR = record
Version: DWORD;
Size: DWORD;
DeviceType: Byte;
DeviceTypeModifier: Byte;
RemovableMedia: Boolean;
CommandQueueing: Boolean;
VendorIdOffset: DWORD;
ProductIdOffset: DWORD;
ProductRevisionOffset: DWORD;
SerialNumberOffset: DWORD;
BusType: DWORD;
RawPropertiesLength: DWORD;
RawDeviceProperties: array [0..0] of Byte;
end;
var
hDevice: THandle;
bytesReturned: DWORD;
propQuery: STORAGE_PROPERTY_QUERY;
descHeader: STORAGE_DESCRIPTOR_HEADER;
descBuffer: array [0..MAX_PATH] of Byte;
deviceDescriptor: STORAGE_DEVICE_DESCRIPTOR absolute descBuffer;
serialNumber: PAnsiChar;
begin
Result := '';

hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then
Exit;

propQuery.PropertyId := StorageDeviceProperty;
propQuery.QueryType := PropertyStandardQuery;

if not DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY, @propQuery,
SizeOf(STORAGE_PROPERTY_QUERY), @descBuffer, SizeOf(descBuffer),
bytesReturned, nil) then
begin
CloseHandle(hDevice);
Exit;
end;

descHeader := STORAGE_DESCRIPTOR_HEADER(descBuffer);
serialNumber := PAnsiChar(@descBuffer[deviceDescriptor.SerialNumberOffset]);
Result := string(serialNumber);

CloseHandle(hDevice);
end;
بارك الله فيك
لقد وجدت هاته الوحدة و تفي بالغرض
unit Unit2;

interface

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

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

var
Form4: TForm4;

implementation

{$R *.dfm}

function GetWMIstring (wmiHost, wmiClass, wmiProperty : string)Confusedtring;
var // These are all needed for the WMI querying process
Locator: ISWbemLocator;
Services: ISWbemServices;
SObject: ISWbemObject;
ObjSet: ISWbemObjectSet;
SProp: ISWbemProperty;
Enum: IEnumVariant;
Value: Cardinal;
TempObj: OleVariant;
SN: string;
begin
try
Locator := CoSWbemLocator.Create; // Create the Location object
// Connect to the WMI service, with the root\cimv2 namespace
Services := Locator.ConnectServer(wmiHost, 'root\cimv2', '', '', '','', 0, nil);
ObjSet := Services.ExecQuery('SELECT * FROM '+wmiClass, 'WQL',
wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
Enum := (ObjSet._NewEnum) as IEnumVariant;
while (Enum.Next(1, TempObj, Value) = S_OK) do
begin
SObject := IUnknown(tempObj) as ISWBemObject;
SProp := SObject.Properties_.Item(wmiProperty, 0);
if VarIsNull(SProp.Get_Value) then
result := ''
else
begin
SN := SProp.Get_Value;
result := SN;
end;
end;
except // Trap any exceptions (Not having WMI installed will cause one!)
on exception do
result := '';
end;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
xConfusedtring;
YConfusedtring;

begin


X:=GetWMIstring('','Win32_BIOS','SerialNumber');
Y:=GetWMIstring('','Win32_DiskDrive"','SerialNumber') ;

ShowMessage(x+';'+y);
end;

end.
و من طلب العلوم بغير كد _________ سيدركها إذا شاب الغراب
[-] كل من 2 users say قال شكرا ل bassem_43 على المشاركة المفيدة
  • ALG2009, Intermediate Delphi programmer
الرد
#7
يجب البحث عن حل قوي ومضمون فكل هذه الامثلة هنا قد تعمل وقد لا تعمل احيانا
وعدم عملها يتزامن مع ان موجه الاوامر ايضا لا يستطيع قراءة الرقم التسلسلي

والمشكلة ربما في ملفات النظام او في القرص نفسه لا احد يعلم ولكن يبدو ان هناك من يستطيع تجاوز هذه المشاكل
مثل CrystalDiskInfo
ولهذا لابد من وجود طريقة افضل واضمن
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
[-] كل من 1 user says قال شكرا ل Delphi4Us على المشاركة المفيدة
  • أبو معاذ
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم