获取硬盘序列号

type

  TIDERegs = packed   record
    bFeaturesReg     : BYTE;
    bSectorCountReg  : BYTE;
    bSectorNumberReg : BYTE;
    bCylLowReg       : BYTE;
    bCylHighReg      : BYTE;
    bDriveHeadReg    : BYTE;
    bCommandReg      : BYTE;
    bReserved        : BYTE;
  end;
 
  TSendCmdInParams   =   packed   record
    cBufferSize  : DWORD;
    irDriveRegs  : TIDERegs;
    bDriveNumber : BYTE;
    bReserved    : array[0..2]   of   Byte;
    dwReserved   : array[0..3]   of   DWORD;
    bBuffer      : array[0..0]   of   Byte;
  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
    bDriverError : Byte;
    bIDEStatus   : Byte;
    bReserved    : array[0..1]   of   Byte;
    dwReserved   : array[0..1]   of   DWORD;
  end;
 
  TSendCmdOutParams = packed record
    cBufferSize  : DWORD;
    DriverStatus : TDriverStatus;
    bBuffer      : array[0..0]   of   BYTE;
  end;
 
// 获取硬盘的出厂系列号;
function GetDiskSerialNumber : Pchar;     
  const IDENTIFY_BUFFER_SIZE = 512;  
var
  hDevice : Thandle;
  cbBytesReturned : DWORD;
  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
    hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
      FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  end
  else   // Version Windows95 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;
    with SCIP do
    begin
      cBufferSize := IDENTIFY_BUFFER_SIZE;
      with irDriveRegs do
      begin
        bSectorCountReg   :=   1;
        bSectorNumberReg   :=   1;
        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;
 
调用方法:
ShowMessage(StrPas(GetDiskSerialNumber));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值