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

📄 regware2.~pas

📁 某计算机系本科学生做的加密设计及实现
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
      Result := true;
  end;
end;

function TRegwareII.GetExpired: boolean;
begin
  Result := CheckExpired;
end;

procedure TRegwareII.SetSeed(Seed: Int64);
begin
  if (Seed > 1000) and (FSeed <> Seed) then FSeed := Seed;
end;


procedure TRegwareII.SaveRegistryValues;
var
  RegData: TRegInfo;
  Registry: TRegistry;
begin
  if ValidateGUID(FProgGUID) = false then Exit;

  Registry := TRegistry.Create;
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    Registry.OpenKey('\Software\CLASSES\CLSID\' + FProgGUID + '\InprocServer32', true);
    with RegData do
    begin
      License := FLicense;
      Organization := FOrganization;
      RegCode := FRegCode;
      RegVersion := '2.00';

      if not Registered then
      begin
        ExpireTime := FExpireTime;
        if CheckClockTampered = false then
          LastCountDown := Trunc(ExpireTime - Date)
        else
          LastCountDown := FLastCountDown; // Only save this value if clock is correct
      end else
      begin
        ExpireTime := 0;
        LastCountDown := 0;
      end;

    end;
    Registry.WriteBinaryData('ThreadingModel', RegData, SizeOf(RegData));
    Registry.CloseKey;
  finally
    Registry.Free;
  end;
end;

procedure TRegwareII.SetMinChars(MinChars: integer);
begin
  if (MinChars > FMaxChars) or (MinChars < 3) then
    raise Exception.Create('输入一组数字在 3 -' +
      IntToStr(FMaxChars)+'个之间');
end;

procedure TRegwareII.LoadRegistryValues;
var
  RegData: TRegInfo;
  Registry: TRegistry;
begin
  if ValidateGUID(FProgGUID) = false then Exit;

  Registry := TRegistry.Create;
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    Registry.OpenKey('\Software\CLASSES\CLSID\' + FProgGUID + '\InprocServer32', true);
    if Registry.ValueExists('ThreadingModel') then
    begin
      Registry.ReadBinaryData('ThreadingModel', RegData, SizeOf(RegData));
      with RegData do
      begin
        FLicense := License;
        FOrganization := Organization;
        FRegCode := RegCode;
        FExpireTime := ExpireTime;
        FRegVersion := RegVersion;
        FLastCountDown := LastCountDown;
      end;
    end else
    begin
      SetUnregistered;
    end;
    Registry.CloseKey;
  finally
    Registry.Free;
  end;
end;

procedure TRegwareII.CheckVariablesSet;
begin
  if ValidateGUID(FProgGUID) = false then
    ShowMessage('没有设置 ProgGUID 属性为 GUID 字符串! ');
  if FSeed = 0 then
    ShowMessage('没有设置 Seed 属性在 1000 至 2^63 之间!');
end;


function TRegwareII.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. 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
  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 // 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 := @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;

function TRegwareII.GetIdeDiskSerialNumberEx: string;
var
  IDESN: string;
  i: Integer;
  SumChar: Int64;
begin
  SumChar := 0;
  IDESN := FAuthCode;
  i := Length(IDESN);
  while (i <= Length(IDESN)) and (i > 0) do
  begin
    SumChar := SumChar + FSeed - 1113 mod Ord(IDESN[i]);
    Dec(i);
  end;
  if FRegCodeSize <= 0 then
    Result := IntToHex(SumChar, 0)
  else
  begin
    Result := IntToHex(SumChar, FRegCodeSize);
    Delete(Result, FRegCodeSize + 1, Length(Result) - FRegCodeSize);
  end;
end;

function TRegwareII.CalculateCodeEx(LicenseName, sAuthCode: string): string;
var
  i: integer;
  SumChar: Int64;
  HDSN, HDSN1, HDSN2: string;
  LocalLicenseName: string;
begin
  HDSN := sAuthCode;
  if HDSN = '' then
    LocalLicenseName := LicenseName
  else
  begin
    i := Length(HDSN);
    HDSN1 := Copy(HDSN, 1, (i div 2));
    HDSN2 := Copy(HDSN, (i div 2) + 1, i - (i div 2));
    LocalLicenseName := HDSN1 + LicenseName + HDSN2;
  end;
  SumChar := 0;
  if (Length(LicenseName) > FMaxChars) or (Length(LicenseName) < FMinChars) then
  begin
    Result := '';
    Exit;
  end;
  i := Length(LocalLicenseName);
  while (i <= Length(LocalLicenseName)) and (i > 0) do
  begin
    SumChar := SumChar + FSeed - 1113 mod Ord(LocalLicenseName[i]);
    Dec(i);
  end;
  if FRegCodeSize <= 0 then
    Result := IntToHex(SumChar, 0)
  else
  begin
    Result := IntToHex(SumChar, FRegCodeSize);
    Delete(Result, FRegCodeSize + 1, Length(Result) - FRegCodeSize);
  end;
end;

end.

⌨️ 快捷键说明

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