📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, Gauges, CPort, WinSkinData,
CPortCtl, Buttons, inifiles;
type
TForm1 = class(TForm)
Panel1: TPanel;
GroupBox1: TGroupBox;
siport: TComPort;
OpenDialog1: TOpenDialog;
sibox: TComComboBox;
Edit1: TEdit;
Open_btn: TButton;
Label1: TLabel;
Label2: TLabel;
Write_btn: TBitBtn;
ComboBox1: TComboBox;
Label3: TLabel;
ComboBox2: TComboBox;
Label4: TLabel;
Stop_btn: TBitBtn;
Format_btn: TBitBtn;
Readpwd_btn: TBitBtn;
Read_btn: TBitBtn;
SaveDialog1: TSaveDialog;
GroupBox2: TGroupBox;
Gauge1: TGauge;
RichEdit1: TRichEdit;
procedure Open_btnClick(Sender: TObject);
procedure Write_btnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Stop_btnClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Format_btnClick(Sender: TObject);
procedure Readpwd_btnClick(Sender: TObject);
procedure Read_btnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure showText(Cl: Tcolor; text: string; bold: boolean = false);
function QT_MainEXE(cmd: byte; fileid: word; offset: Word; len: byte; indata: Pbyte; outdata: Pbyte): boolean;
function QT_Dongle: Boolean;
procedure revalue(address: pointer; value: cardinal);
procedure SetTimeout(RI, RM, RC, WM, WC: integer);
procedure EnabledBtn(ok: Boolean);
function Cnn(): Boolean;
function Si_boot(ms: TStream): Boolean;
function Readcpuinfo(): boolean;
function Flashread(): boolean;
function CheckSum(data: array of byte; len: integer): integer;
function flashid(id: cardinal; id2: cardinal): string;
function hitegaugetotitle(int: integer): boolean;
procedure renewtitle;
end;
type
// PFILE_DATA = ^TFILE_DATA;
FILE_DATA = record
bCommand: byte; // command type*/
wFileID: word; // file ID */
wOffset: word; // access offset */
bDataLen: byte; // data length */
pbData: array[0..200] of byte; // data */
end;
const
checkdata: array[0..$203] of byte =
($00, $00, $FF, $0F, $FE, $0F, $01, $00, $FD, $0F,
$02, $00, $03, $00, $FC, $0F, $FC, $0F, $03, $00,
$02, $00, $FD, $0F, $01, $00, $FE, $0F, $FF, $0F,
$00, $00, $FB, $0F, $04, $00, $05, $00, $FA, $0F,
$06, $00, $F9, $0F, $F8, $0F, $07, $00, $07, $00,
$F8, $0F, $F9, $0F, $06, $00, $FA, $0F, $05, $00,
$04, $00, $FB, $0F, $FA, $0F, $05, $00, $04, $00,
$FB, $0F, $07, $00, $F8, $0F, $F9, $0F, $06, $00,
$06, $00, $F9, $0F, $F8, $0F, $07, $00, $FB, $0F,
$04, $00, $05, $00, $FA, $0F, $01, $00, $FE, $0F,
$FF, $0F, $00, $00, $FC, $0F, $03, $00, $02, $00,
$FD, $0F, $FD, $0F, $02, $00, $03, $00, $FC, $0F,
$00, $00, $FF, $0F, $FE, $0F, $01, $00, $F9, $0F,
$06, $00, $07, $00, $F8, $0F, $04, $00, $FB, $0F,
$FA, $0F, $05, $00, $05, $00, $FA, $0F, $FB, $0F,
$04, $00, $F8, $0F, $07, $00, $06, $00, $F9, $0F,
$02, $00, $FD, $0F, $FC, $0F, $03, $00, $FF, $0F,
$00, $00, $01, $00, $FE, $0F, $FE, $0F, $01, $00,
$00, $00, $FF, $0F, $03, $00, $FC, $0F, $FD, $0F,
$02, $00, $03, $00, $FC, $0F, $FD, $0F, $02, $00,
$FE, $0F, $01, $00, $00, $00, $FF, $0F, $FF, $0F,
$00, $00, $01, $00, $FE, $0F, $02, $00, $FD, $0F,
$FC, $0F, $03, $00, $F8, $0F, $07, $00, $06, $00,
$F9, $0F, $05, $00, $FA, $0F, $FB, $0F, $04, $00,
$04, $00, $FB, $0F, $FA, $0F, $05, $00, $F9, $0F,
$06, $00, $07, $00, $F8, $0F, $F8, $0F, $07, $00,
$06, $00, $F9, $0F, $05, $00, $FA, $0F, $FB, $0F,
$04, $00, $04, $00, $FB, $0F, $FA, $0F, $05, $00,
$F9, $0F, $06, $00, $07, $00, $F8, $0F, $03, $00,
$FC, $0F, $FD, $0F, $02, $00, $FE, $0F, $01, $00,
$00, $00, $FF, $0F, $FF, $0F, $00, $00, $01, $00,
$FE, $0F, $02, $00, $FD, $0F, $FC, $0F, $03, $00,
$02, $00, $FD, $0F, $FC, $0F, $03, $00, $FF, $0F,
$00, $00, $01, $00, $FE, $0F, $FE, $0F, $01, $00,
$00, $00, $FF, $0F, $03, $00, $FC, $0F, $FD, $0F,
$02, $00, $F9, $0F, $06, $00, $07, $00, $F8, $0F,
$04, $00, $FB, $0F, $FA, $0F, $05, $00, $05, $00,
$FA, $0F, $FB, $0F, $04, $00, $F8, $0F, $07, $00,
$06, $00, $F9, $0F, $01, $00, $FE, $0F, $FF, $0F,
$00, $00, $FC, $0F, $03, $00, $02, $00, $FD, $0F,
$FD, $0F, $02, $00, $03, $00, $FC, $0F, $00, $00,
$FF, $0F, $FE, $0F, $01, $00, $FA, $0F, $05, $00,
$04, $00, $FB, $0F, $07, $00, $F8, $0F, $F9, $0F,
$06, $00, $06, $00, $F9, $0F, $F8, $0F, $07, $00,
$FB, $0F, $04, $00, $05, $00, $FA, $0F, $FB, $0F,
$04, $00, $05, $00, $FA, $0F, $06, $00, $F9, $0F,
$F8, $0F, $07, $00, $07, $00, $F8, $0F, $F9, $0F,
$06, $00, $FA, $0F, $05, $00, $04, $00, $FB, $0F,
$00, $00, $FF, $0F, $FE, $0F, $01, $00, $FD, $0F,
$02, $00, $03, $00, $FC, $0F, $FC, $0F, $03, $00,
$02, $00, $FD, $0F, $01, $00, $FE, $0F, $FF, $0F,
$00, $00, $80, $00, $00, $00);
var
Form1: TForm1;
gl_boot, gl_format, gl_read: TResourceStream;
langs: Tinifile;
CX_Exit: boolean;
gl_path, gl_dllfile: string;
gl_cnndongle: ^boolean;
hRY2: THandle;
hToken: TPoint;
hET99: THandle;
shows, shows1, shows2: string;
gl_sn1, gl_sn2, gl_cpusn: Cardinal;
gl_QTDongle: byte;
gl_filedata: FILE_DATA;
gl_dwResult: integer;
gl_dwContextNum: Longword;
gl_pContextList: array[0..255] of ET_CONTEXT;
gl_pCtx: PET_CONTEXT;
gl_inbuf, gl_outbuf: array[0..$FF] of byte;
gl_dongleSn: Dword;
gl_QTret: Dword;
gl_QToutBuf: array[0..255] of Char;
gl_dgVal: array[0..$FF] of byte;
count: integer;
gl_flashid1, gl_flashid2, gl_flashsize: Cardinal;
formcaption: string;
const gl_1pass = 'GuangZhou VicEasy Elec .'; //24
const gl_2pass = '3454841';
implementation
{$R *.dfm}
{$R TLDLL.RES}
function Tform1.CheckSum(data: array of byte; len: integer): integer;
var
i, n: integer;
eax1, ebx, ebp, val: dword;
begin
ebx := 0;
ebp := $204;
for i := 0 to len - 1 do
begin
n := i;
eax1 := data[i] * 2;
val := (checkdata[ebp + eax1 - $203] shl 8) + checkdata[ebp + eax1 - $204];
if val > 8 then
begin
val := word(val - (i shl 4));
end;
ebx := ebx xor val;
end;
result := ebx;
end;
function LoadFileIntoDevice(pCtx: PET_CONTEXT; lpDeviceFileID: PChar; dwDeviceFileType: Byte; lpszPCFilePath: string): boolean;
var
dwResult: Longword;
File1: file;
pbBuffer: array[0..65535] of Byte;
dwFileSize: Longword;
dwRead: Integer;
begin
try
AssignFile(file1, lpszPCFilePath);
FileMode := fmOpenRead; //在Reset之前设置FileMode为只读的,才能打开只读文件
Reset(file1, 1);
dwFileSize := FileSize(file1);
if (dwFileSize = 0) then
begin
Result := False;
exit;
end;
blockread(file1, pbbuffer, dwFileSize, dwRead);
if (dwRead) <= 0 then
begin
Result := False;
exit;
end;
dwResult := ETWriteFile(pCtx, lpDeviceFileID, 0, @pbBuffer, dwFileSize);
if (dwResult <> 0) then
begin
Result := False;
exit;
end;
result := true;
finally
closefile(file1);
end;
end;
function TForm1.QT_MainEXE(cmd: byte; fileid: word; offset: Word; len: byte; indata: Pbyte; outdata: Pbyte): boolean;
var buf: array[0..$FF] of byte;
begin
result := false;
buf[0] := cmd;
buf[1] := byte(fileid); //PC是低位在前
buf[2] := fileid shr 8;
buf[3] := byte(offset);
buf[4] := offset shr 8; //len
buf[5] := len;
if len > 0 then
move(indata^, buf[6], len);
gl_dwResult := ETExecute(gl_pCtx, PChar('1001'), @buf, len + 6, outdata, $FF, nil);
if gl_dwResult <> 0 then
begin
shows := langs.ReadString('Hint', 'G22', '执行狗程序出错');
showText(clRed, shows + IntToHex(gl_dwResult, 8));
exit;
end;
result := true;
end;
function kim_FileSize(s: string): integer;
var
sr: TsearchRec;
begin
if findfirst(expandfilename(s), faanyfile, sr) = 0 then
result := sr.Size;
end;
function TForm1.QT_Dongle: Boolean;
var s, s1: string;
k, i: integer;
TokenSize: DWORD;
datout: Dword;
devicetype: Dword;
OutBuf, inbuf: array[0..255] of byte;
szAtr: array[0..MAX_ATR_LEN] of Char;
begin
result := false;
// 列举设备
gl_dwContextNum := 254;
gl_dwResult := ETEnum(@gl_pContextList, @gl_dwContextNum);
if gl_dwResult <> 0 then
begin
shows := langs.ReadString('Hint', 'G23', '初始化齐天软件狗失败! ');
showText(clRed, shows);
exit;
end;
if gl_dwContextNum = 0 then exit; //没有找到加密狗
sleep(20);
gl_pCtx := @gl_pContextList[0]; //第一个狗的信息
gl_dwResult := ETOpen(gl_pCtx);
if gl_dwResult <> 0 then
begin
shows := langs.ReadString('Hint', 'G24', '没有找到齐天软件狗! ');
showText(clRed, '**' + shows);
exit;
end;
shows := langs.ReadString('Hint', 'G25', '已经联接到齐天软件狗! ');
showText(clGreen, shows);
if gl_PCtx.dwCustomer <> $830B95E1 then
begin
shows := langs.ReadString('Hint', 'G26', '齐天软件狗可能为定制或不兼容产品! ');
showText(clRed, shows);
exit;
end;
gl_dongleSn := gl_pCtx.bID[3] shl 24 + gl_pCtx.bID[2] shl 16 + gl_pCtx.bID[1] shl 8 + gl_pCtx.bID[0];
sleep(20);
gl_dwResult := ETControl(gl_pCtx, ET_GET_DEVICE_ATR, nil, 0, szAtr, MAX_ATR_LEN, @datout);
if gl_dwResult <> 0 then
begin
shows := langs.ReadString('Hint', 'G27', '读取软件狗信息出错! ');
showText(clRed, shows + IntToHex(gl_dwResult, 8));
exit;
end;
s := inttostr((byte(szAtr[11]) shl 24) + (byte(szAtr[12]) shl 16) + (byte(szAtr[13]) shl 8) + byte(szAtr[14]));
shows := langs.ReadString('Hint', 'G28', '齐天软件狗序列号:');
shows1 := ' ' + langs.ReadString('Hint', 'G29', '注册信息:');
showText(clBlue, shows + inttohex(gl_dongleSn, 8) + ' - ' + s
+ shows1 + copy(szatr, 0, 11));
sleep(20);
gl_dwResult := ETVerifyPin(gl_pCtx, PChar(gl_1pass), 24, ET_DEV_PIN);
if gl_dwResult <> 0 then
begin
shows := langs.ReadString('Hint', 'G30', '软件狗主密码错误!');
showText(clRed, shows);
exit;
end;
sleep(20);
gl_dwResult := ETVerifyPin(gl_pCtx, PChar(gl_2pass), 8, ET_USER_PIN);
if gl_dwResult <> 0 then
begin
shows := langs.ReadString('Hint', 'G31', '软件狗次密码错误!');
showText(clRed, shows);
exit;
end;
sleep(40);
gl_filedata.bCommand := $A2;
gl_filedata.bDataLen := 0;
gl_dwResult := ETExecute(gl_pCtx, PChar('1001'), @gl_filedata, gl_filedata.bDataLen + 6, @gl_OutBuf, $FF, nil);
if gl_dwResult <> 0 then
begin
shows := langs.ReadString('Hint', 'G32', '执行软件狗程序出错!');
showText(clRed, shows + IntToHex(gl_dwResult, 8));
exit;
end;
s := '';
for i := 0 to 3 do
s := s + chr(gl_outbuf[i]);
s1 := '';
for i := 5 to 14 do
s1 := s1 + chr(gl_outbuf[i]);
shows := langs.ReadString('Hint', 'G33', '软件狗主程序版本:');
shows1 := ' ' + langs.ReadString('Hint', 'G34', '编译日期:');
showText(clBlue, shows + s + shows1 + s1);
/////////////////////////
gl_inbuf[0] := $E5;
gl_inbuf[1] := $54;
gl_inbuf[2] := $39;
gl_inbuf[3] := $EF;
gl_inbuf[4] := $AB;
gl_inbuf[5] := $B4;
gl_inbuf[6] := $24;
gl_inbuf[7] := $FF;
QT_MainEXE($A9, 0, 0, 8, @gl_inbuf, @gl_outbuf);
gl_dgVal[0] := gl_outbuf[2];
gl_dgVal[1] := gl_outbuf[3];
gl_dgVal[2] := gl_outbuf[4];
gl_dgVal[3] := gl_outbuf[5];
gl_dgVal[4] := gl_outbuf[6];
gl_dgVal[5] := gl_outbuf[7];
gl_dgVal[6] := gl_outbuf[8];
gl_dgVal[7] := gl_outbuf[9];
////gl_dgVal: ($3A, $DC, $E5, $37, $BB, $39, $3D, $60,
gl_cnndongle^ := true;
result := true;
end;
function check_pl2303(var rtcom: byte): boolean;
type TusbMinfo = record
bLength: Byte; //0
bDescriptorType: Byte; //1
bcdUSB: Word; //2.3
bDeviceClass: Byte; //4
bDeviceSubClass: Byte; //5
bDeviceProtocol: Byte; //6
bMaxPacketSize0: Byte; //7
idVendor: Word; //8.9 //067b
idProduct: Word; //10.11 //2303
bcdDevice: Word; //12.13
iManufacturer: Byte; //14
iProduct: Byte; //15
iSerialNumber: Byte; //16
bNumConfigurations: Byte; //17
end;
var
FHandle: THandle;
usbMinfo: TusbMinfo;
i, j, k: integer;
nbyte: cardinal;
ret: boolean;
s: string;
wbuf, rbuf: array[0..$FF] of byte;
begin
rtcom := 0;
result := false;
for i := 1 to 100 do
begin
FHandle := CreateFile(
PChar('\\.\COM' + inttostr(i)),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
if FHandle <> INVALID_HANDLE_VALUE then
begin
ret := DeviceIoControl(FHandle, // hDevice: THandle
$222000, // dwIoControlCode: DWORD
@wbuf, // lpInBuffer: Pointer
$12, // nInBufferSize: DWORD
//@rbuf, // lpOutBuffer: Pointer
@usbMinfo,
$12, // nOutBufferSize: DWORD
nbyte, // var lpBytesReturned: DWORD
nil); // lpOverlapped: POverlapped
CloseHandle(FHandle);
if ret and (usbMinfo.idVendor = $067B) and (usbMinfo.idProduct = $2303) then
begin
rtcom := i;
result := true;
break;
end;
end;
end;
end;
function ExtractRes(ResType, ResName, ResNewName: string): boolean;
var
Res: TResourceStream;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(ResNewName);
Result := true;
finally
Res.Free;
end;
except
Result := false;
end;
end;
procedure TForm1.showText(Cl: Tcolor; text: string; bold: boolean = false);
var
i, ct, fi: integer;
s: string;
begin
try
ct := form1.RichEdit1.Lines.Count - 1;
// if ct >= 0 then //>>提示
for fi := 0 to ct do
begin
s := form1.RichEdit1.Lines.Strings[fi];
if copy(s, 1, 2) = '>>' then
form1.RichEdit1.Lines.Strings[fi] := ' ' + copy(s, 3, length(s));
end;
i := form1.RichEdit1.Lines.Count + 1;
form1.RichEdit1.SelStart := SendMessage(form1.RichEdit1.Handle,
EM_LINEINDEX, i, 0);
form1.RichEdit1.Perform(EM_SCROLLCARET, 0, 0); //}
form1.RichEdit1.SelAttributes.color := cl; //color
if bold then
form1.RichEdit1.SelAttributes.Style := [fsbold] else
form1.RichEdit1.SelAttributes.Style := [];
form1.RichEdit1.Lines.Add('>>' + trim(text));
application.ProcessMessages;
except
form1.RichEdit1.Lines.Add('>>***VicEasy Hint: Richedit Text error.***');
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -