⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 取硬盘id.txt

📁 大量Delphi开发资料
💻 TXT
📖 第 1 页 / 共 2 页
字号:
请问怎样取得硬盘序列号呢?win98的系统中怎样取得.win2000中又怎样取得.有无通用的dll可供调用?是不是需要写什幺vxd,如何写?
我要的不是分区序列号.谢谢!!
请各位大侠帮忙.感激不尽!!!  


来自:app2001, 时间:2004-2-2 17:18:00, ID:2431931
这个资料你参考一下看看
type
  MIDPtr = ^MIDRec;
  MIDRec = Record
    InfoLevel: word;
    SerialNum: LongInt;
    VolLabel: Packed Array [0..10] of Char;
    FileSysType: Packed Array [0..7] of Char;
  end;

function GetDriveSerialNum(MID: MIDPtr; drive: Word): Boolean; assembler;
asm
  push  DS    { Just for safety, I dont think its really needed }
  mov   ax,440Dh { Function Get Media ID }
  mov   bx,drive    { drive no (0-Default, 1-A ...) }
  mov   cx,0866h  { category and minor code }
  lds   dx,MID      { Load pointeraddr. }
  call  DOS3Call   { Supposed to be faster than INT 21H }
  jc    @@err
  mov   al,1           { No carry so return TRUE }
  jmp   @@ok
 @@err:
  mov   al,0           { Carry set so return FALSE }
 @@ok:
  pop   DS            { Restore DS, were not supposed to change it }
end;

procedure TForm1.NrBtnClick(Sender: TObject);
var
  Info: MIDRec;
begin
  Info.InfoLevel:=0; { Information Level }
  If GetDriveSerialNum(@Info,0) then  { Do something with it... }
    ListBox.Items.Add(IntToStr(Info.SerialNum)+' '+Info.VolLabel);
end;



--------------------------------------------------------------------------------
BOOL GetVolumeInformation(

    LPCTSTR lpRootPathName, // address of root directory of the file system
    LPTSTR lpVolumeNameBuffer, // address of name of the volume
    DWORD nVolumeNameSize, // length of lpVolumeNameBuffer
    LPDWORD lpVolumeSerialNumber, // address of volume serial number
    LPDWORD lpMaximumComponentLength, // address of system's maximum filename length
    LPDWORD lpFileSystemFlags, // address of file system flags
    LPTSTR lpFileSystemNameBuffer, // address of name of file system
    DWORD nFileSystemNameSize  // length of lpFileSystemNameBuffer
   );



--------------------------------------------------------------------------------


获取SCSI硬盘序列号

问题提出/摘要:

对于IDE硬盘,你可以使用S.M.A.R.T. API的函数来获取序列号。但对SCSI硬盘,它无法工作。但我们可以使用DeviceIoControl来获取DeviceIoControl设备序列号.

 

 

