delphi 擷取硬碟序號、cpu號、bios號、網卡號

來源:互聯網
上載者:User

標籤:des   blog   io   os   ar   for   sp   div   art   

delphi 擷取硬碟 序號    function GetIdeNum: String;  type      TSrbIoControl = packed record      HeaderLength : ULONG;      Signature : Array[0..7] of Char;      Timeout : ULONG;      ControlCode : ULONG;      ReturnCode : ULONG;      Length : ULONG;  end;  SRB_IO_CONTROL = TSrbIoControl;  PSrbIoControl = ^TSrbIoControl;    TIDERegs = packed record      bFeaturesReg : Byte;      bSectorCountReg : Byte;      bSectorNumberReg : Byte;      bCylLowReg : Byte;      bCylHighReg : Byte;      bDriveHeadReg : Byte;      bCommandReg : Byte;      bReserved : Byte;  end;  IDEREGS = TIDERegs;  PIDERegs = ^TIDERegs;    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;  SENDCMDINPARAMS = TSendCmdInParams;  PSendCmdInParams = ^TSendCmdInParams;    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 : ULONG;       wMultSectorStuff : Word;      ulTotalAddressableSectors : ULONG;       wSingleWordDMA : Word;      wMultiWordDMA : Word;      bReserved : Array[0..127] of 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)-1+IDENTIFY_BUFFER_SIZE;  BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;  W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;  var   hDevice : THandle;  cbBytesReturned : DWORD;  pInData : PSendCmdInParams;  pOutData : Pointer;  Buffer : Array[0..BufferSize-1] of Byte;  srbControl : TSrbIoControl absolute Buffer;    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 := ‘‘;  FillChar(Buffer,BufferSize,#0);  if Win32Platform=VER_PLATFORM_WIN32_NT then  begin      hDevice := CreateFile( ‘//./Scsi0:‘,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,nil, OPEN_EXISTING, 0, 0 );      if hDevice=INVALID_HANDLE_VALUE then        Exit;      try        srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);        System.Move(‘SCSIDISK‘,srbControl.Signature,8);        srbControl.Timeout := 2;        srbControl.Length := DataSize;        srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;        pInData := PSendCmdInParams(PChar(@Buffer)+SizeOf(SRB_IO_CONTROL));        pOutData := pInData;        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( hDevice, IOCTL_SCSI_MINIPORT,@Buffer, BufferSize, @Buffer, BufferSize,cbBytesReturned, nil ) then          Exit;      finally        CloseHandle(hDevice);      end;  end else begin      hDevice := CreateFile( ‘//./SMARTVSD‘, 0, 0, nil,CREATE_NEW, 0, 0 );      if hDevice=INVALID_HANDLE_VALUE then        Exit;      try        pInData := PSendCmdInParams(@Buffer);        pOutData := @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( hDevice, DFP_RECEIVE_DRIVE_DATA,pInData, SizeOf(TSendCmdInParams)-1, pOutData,W9xBufferSize, cbBytesReturned, nil ) then          Exit;      finally        CloseHandle(hDevice);      end;  end;  with PIdSector(PChar(pOutData)+16)^ do  begin      ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));      SetString(Result,sSerialNumber,SizeOf(sSerialNumber));  end;  Result:=Trim(Result);  end;      下面三個函數配合實現擷取cpu 的id    function GetCPUID : TCPUID; assembler; register;  asm  PUSH    EBX  PUSH    EDI  MOV     EDI,EAX  MOV     EAX,1  DW      $A20F  STOSD  MOV     EAX,EBX  STOSD  MOV     EAX,ECX  STOSD  MOV     EAX,EDX  STOSD  POP     EDI  POP     EBX  end;    function IsCPUID_Available : Boolean; register;  asm  PUSHFD  POP     EAX  MOV     EDX,EAX  XOR     EAX,$200000  PUSH    EAX  POPFD  PUSHFD  POP     EAX  XOR     EAX,EDX  JZ      @exit  MOV     AL,True  @exit:  end;    function Cpu_GetCpuNum: String;  var  CPUID : TCPUID;  I     : Integer;  begin  Result:=‘0‘;  Try      for I := Low(CPUID) to High(CPUID) do        CPUID[I] := -1;      if IsCPUID_Available then      begin        CPUID:= GetCPUID;        Result:=IntToStr(CPUID[1])+‘-‘+IntToStr(CPUID[2])+‘-‘+IntToStr(CPUID[3])+‘-‘+IntToStr(CPUID[4]);      End;  Except      Result:=‘0‘;  End;  end;        下面函數擷取bios編號    {*************************************** author/date: description:擷取bios編號 ***************************************}  function GetBiosNum: String;  Var  BiosDate,BiosName,BiosVersion,BiosNum,BiosCopyright:String;  begin  Try      BiosDate:=string(pchar(ptr($ffff5)));      BiosName:=string(pchar(ptr($ffa68)));      BiosVersion:=string(pchar(ptr($fe061)));      BiosNum:=string(pchar(ptr($fec71)));      BiosCopyright:=string(pchar(ptr($fe091)));      Result:=BiosNum;  Except      Result:=‘‘;  End;  end;     

  

delphi 擷取硬碟序號、cpu號、bios號、網卡號

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.