📄 unit1.pas
字号:
var
ms: TmemoryStream;
p: pointer;
p1: ^Byte;
ads, js, editpwd: string;
sl: Tstringlist;
vi, i, size, j, j1, newaddr: cardinal;
rpfind: boolean;
b1, v1: byte;
P2_nsize: cardinal;
P2_buf: byte;
P2_num: byte;
P2_read, P2_s: string;
P2_pos1, P2_pos2: cardinal;
p2_mem: TmemoryStream;
begin
if OpenDialog1.Execute then
begin
editpwd := OpenDialog1.FileName;
end;
if not fileexists(editpwd) then
begin
exit;
end;
try
EnabledBtn(False);
if not gl_cnndongle^ then exit;
P2_mem := Tmemorystream.Create;
P2_mem.LoadFromFile(editpwd);
P2_nsize := P2_mem.Size;
sl := Tstringlist.Create;
sl.Clear;
if fileexists(gl_path + 'langs.ini') then
begin
sl.Add('----Flash PWD----')
end else
sl.Add('----字库密码:----');
p2_mem.Position := P2_nsize - $400000;
repeat
P2_pos1 := P2_mem.Position;
P2_pos2 := P2_mem.Position;
P2_mem.ReadBuffer(P2_buf, 1); // or ((chr(P2_buf) = '#') or (chr(P2_buf) = '*'))
if ((chr(P2_buf) >= '0') and (chr(P2_buf) <= '9')) then
begin
P2_read := P2_read + chr(P2_buf);
P2_num := length(P2_read);
end
else
begin
if (P2_num <= 8) and (P2_num >= 4) then
begin
P2_pos1 := P2_pos1 + 8 - P2_num;
P2_mem.Position := P2_pos1;
P2_mem.read(P2_buf, 1);
// if (ord(P2_buf) >= 04) and (ord(P2_buf) <= 8) then
if ord(P2_buf) = p2_num then
begin
j1 := 0;
for j := 0 to sl.Count - 1 do
begin
if (pos(P2_read, sl.Strings[j]) > 0) then
begin
j1 := 1;
break;
end;
end;
if j1 = 0 then
begin
if fileexists(gl_path + 'langs.ini') then
begin
sl.Add('PassWord: ' + P2_read);
end else
sl.Add('密码可能是: ' + P2_read);
end;
end;
end;
if not gl_cnndongle^ then exit;
P2_read := '';
P2_num := 0;
P2_pos2 := P2_pos2 + 1;
P2_mem.Position := P2_pos2;
application.ProcessMessages;
end;
// if P2_pos1 > 0 then
// gauge1.Progress := (P2_pos1 * 100) div (P2_nsize div 100);
// hitegaugetotitle(Gauge1.Progress);
until P2_pos1 >= P2_nsize - 1;
// renewtitle;
if not gl_cnndongle^ then exit;
if sl.Count > 1 then
begin
//richedit1.Lines.AddStrings(sl);
for i := 0 to sl.Count - 1 do
begin
if i = 0 then
showText(clblue, sl.Strings[i])
else
showText(clgreen, sl.Strings[i]);
end;
shows := langs.ReadString('Hint', 'H28', '查找完成.');
showText(clRed, shows);
end else
begin
shows := langs.ReadString('Hint', 'H29', '密码可能为空!');
showText(clRed, shows);
end;
finally
EnabledBtn(True);
P2_mem.Free;
end;
end;
procedure TForm1.Read_btnClick(Sender: TObject);
begin
try
CX_Exit := false;
EnabledBtn(False);
SetTimeout(1000, 500, 1000, 500, 2000);
siport.BaudRate := br115200;
siport.Port := sibox.Text; {设置com口}
siport.DataBits := dbeight; {8个数据位}
siport.Connected := true;
//SetTimeout(0, 1, 3000, 1, 3000);
if not gl_cnndongle^ then exit;
shows := langs.ReadString('Hint', 'H15', '提示:请一直按住开机键,直到引导下载完成...');
showtext(clred, shows);
if not Cnn then exit;
shows := langs.ReadString('Hint', 'H18', '已联接到手机.');
showText(clGreen, shows);
shows := langs.ReadString('Hint', 'H14', '正在下载引导程序...');
showtext(clblue, shows);
if not Si_boot(gl_read) then exit;
if not Readcpuinfo() then exit;
if not Flashread() then exit;
finally
EnabledBtn(True);
siport.Connected := false;
gauge1.Progress := 0;
end;
end;
function TForm1.Cnn: Boolean;
var
wbuf, rbuf: array[0..$FF] of byte;
time: cardinal;
rdi, cnn: integer;
begin
Result := false;
siport.ClearBuffer(true, true);
sleep(10);
cnn := 0;
time := Gettickcount;
CX_Exit := false;
wbuf[0] := $16;
repeat
application.ProcessMessages;
siport.Write(wbuf, 1);
sleep(30);
rdi := siport.Read(rbuf, 1);
if (rdi = 1) and (rbuf[0] = $16) then
begin
cnn := 1;
// shows := langs.ReadString('Hint', 'Hxx', '手动中断退出!');
// showText(clRed, shows);
break;
end;
until
(Gettickcount - time > 20000) or (CX_Exit = true); //5秒
if CX_Exit then
begin
shows := langs.ReadString('Hint', 'H1', '手动中断退出!');
showText(clRed, shows);
exit;
end;
if cnn = 0 then
begin
shows := langs.ReadString('Hint', 'H19', '联接失败,超时退出!');
showText(clRed, shows);
exit;
end;
result := true;
end;
function TForm1.Si_boot(ms: TStream): Boolean;
var
mis: TMemoryStream;
size, sendsize: Cardinal;
wrbuf, rdbuf: array[0..$FFFF] of byte;
i: integer;
begin
Result := False;
try
mis := tmemorystream.Create;
mis.LoadFromStream(ms);
size := mis.Size;
mis.Position := 0;
i := 0;
sendsize := 128;
Gauge1.ForeColor := clBlue;
repeat
if size - i < sendsize then
sendsize := size - i;
CX_Exit := False;
mis.Read(rdbuf, sendsize);
siport.Write(rdbuf, sendsize);
Sleep(50);
i := mis.Position;
gauge1.Progress := (i * 100) div size;
application.ProcessMessages;
until (i >= size) or (CX_Exit = true);
if CX_Exit then
begin
shows := langs.ReadString('Hint', 'H1', '手动中断退出!');
showText(clRed, shows);
exit;
end;
Result := True;
finally
mis.Free;
end;
end;
function TForm1.Readcpuinfo: boolean;
var
rd, wr, newwr, newrd: array[0..$FF] of byte;
rdi, i, j, v1, v2: integer;
val35, val35be: Cardinal;
strin: string;
begin
Result := False;
siport.CustomBaudRate := 812500;
siport.BaudRate := brcustom;
//siport.ClearBuffer(true, true);
Sleep(10);
if not gl_cnndongle^ then exit;
siport.ClearBuffer(true, true);
wr[0] := $41;
rdi := siport.Write(wr, 1);
if rdi <> 1 then
exit;
sleep(30);
// siport.Read(rd, 1);
// until rd[0] = $41;
rdi := siport.Read(rd, 12);
if rdi <> 12 then
begin
shows := langs.ReadString('Hint', 'H20', '读数据1失败!');
showText(clRed, shows);
exit;
end;
j := 0;
for i := 2 to 9 do
begin
newrd[j] := rd[i];
inc(j);
end;
val35be := CheckSum(newrd, 8);
val35 := ((newrd[1] xor newrd[3]) shl 8) + (val35be and $FF);
newwr[0] := (val35 xor $7778) shr 8;
newwr[1] := (val35 xor $7778) and $FF;
newwr[2] := (val35 xor $D2D1) shr 8;
newwr[3] := (val35 xor $D2D1) and $FF;
newwr[4] := (val35 xor $800) shr 8;
newwr[5] := (val35 xor $800) and $FF;
newwr[6] := CheckSum(newwr, 6) shr 8;
newwr[7] := CheckSum(newwr, 6) and $FF;
siport.Write(newwr, 8);
Sleep(30);
wr[0] := $8A;
siport.Write(wr, 1);
sleep(50);
rdi := siport.Read(rd, 19);
if rdi <> 19 then
begin
shows := langs.ReadString('Hint', 'H21', '读数据2失败!');
showText(clRed, shows);
exit;
end;
{ v2 := 0;
for v1 := 9 downto 6 do
begin
newrd[v2] := rd[v1];
inc(v2);
end; }
if not gl_cnndongle^ then exit;
// count := ((newrd[0] shl 24) + (newrd[1] shl 16) + (newrd[2] shl 8) + newrd[3]) div $800;
// showText(clRed, inttostr(count));
gl_flashsize := (rd[7] shl 24) + (rd[8] shl 16) + (rd[9] shl 8) + rd[10];
gl_flashid1 := (rd[11] shl 24) + (rd[12] shl 16) + (rd[13] shl 8) + rd[14];
gl_flashid2 := (rd[15] shl 24) + (rd[16] shl 16) + (rd[17] shl 8) + rd[18];
shows := langs.ReadString('Hint', 'H22', '字库型号:') + ' ';
showText(clblue, shows + flashid(gl_flashid1, gl_flashid2));
shows := langs.ReadString('Hint', 'H23', '字库代码:');
showText(clblue, shows + inttohex(gl_flashid1, 8) + ' (' + inttohex(gl_flashid2, 8) + ')');
shows1 := langs.ReadString('Hint', 'H24', '字库大小:');
showText(clblack, shows1 + inttohex(gl_flashsize, 8) +
' (' + inttostr(gl_flashsize div $100000) + '.' + inttostr((gl_flashsize mod $100000) div 1024) + 'M)');
Result := True;
end;
function Tform1.flashid(id: cardinal; id2: cardinal): string;
var s: string;
begin
if (id = $00EC257E) then begin result := 'K5L6331CAM'; exit; end;
if (id = $00208810) then begin result := 'M36WOR'; exit; end;
if (id = $0001227E) then begin result := 'S71GL128NB'; exit; end;
end;
function TForm1.Flashread: boolean;
var
tt: cardinal;
wr, rd, newwr: array[0..$FF] of byte;
rdbuf, newrdbuf: array[0..$FFFF] of byte;
rdi, i, j, j1: integer;
neword, rdsize: Cardinal;
ms: Tmemorystream;
begin
Result := False;
tt := gettickcount;
CX_Exit := false;
shows := langs.ReadString('Hint', 'H25', '正在读字库...');
showText(clgreen, shows);
try
ms := TMemoryStream.Create;
ms.Position := 0;
wr[0] := $77;
wr[1] := $78;
wr[2] := $8A;
siport.Write(wr, 3);
Sleep(50);
rdi := siport.Read(rdbuf, 2048);
if (rdi <> 2048) then
begin
shows := langs.ReadString('Hint', 'H26', '读字库信息1出错!');
showText(clgreen, shows);
renewtitle;
exit;
end;
ms.Write(rdbuf, 2048);
neword := CheckSum(rdbuf, 2048);
i := 2048;
rdsize := 2048;
repeat
// if gl_flashsize - i < rdsize then
// rdsize := gl_flashsize - i;
wr[0] := $8A;
wr[1] := neword shr 8; //h
wr[2] := neword and $FF; //l
siport.Write(wr, 3);
Sleep(30);
rdi := siport.Read(rdbuf, 2049);
if (rdi <> 2049) or (rdbuf[0] <> $8A) then
begin
shows := langs.ReadString('Hint', 'H27', '读字库信息2出错!');
showText(clgreen, shows);
renewtitle;
exit;
end;
j1 := 0;
for j := 1 to 2048 do
begin
newrdbuf[j1] := rdbuf[j];
inc(j1);
end;
neword := CheckSum(newrdbuf, 2048);
ms.Write(newrdbuf, 2048);
i := i + rdsize;
if i > 0 then
gauge1.Progress := i div (gl_flashsize div 100);
hitegaugetotitle(Gauge1.Progress);
application.ProcessMessages;
until (i >= gl_flashsize) or (CX_Exit = True);
renewtitle;
if CX_Exit then
begin
shows := langs.ReadString('Hint', 'H1', '手动中断退出!');
showText(clRed, shows);
exit;
end;
shows := langs.ReadString('Hint', 'H30', '操作已完成.');
showText(clGreen, shows);
if not gl_cnndongle^ then exit;
if gl_flashsize > 0 then
begin
if savedialog1.Execute then
ms.SaveToFile(savedialog1.FileName + '.bin');
end;
result := true;
finally
ms.Free;
Gauge1.Progress := 0;
end;
end;
function Tform1.hitegaugetotitle(int: integer): boolean;
var
sr, sren: string;
caption: string;
begin
sr := inttostr(int) + '%' + #32#32 + 'VE-SI';
if not fileexists(gl_path + 'langs.ini') then
begin
SendMessage(Form1.Handle, WM_SETREDRAW, 0, 0);
caption := formcaption; // := '惟易SI4904平台 V2.0 '; // ;
sren := caption + #32 + #32 + inttostr(int) + '%';
setWindowText(Handle, PAnsiChar(sren));
Application.Title := sr;
SendMessage(Form1.Handle, WM_SETREDRAW, 1, 0); //
sendmessage(Form1.Handle, WM_SETTINGCHANGE, 0, 0);
end
else
begin
SendMessage(Form1.Handle, WM_SETREDRAW, 0, 0);
caption := formcaption; // := '惟易SI4904平台 V2.0 '; // ;
sren := caption + #32 + #32 + inttostr(int) + '%';
SetWindowText(Handle, PAnsiChar(sren));
Application.Title := sr;
SendMessage(Form1.Handle, WM_SETREDRAW, 1, 0); //
sendmessage(Form1.Handle, WM_SETTINGCHANGE, 0, 0);
end;
end;
procedure Tform1.renewtitle;
begin
Application.Title := 'VE-SI Software';
if not fileexists(gl_path + 'langs.ini') then
begin
Form1.Caption := formcaption;
end
else
begin
Form1.Caption := formcaption;
end;
end;
initialization
New(gl_cnndongle); //内存中的动态变量
finalization
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -