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

📄 readserialunit.pas

📁 采用加密算法进行管理用户密码采用加密算法进行管理用户密码
💻 PAS
字号:
unit ReadSerialUnit;

interface
    Uses Windows,SysUtils;
type
TCPUID  = array[1..4] of Longint;
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..10] 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;
 wreservedL: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
   BufferSize = 1280;
   IDENTIFY_BUFFER_SIZE=512;
   DataSize=sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
   IOCTL_SCSI_MINIPORT=$0004d008;
   IOCTL_SCSI_MINIPORT_IDENTIFY=$001b0501;
   IDE_ID_FUNCTION=$EC;
 function ReadHdSerial:String;
 function GetCPUIDStr:String;
implementation

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;

//功能:读硬盘物理序号
function ReadHdSerial:String;
var
  hDevice:THandle;
  cbBYTESReturned:DWORD;
  pindata:PSendCmdInParams;

  pOutData:Pointer;
  Buffer:Array[0..BufferSize-1] of Byte;
  srbCONTROL:tSrbIoControl absolute Buffer;
begin
  result:='';
  Fillchar(Buffer,buffersize,#0);
  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;
//     irDriveRegs:=0;
     with irDriveRegs do
     begin
       bFeaturesreg:=1;
       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;
    with Pidsector(pchar(poutdata)+16)^ do
    begin
      changebyteorder(sSerialNUMber,sizeof(sserialnumber));
      setstring(result,sserialnumber,sizeof(sserialnumber));
    end;
    finally
    closehandle(hdevice);
    end;
end;

function GetCPUID : TCPUID; assembler; register;
asm 
  PUSH    EBX         {Save affected register}
  PUSH    EDI 
  MOV     EDI,EAX     {@Resukt} 
  MOV     EAX,1 
  DW      $A20F       {CPUID Command}
  STOSD               {CPUID[1]}
  MOV     EAX,EBX 
  STOSD               {CPUID[2]} 
  MOV     EAX,ECX 
  STOSD               {CPUID[3]} 
  MOV     EAX,EDX 
  STOSD               {CPUID[4]} 
  POP     EDI         {Restore registers}
  POP     EBX
end;

function GetCPUIDStr:String;
var 
  CPUID : TCPUID; 
  I     : Integer; 
  Str   : String;
begin
  for I := Low(CPUID) to High(CPUID)  do CPUID[I] := -1;
  CPUID := GetCPUID;
  Str:='';
  Str  := IntToHex(CPUID[1],8);
  Str  :=Str+  IntToHex(CPUID[2],8);
  Str  :=Str+  IntToHex(CPUID[3],8);
  Str  :=Str+  IntToHex(CPUID[4],8);
  Result:=Str;
end;

end.

⌨️ 快捷键说明

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