回答:

  下面是代码:

  program ScsiSN;

 

  // 目的:简单的控制台程序来显示SCSI硬盘的序列号

 

  {$APPTYPE CONSOLE}

 

  uses

  Windows, SysUtils;

 

  //-------------------------------------------------------------

  function GetDeviceHandle( sDeviceName : String ) : THandle;

  begin

  Result := CreateFile( PChar('\\.\'+sDeviceName),

  GENERIC_READ or GENERIC_WRITE,

  FILE_SHARE_READ or FILE_SHARE_WRITE,

  nil, OPEN_EXISTING, 0, 0 )

  end;

 

  //-------------------------------------------------------------

  function ScsiHddSerialNumber( DeviceHandle : THandle ) : String;

  {$ALIGN ON}

  type

  TScsiPassThrough = record

  Length : Word;

  ScsiStatus : Byte;

  PathId : Byte;

  TargetId : Byte;

  Lun : Byte;

  CdbLength : Byte;

  SenseInfoLength : Byte;

  DataIn : Byte;

  DataTransferLength : ULONG;

  TimeOutValue : ULONG;

  DataBufferOffset : DWORD;

  SenseInfoOffset : ULONG;

  Cdb : Array[0..15] of Byte;

  end;

  TScsiPassThroughWithBuffers = record

  spt : TScsiPassThrough;

  bSenseBuf : Array[0..31] of Byte;

  bDataBuf : Array[0..191] of Byte;

  end;

  {ALIGN OFF}

  var dwReturned : DWORD;

  len : DWORD;

  Buffer : Array[0..255] of Byte;

  sptwb : TScsiPassThroughWithBuffers absolute Buffer;

  begin

  Result := '';

  FillChar(Buffer,SizeOf(Buffer),#0);

  with sptwb.spt do

  begin

  Length := SizeOf(TScsiPassThrough);

  CdbLength := 6; // CDB6GENERIC_LENGTH

  SenseInfoLength := 24;

  DataIn := 1; // SCSI_IOCTL_DATA_IN

  DataTransferLength := 192;

  TimeOutValue := 2;

  DataBufferOffset := PChar(@sptwb.bDataBuf)-PChar(@sptwb);

  SenseInfoOffset := PChar(@sptwb.bSenseBuf)-PChar(@sptwb);

  Cdb[0] := $12; // OperationCode := SCSIOP_INQUIRY;

  Cdb[1] := $01; // Flags := CDB_INQUIRY_EVPD; Vital product data

  Cdb[2] := $80; // PageCode Unit serial number

  Cdb[4] := 192; // AllocationLength

  end;

  len := sptwb.spt.DataBufferOffset+sptwb.spt.DataTransferLength;

  if DeviceIoControl( DeviceHandle, $0004d004, @sptwb, SizeOf(TScsiPassThrough), @sptwb, len, dwReturned, nil )

  and ((PChar(@sptwb.bDataBuf)+1)^=#$80)

  then

  SetString( Result, PChar(@sptwb.bDataBuf)+4,

  Ord((PChar(@sptwb.bDataBuf)+3)^) );

  end;

 

 

  //=============================================================

  var

  hDevice : THandle = 0;

  sSerNum, sDeviceName : String;

 

  begin

  sDeviceName := ParamStr(1);

  if sDeviceName='' then

  begin

  WriteLn;

  WriteLn('Display SCSI-2 device serial number.');

  WriteLn;

  WriteLn('Using:');

  WriteLn;

  if Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT/2000

  WriteLn(' ScsiSN PhysicalDrive0')

  else

  WriteLn(' ScsiSN C:');

  WriteLn(' ScsiSN Cdrom0');

  WriteLn(' ScsiSN Tape0');

  WriteLn;

  Exit;

  end;

  hDevice := GetDeviceHandle(sDeviceName);

  if hDevice=INVALID_HANDLE_VALUE then

  WriteLn('Error on GetDeviceHandle: ',SysErrorMessage(GetLastError))

  else

  try

  sSerNum := ScsiHddSerialNumber(hDevice);

  if sSerNum='' then

  WriteLn('Error on DeviceIoControl: ',

  SysErrorMessageGetLastError))

  else

  WriteLn('Device '+sDeviceName

  +' serial number = "',sSerNum,'"');

  finally

  CloseHandle(hDevice);

  end;

  end.

 

  // 以下站点可获取更多关于SCSI命令的信息:

  // ftp://ftp.t10.org/t10/drafts/scsi-1/

 

  // ftp://ftp.t10.org/t10/drafts/spc/

 

  // ftp://ftp.t10.org/t10/drafts/spc2/ 



--------------------------------------------------------------------------------


获取光盘序列号

uses MMSystem, MPlayer;

procedure TForm1.Button1Click(Sender: TObject);
var
  mp : TMediaPlayer;
  msp : TMCI_INFO_PARMS;
  MediaString : array[0..255] of char;
  ret : longint;
begin
  mp := TMediaPlayer.Create(nil);
  mp.Visible := false;
  mp.Parent := Application.MainForm;
  mp.Shareable := true;
  mp.DeviceType := dtCDAudio;
  mp.FileName := 'D:';
  mp.Open;
  Application.ProcessMessages;
  FillChar(MediaString, sizeof(MediaString), #0);
  FillChar(msp, sizeof(msp), #0);
  msp.lpstrReturn := @MediaString;
  msp.dwRetSize := 255;
  ret := mciSendCommand(Mp.DeviceId,
                        MCI_INFO,
                        MCI_INFO_MEDIA_IDENTITY,
                        longint(@msp));
  if Ret <> 0 then begin
   MciGetErrorString(ret, @MediaString, sizeof(MediaString));
   Memo1.Lines.Add(StrPas(MediaString));
  end else
    Memo1.Lines.Add(StrPas(MediaString));
  mp.Close;
  Application.ProcessMessages;
  mp.free;
end;

end.




--------------------------------------------------------------------------------


通过它你可以获取型号名称, firmware revision,序列号以及其它有关IDE硬盘的信息. 

 

 

回答:

  相关构件:

  IdeInfo.zip

  许多FAQ中推荐使用GetVolumeInformation来获取硬盘序列号。但是那获取的是卷的序列号,而不是硬盘的序列号。卷的序列号是在分区格式化时生成或修改。一些公司使用复制工具来为全部新计算机安装软件----通过将一个硬盘复制到其它硬盘,当然,所有这些计算机上卷的信息(包括序列号)都是相同的。

  

  我建议另外的一个方法:获取真正硬盘的序列号。

  不幸的是,下列代码只能工作在IDE硬盘上。

  

  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -