⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disksn.pas

📁 DEILPHI写的QQ安全软件源码!功能全套,该有的全有了,欢迎交流
💻 PAS
📖 第 1 页 / 共 2 页
字号:
//南域剑盟  http://www.98exe.com
unit DiskSN;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, nb30;

type

  TDISKSN = class(TComponent)
  private
     FActive:Boolean;
     FIDE0SN:string;
     FIDE1SN:string;
     FSCSI0SN:string;
     FSCSI1SN:string;
     FCardAddr0:string;
     FCardAddr1:string;
     FCardAddr2:string;
     FCardAddr3:string;
     FCardAddr4:string;
     FCPUSpeedMHz:string;
     function Change2Ring0:string;
     function NBGetAdapterAddress(a:integer):string;
     procedure SetActive(Val:Boolean);
     function GetCPUSpeed: Double;  protected
     function ScsiHddSerialNumber(i:smallint) : String;
     function GetIdeSerialNumber(i:smallint): pchar;
    { Protected declarations }
  public

    constructor Create(AOwner:TComponent); override;
    destructor Destroy; override;
  published
     property Active:Boolean read FActive Write SetActive;
     property IDE0SN:string read FIDE0SN write FIDE0SN;
     property IDE1SN:string read FIDE1SN write FIDE1SN;
     property SCSI0SN:string read FSCSI0SN write FSCSI0SN;
     property SCSI1SN:string read FSCSI1SN write FSCSI1SN;
     property CardAddr0:string read FCardAddr0 write FCardAddr0;
     property CardAddr1:string read FCardAddr1 write FCardAddr1;
     property CardAddr2:string read FCardAddr2 write FCardAddr2;
     property CardAddr3:string read FCardAddr3 write FCardAddr3;
     property CardAddr4:string read FCardAddr4 write FCardAddr4;
     property CPUSpeedMHz:string read FCPUSpeedMHz write FCPUSpeedMHz;
  end;
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.  Must be zero.
  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
    HVxDHandle:thandle;
    str1,str2,str3:string;//win98,winnt/2000,scsi
    type
   TGate = record
     Off2,op,seg1,off1:WORD;
   end;
   LONGDWORD = INT64;

  var
  IDTR: LONGDWORD;
  SavedGate:TGate;
  OurGate: TGate;
  dd1: array [0..256] of word;
  dsn:array [0..20] of char; //存放硬盘序列号

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TDISKSN]);
end;

constructor TDISKSN.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  FActive:=false;
  FCardAddr0:='';
  FCardAddr1:='';
  FCardAddr2:='';
  FCardAddr3:='';
  FCardAddr4:='';
  FSCSI0SN:='';
  FSCSI1SN:='';
  FIDE0SN:='';
  FIDE1SN:='';
  FCPUSpeedMHz:='';
end;


destructor TDISKSN.Destroy;
begin
  inherited Destroy;
end;

procedure TDISKSN.SetActive(Val:Boolean);
begin
   FActive:=Val;
   FCardAddr0:='';
   FCardAddr1:='';
   FCardAddr2:='';
   FCardAddr3:='';
   FCardAddr4:='';
   FSCSI0SN:='';
   FSCSI1SN:='';
   FIDE0SN:='';
   FIDE1SN:='';
   FCPUSpeedMHz:='';
   if Val=true then
   begin
      FCardAddr0:=NBGetAdapterAddress(0);
      FCardAddr1:=NBGetAdapterAddress(1);
      FCardAddr2:=NBGetAdapterAddress(2);
      FCardAddr3:=NBGetAdapterAddress(3);
      FCardAddr4:=NBGetAdapterAddress(4);
      FSCSI0SN:=trim(ScsiHddSerialNumber(0));
      FSCSI1SN:=trim(ScsiHddSerialNumber(1));
      FIDE0SN:=trim(GetIdeSerialNumber(0));
      FIDE1SN:=trim(GetIdeSerialNumber(1));
      FCPUSpeedMHz:=formatfloat('0.00',getcpuspeed());
   end;
end;

//获取IDE驱动器的序列号
function TDISKSN.GetIdeSerialNumber(i:smallint) : pchar;
const IDENTIFY_BUFFER_SIZE = 512;
type
   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;
  TSendCmdInParams = packed record
    // Buffer size in bytes
    cBufferSize  : DWORD;
    // Structure with drive register values.
    irDriveRegs  : TIDERegs;
    // Physical drive number to send command to (0,1,2,3).
    bDriveNumber : BYTE;
    bReserved    : Array[0..2] of Byte;
    dwReserved   : Array[0..3] of DWORD;
    bBuffer      : Array[0..0] of Byte;  // Input buffer.
  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
    // 驱动器返回的错误代码,无错则返回0
    bDriverError : Byte;
    // IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
    bIDEStatus   : Byte;
    bReserved    : Array[0..1] of Byte;
    dwReserved   : Array[0..1] of DWORD;
  end;
  TSendCmdOutParams = packed record
    // bBuffer的大小
    cBufferSize  : DWORD;
    // 驱动器状态
    DriverStatus : TDriverStatus;
    // 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
    bBuffer      : Array[0..0] of BYTE;
  end;
  var hDevice : THandle;
      cbBytesReturned : DWORD;
      ptr : PChar;
      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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -