• delphi 获取硬盘序列号、cpu号、bios号、网卡号


    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;  
       
    

      

  • 相关阅读:
    mysqlnd cannot connect to MySQL 4.1+ using old authentication
    nginx中查看关于php的配置和php-fpm的重启等操作
    nginx中查看关于php的配置和php-fpm的重启等操作
    linux面试题1
    linux笔试
    面试题
    shell脚本实例
    shell脚本
    mysql主从复制
    Discuz!NT静态文件缓存(SQUID)
  • 原文地址:https://www.cnblogs.com/qingsong/p/4033188.html
Copyright © 2020-2023  润新知