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

📄 取硬盘id.txt

📁 大量Delphi开发资料
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  //获取第一个IDE硬盘的序列号 

  function GetIdeSerialNumber : SerialNumber; 

  const IDENTIFY_BUFFER_SIZE = 512; 

  type 

  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 for future use. Must be zero. 

  end; 

  TSendCmdInParams = packed record 

  // Buffer size in bytes 

  cBufferSize : DWORD; 

  // Structure with drive register values. 

  irDriveRegs : TIDERegs; 

  // Physical drive number to send command to (0,1,2,3). 

  bDriveNumber : BYTE; 

  bReserved : Array[0..2] of Byte; 

  dwReserved : Array[0..3] of DWORD; 

  bBuffer : Array[0..0] of Byte; // Input buffer. 

  end; 

  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 : DWORD; 

  wMultSectorStuff : Word; 

  ulTotalAddressableSectors : DWORD; 

  wSingleWordDMA : Word; 

  wMultiWordDMA : Word; 

  bReserved : Array[0..127] of BYTE; 

  end; 

  PIdSector = ^TIdSector; 

  TDriverStatus = packed record 

  // 驱动器返回的错误代码,无错则返回0

  bDriverError : Byte; 

  // IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效

  bIDEStatus : Byte; 

  bReserved : Array[0..1] of Byte; 

  dwReserved : Array[0..1] of DWORD; 

  end; 

  TSendCmdOutParams = packed record 

  // bBuffer的大小

  cBufferSize : DWORD; 

  // 驱动器状态

  DriverStatus : TDriverStatus; 

  // 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定

  bBuffer : Array[0..0] of BYTE; 

  end; 

  

  var hDevice : THandle; 

  cbBytesReturned : DWORD; 

  ptr : PChar; 

  SCIP : TSendCmdInParams; 

  aIdOutCmd : Array [0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte; 

  IdOutCmd : TSendCmdOutParams absolute aIdOutCmd; 

  

  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 := ''; // 如果出错则返回空串

  if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000 

  begin 

  // 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\'

  hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, 

  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); 

  end 

  else // Version Windows 95 OSR2, Windows 98 

  hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); 

  if hDevice=INVALID_HANDLE_VALUE then Exit; 

  try 

  FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0); 

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

  cbBytesReturned := 0; 

  // Set up data structures for IDENTIFY command. 

  with SCIP do 

  begin 

  cBufferSize := IDENTIFY_BUFFER_SIZE; 

  // bDriveNumber := 0; 

  with irDriveRegs do 

  begin 

  bSectorCountReg := 1; 

  bSectorNumberReg := 1; 

  // if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0 

  // else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4); 

  bDriveHeadReg := $A0; 

  bCommandReg := $EC; 

  end; 

  end; 

  if not DeviceIoControl( hDevice, $0007c088, @SCIP, SizeOf(TSendCmdInParams)-1, 

  @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil ) then Exit; 

  finally 

  CloseHandle(hDevice); 

  end; 

  with PIdSector(@IdOutCmd.bBuffer)^ do 

  begin 

  ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) ); 

  (PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0; 

  Result := PChar(@sSerialNumber); 

  end; 

  end; 

  

  // 更多关于 S.M.A.R.T. ioctl 的信息可查看:

  // http://www.microsoft.com/hwdev/download/respec/iocltapi.rtf 

  

  // MSDN库中也有一些简单的例子

  // Windows Development -> Win32 Device Driver Kit -> 

  // SAMPLE: SmartApp.exe Accesses SMART stats in IDE drives 

  

  // 还可以查看 http://www.mtgroup.ru/~alexk 

  // IdeInfo.zip - 一个简单的使用了S.M.A.R.T. Ioctl API的Delphi应用程序

  

  // 注意: 

  

  // WinNT/Win2000 - 你必须拥有对硬盘的读/写访问权限

  

  // Win98 

  // SMARTVSD.VXD 必须安装到 \windows\system\iosubsys 

  // (不要忘记在复制后重新启动系统) 

 

 

  
  


来自:einsteingod, 时间:2004-2-2 17:33:00, ID:2431992
试试
[DELPHI]得到硬盘序列号
var SerialNum : pdword; a, b : dword; Buffer : array [0..255] of char; 
begin 
if GetVolumeInformation('c:\', Buffer, SizeOf(Buffer), SerialNum, a, b, nil, 0) then Label1.Caption 
:= IntToStr(SerialNum^); 
end;  


来自:wind8bell, 时间:2004-2-2 17:36:00, ID:2432006
我有通用的dll文件(别人写的),留下mail,我发给你吧。(如果好用,注意给分哦。)
支持WIN 9X/NT/2K/XP及SCSI硬盘,在WIN NT/2K/XP(需admin)

函数声明:
VB:
Public Declare Function HDSerialNumRead Lib "HDSerialNumRead.dll" () As String

Delphi:
FUNCTION  HDSerialNumRead():PChar;  stdcall external 'HDSerialNumRead.dll';

PB:
FUNCTION string HDSerialNumRead () LIBRARY "HDSerialNumRead.dll"  


来自:goodbobi, 时间:2004-2-2 17:43:00, ID:2432024
TO:wind8bell
Win2k下要不是管理员会怎样呢?  


来自:fei_l, 时间:2004-2-2 23:38:00, ID:2432488
function GetDiskSerial(Drv:string):string;
function DecToHex(DecVal:LongInt):String;
const
     HexDigits : Array[0..15] of Char = '0123456789ABCDEF';
var
   Temp : String;
begin
    Temp := '';
    Temp := Temp + HexDigits[(DecVal shr 28) and $F];
    Temp := Temp + HexDigits[(DecVal shr 24) and $F];
    Temp := Temp + HexDigits[(DecVal shr 20) and $F];
    Temp := Temp + HexDigits[(DecVal shr 16) and $F];
    Temp := Temp + HexDigits[(DecVal shr 12) and $F];
    Temp := Temp + HexDigits[(DecVal shr 8) and $F];
    Temp := Temp + HexDigits[(DecVal shr 4) and $F];
    Temp := Temp + HexDigits[DecVal and $F];
    Result := Temp;
end;
var
   VolumeLabel, FileSystem: Array[0..$FF] of Char;
   SerialNumber, DW, SysFlags: DWord;
begin
     if (Drv >= 'A') and (Drv <= 'Z') then
        GetVolumeInformation(PChar(Drv+':\'),VolumeLabel,SizeOf(VolumeLabel),
                          @SerialNumber, DW, SysFlags,
                          FileSystem, SizeOf(FileSystem))
     else SerialNumber:=12345678;
     Result:=DecToHex(SerialNumber);
end;
// 用法
procedure TForm1.Button2Click(Sender: TObject);
begin
    form1.Caption:=getdiskserial('c');  // 取得C盘的序列号
end;
  

⌨️ 快捷键说明

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