1.我在9X 里可以这样得到。但NT的保护模式使它不能用。
    fMainBoardBiosName := String(Pchar(Ptr($FE061)));
    fMainBoardBiosCopyright := String(Pchar(Ptr($FE091)));
    fMainBoardBiosDate := String(Pchar(Ptr($FFFF5)));
    fMainBoardBiosSerialNo := String(Pchar(Ptr($FEC71)));
2.我用小汇编取到的CPUID,在赛杨系列里竟然得到同样的机器码。后来听人家CPUID
  有问题。
3.硬盘的话,要取物理序列号才可以,这样格式化以后不会变化,但问题是怎么区分是IDE
和SCSI硬盘呢?二种又不一样!帮帮忙,参与者就有分!解决者,我愿意把我所有分都送上!

解决方案 »

  1.   

    主板、cpu同一型号的id是一样的,只有硬盘物理序列号才是唯一的,可以检测如果用ide得出是空的话,就用scsi
      

  2.   

    在PC的硬设里只有硬盘ID是唯一的。
    我现有读取这些设备的源码(win 98/2000),你需要的话告诉我EMAIL,要记得给分哦!
      

  3.   

    to  qxj2003(Borland中国&游民) ( ) 信誉:124 
    怎么混的这么高的信誉????
    硬盘ID是唯一的。
    还有网卡的MAC地址
    取得这些信息的源码很多,自己动手把
      

  4.   

    function GetIdeDiskSerialNumber : 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; // 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;
      IDEREGS   = TIDERegs;
      PIDERegs  = ^TIDERegs;  TSendCmdInParams = packed record
        cBufferSize  : DWORD;                // Buffer size in bytes
        irDriveRegs  : TIDERegs;             // Structure with drive register values.
        bDriveNumber : Byte;                 // Physical drive number to send command to (0,1,2,3).
        bReserved    : Array[0..2] of Byte;  // Reserved for future expansion.
        dwReserved   : Array[0..3] of DWORD; // For future use.
        bBuffer      : Array[0..0] of Byte;  // Input buffer.
      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; // PSendCmdInParams;
      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 // Windows NT, Windows 2000
          // Get SCSI port handle
          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 // Windows 95 OSR2, Windows 98
          hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
          if hDevice=INVALID_HANDLE_VALUE then Exit;
    try
           pInData := PSendCmdInParams(@Buffer);
    pOutData := PChar(@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;
    end;
      

  5.   

    楼上的,告诉你们一个坏消息,网卡的MAC地址是以修改的!
    -_-