读取硬盘序列号码Delphi代码片断

//取硬盘系列号:
 function GetIdeSerialNumber: pchar; //获取硬盘的出厂系列号;
 const
     IDENTIFY_BUFFER_SIZE = 512;
 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;
 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
    begin // Windows NT, Windows 2000
        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;
        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;
//---------------------------------调用
Edit1.Text:=strpas(GetIdeSerialNumber);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值