unit UnitMisc; interface uses sysutils, HexUtils, classes, Windows, boots, dialogs ; type TPhInfoRecord = record Name:string; PhType:string; Model:string; MCUSW:string; PPMInfo:string; HWID:string; PCI:string; APETest:string; RFIC:string; DSP:string; APECoreSW:string; APEVariant:string; Retu:string; Tahvo:string; CNT : string; APEHW:string; APEADSPSW:string; LSN:string; APEBT:string; PrdSerial:string; ProductCode:string; ModuleCode:string; BisicPrdCode:string; IMEIPlain:string; IMEI2Net:string; IMEISv2Net:string; Bat:string; Cam:string; CMTbtver:string; LCD:string; FLic:string; CRR:string; //результат сброса кода на дефолтный PrdCok:string; // результат записи продукт кода. Стоит перманентный - проверка реализована в коде. APEic:string; end; type TRPLRecord = record NPC:string; CCC:string; HWC:string; SIMLOCK:string; SIMLOCK_KEY:string; SUPERDONGLE_KEY:string; CMLA_KEY:string; WMDRM_PD:string; Variant:string; end; type TUkeyData = record Hash:string; PID:string; Key:string; end; function PhModeToStr (mode:integer):string ; function rawtotemp(raw:Integer):string; function PathConv(path:string):string; function FindDescr(filename:string):string ; function FindNam(filename:string):boolean ; procedure repairdata(); function getkeycode(kw:Word):string; function getkeystatus(data:Word):string; function SelLoaders(IdR:string):boolean; function affenabled():Boolean; function SecondToTime(const Seconds: Cardinal): Double; function showtime(time:cardinal):string; procedure endtimecount(); procedure starttime(); function FbusSelLoader2nd(IdR:string):boolean; function Select2ndDie(idr:string):Boolean; function NextPos(SearchStr, Str: string; Position: Integer): Integer; function LastPos(SearchStr, Str: string): Integer; function getsub(b:byte):string; function getasic(b:byte):string; procedure UkeyClear(); function convertimages40(imname:string):boolean; function checkcnt(imname:string):integer; var RPLRecord :TRPLRecord; PhInfoRecord :TPhInfoRecord; UkeyData :TUkeyData; Smart :boolean; ConMode :integer; //0=USB, 1=COM, 2=... RM:string; typeinf,Generation, Crypted,datapos :string; fileexist :Boolean; currproduct :string; M :TMemoryStream; zad :Integer; TypePHstr :string; csbyte1,csbyte2, csbyte3,csbyte4 :Byte; SWver :string; Floader,Sloader :string; StartDir :string; tmsstart,tmsstop, tmsres, opstart, opend :Cardinal; directmode :Boolean; apeexist :Boolean; FbusFloader, FbusSloader :string; FASICcmt, FASICape:string; cmd_buf :array[0..$FFFF] of byte; algo :string; fbdev :integer; fbnum :string; devbyte :Byte; ROOTKEY :string; boot_done :Boolean; imei_global :string; bof :integer; furCMT :byte; FLtype :string; UFsretry :Integer; flven :DWORD; stop,operation :Boolean; ppmlang, ppm1lang, s1ppm :string; ppmselect, ppm1select :Boolean; flicven :DWORD; sltststart, sltstsend :Integer; ltdata :integer; psi :string; DataHeader : array [0..53] of Byte = ($F1, $00, $21, $00, $03, $D1, $12, $4A, $6F, $72, $6E, $61, $64, $61, $20, $44, $65, $6C, $20, $4D, $75, $65, $72, $74, $6F, $DD, $17, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FC, $02, $00, $00); dataheader2: array[0..53] of byte = ( $F1, $00, $21, $00, $03, $D1, $12, $53, $65, $72, $69, $65, $73, $20, $34, $30, $20, $52, $65, $73, $74, $6F, $72, $65, $20, $DD, $17, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FC, $02, $00, $00); Zerobyte : Widestring = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'+ 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'+ 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'+ 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'+ 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'+ 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'+ 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'; implementation uses Unit1, forms, UsbMain, UnitE1, UContent ; const SecPerDay = 86400; SecPerHour = 3600; SecPerMinute = 60; function SecondToTime(const Seconds: Cardinal): Double; var ms, ss, mm, hh, dd: Cardinal; begin dd := Seconds div SecPerDay; hh := (Seconds mod SecPerDay) div SecPerHour; mm := ((Seconds mod SecPerDay) mod SecPerHour) div SecPerMinute; ss := ((Seconds mod SecPerDay) mod SecPerHour) mod SecPerMinute; ms := 0; Result :=EncodeTime(hh, mm, ss, ms); end; function Select2ndDie(idr:string):Boolean; var s:string; begin result:=true; idr:=copy(idr,1,5); FbusFloader:=''; FbusSloader:=''; case Str2Byte(idr[1]+idr[2]) of $BA: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAP3Gv3_BA'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_BA'; bof:=2; end; $9D: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAP3Gv3_9D'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_9D'; bof:=2; end; $E9: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAP3Gv2_E9'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_E9'; bof:=1; end; $38: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAP3Gv3_38'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_38'; bof:=2; end; $A5: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAP3Gv3_A5'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_A5'; bof:=3; end; $9A: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAPIDO_9A'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_9A'; bof:=3; end; $CA: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAPIDO_CA'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_CA'; bof:=3; end; $F2: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAPIDO_F2'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_F2'; bof:=3; end; $F6: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAPIDO_F6'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_F6'; bof:=3; end; $FC: begin FbusFloader:=StartDir+'Flash\UFS\Special\RAPIDO_FC'; FbusSloader:=StartDir+'Flash\UFS\Special\Cboot_FC'; bof:=3; end; else result:=False; end; end; function SelLoaders(IdR:string):boolean; var s,s1,s3,s4,ss:string; begin Result:=false; Floader:=''; Sloader:=''; if Pos (IdR,'0003192103002107000C1921030021070003192103012107000C192103012107000C1921030221070003192103022107')<>0 then begin Floader:=StartDir+'Flash\RAPUv21_2nd.fg'; Sloader:=StartDir+'Flash\RAPUv21_XSR17_alg.fg'; Result:=true; exit; end; if Pos (IdR,'4003192102001104400C1921020011046003192102001104600C1921020011046003192102011104600C1921020111046003192102021104600C1921020211046003192102031104600C192102031104')<>0 then begin Floader:=StartDir+'Flash\RAPUv11_2nd.fg'; Sloader:=StartDir+'Flash\RAPUv11_XSR17_alg.fg'; Result:=true; exit; end; s:='0203192102004000020C1921020040000203192102024000020C192102024000020C1921020041000203192102004100020C1921020141000203192102014100020C1921020140000203192102014000'; s1:='020C19210203400002031921020340000203192102024100020C1921020241000203192102034100020C1921020341000203192102054100020C1921020541000203192102044100020C192102044100'; s:=s+s1; if Pos (IdR,s)<>0 then begin Floader:=StartDir+'Flash\RAP3Gv40_2nd.fg'; Sloader:=StartDir+'Flash\RAP3Gv40_XSR17_alg.fg'; Result:=true; exit; end; if Pos (IdR,'22000209200C0000220002092003000022000509200C00002200050920030000')<>0 then begin Floader:=StartDir+'Flash\BCM21351_usb2nd.fg'; Sloader:=StartDir+'Flash\BCM21351_XSR16_usbalg.fg'; Result:=true; exit; end; { s3:='0103192101003000010C1921010030000103192101013000010C1921010130000103192101003100010C1921010031000303192101023000030C1921010230000303192101033000030C1921010330000003192101002000000C1921010020000003192101002100000C1921010021000003192101002200000C1921010022'; s4:='000003192101012200000C1921010122000103192101001101010C1921010011010003192101001002000C1921010010020013192101001002001C192101001002'; ss:=s3+s4; if Pos (IdR,ss)<>0 then begin Floader:=StartDir+'Flash\RAP3Gv30_2nd.fg'; Sloader:=StartDir+'Flash\RAP3Gv30_XSR14_alg.fg'; Result:=true; exit; end; } end; function PathConv(path:string):string; var Len:integer; s:string; sw:WideString; begin sw:=UTF8Decode(path); Len:=(Length(sw) shl 1)+2; Result:=''; s:=''; SetLength(s,2); word ((@s[1])^):=Len; WordSwap(@s[1]); SetLength(Result,Len+2); BufCopySwapWord(@sw[1],@Result[1],Len); Result:=s+Result; end; function PhModeToStr (mode:integer):string ; begin case mode of 0 : Result := 'PowerOFF'; 1 : Result := 'Normal'; 2 : Result := 'Charging'; 3 : Result := 'Alarm'; 4 : Result := 'Test'; 5 : Result := 'Local'; 6 : Result := 'Warranty'; 7 : Result := 'Reliability'; 8 : Result := 'SelftestFail'; 9 : Result := 'SwDl'; 10 : Result := 'RfInactive'; 11 : Result := 'IdWrite'; 12 : Result := 'Discharging'; 13 : Result := 'SwReset'; end; end; function rawtotemp(raw:Integer):string; var temp:integer; begin case raw of // temperature from raw 570..579:temp:=0; 560..569:temp:=1; 550..559:temp:=2; 540..549:temp:=3; 530..539:temp:=4; 520..529:temp:=5; 510..519:temp:=6; 500..509:temp:=7; 490..499:temp:=8; 480..489:temp:=9; 470..479:temp:=10; 460..469:temp:=11; 450..459:temp:=12; 440..449:temp:=13; 430..439:temp:=14; 420..429:temp:=15; 410..419:temp:=16; 400..409:temp:=17; 390..399:temp:=18; 380..389:temp:=19; 370..379:temp:=20; 360..369:temp:=21; 350..359:temp:=22; 340..349:temp:=23; 330..339:temp:=24; 320..329:temp:=25; 310..319:temp:=26; 300..309:temp:=27; 290..299:temp:=28; 280..289:temp:=29; 270..279:temp:=30; 260..269:temp:=31; 250..259:temp:=32; 240..249:temp:=33; 230..239:temp:=34; 220..229:temp:=35; 210..219:temp:=36; 200..209:temp:=37; 190..199:temp:=38; 180..189:temp:=39; 170..179:temp:=40; 160..169:temp:=41; 150..159:temp:=42; 140..149:temp:=43; 130..139:temp:=44; 120..129:temp:=45; 110..119:temp:=46; 100..109:temp:=47; 90..99:temp:=48; 80..89:temp:=49; 70..79:temp:=50; 60..69:temp:=51; 50..59:temp:=52; 40..49:temp:=53; 30..39:temp:=54; 20..29:temp:=55; 10..19:temp:=56; 0..9:temp:=57 else temp:=0; end; Result:=inttostr(temp)+' C'; end; function FindNam(filename:string):boolean ; Label vp1; var Fn: System.Text; s,name,styp:string; i:integer; begin Result:=false; System.Assign (Fn , filename) ; System.Reset (Fn); while not EOF(Fn) do begin System.Readln(Fn,s); if Pos('',s)<>0 then begin System.Readln(Fn,s); while Pos('',s)=0 do begin if Pos ('',s)<> 0 then begin name:=''; i:=Pos ('',s); i:=i+6; while s[i] <> '<' do begin name:=name+s[i]; i:=i+1 end; end; if Pos ('',s)<> 0 then begin styp:=''; i:=Pos ('',s); i:=i+13; while s[i] <> '<' do begin styp:=styp+s[i]; i:=i+1 end; if styp='Mcu' then core:=name; if styp='Ppm' then if ppm<>'' then ppm1:=name else ppm:=name; if styp='Content' then if image<>'' then begin if ape<>'' then cnt3:=name else ape:=name; end else image:=name; end; vp1: System.Readln(Fn,s); end; end; end; System.Close(Fn); if core<>'' then Result:=true; end; function FindDescr(filename:string):string ; var Fn: System.Text; s,ProdName,ProdCode,ProdVer,orFN:string; i:integer; begin SWver:=''; Result:=''; ProdName:=''; ProdCode:=''; ProdVer:=''; orFN:=''; System.Assign (Fn , filename) ; System.Reset (Fn); while not EOF(Fn) do begin System.Readln(Fn,s); if Pos('',s)<>0 then begin i:= Pos('',s); i:=i+13; while s[i] <> '<' do begin ProdName:=ProdName+s[i]; i:=i+1 end; end; if Pos('',s)<>0 then begin i:= Pos('',s); i:=i+13; while s[i] <> '<' do begin ProdCode:=ProdCode+s[i]; i:=i+1 end; end; if Pos('',s)<>0 then begin i:= Pos('',s); i:=i+11; while s[i] <> '<' do begin ProdVer:=ProdVer+s[i]; i:=i+1 end; end; {if Pos('',s)<>0 then begin i:= Pos('',s); i:=i+18; while s[i] <> '<' do begin orFN:=OrFN+s[i]; i:=i+1 end; end;} end; System.Close(Fn); Result:=ProdCode+' '+ProdName+' ver '+ProdVer ; if ProdVer<>'' then SWver:=Prodver; end; procedure repairdata(); begin GETRoot[9]:=$01; GetBlock[7]:=$0D; GetBlock[8]:=$00; GetBlock[9]:=$0E; end; function getkeycode(kw:Word):string; begin case kw of $0030:result:='0 [DIGIT]'; $0031:result:='1 [DIGIT]'; $0032:result:='2 [DIGIT]'; $0033:result:='3 [DIGIT]'; $0034:result:='4 [DIGIT]'; $0035:result:='5 [DIGIT]'; $0036:result:='6 [DIGIT]'; $0037:result:='7 [DIGIT]'; $0038:result:='8 [DIGIT]'; $0039:result:='9 [DIGIT]'; $0023:result:='#'; $002A:result:='*'; $E001:result:='PWR'; $E003:result:='LSoft'; $E004:result:='RSoft'; $E005:result:='SEND'; $E006:result:='END'; $E007:result:='UP'; $E008:result:='DOWN'; $E00A:result:='VOL+'; $E00B:result:='VOL-'; $E00C:result:='OK'; $E00D:result:='LEFT'; $E00E:result:='RIGHT'; $0E5C:result:='CAM'; $0008:result:='Clear [C]'; $F852:result:='Menu'; $F884:result:='Pen'; $F842:result:='LSoft'; $F843:result:='RSoft'; $F80A:result:='DOWN'; $F809:result:='UP'; $F808:result:='RIGHT'; $F807:result:='LEFT'; $F883:result:='CAM'; $F88F:result:='CPrew'; $F881:result:='Fplay'; $F886:result:='FfW'; $F880:result:='FRew'; $F845:result:='Ok/Select' ; $F863:result:='END'; $E05C:result:='CAM'; $E05D:result:='CFocus'; $F862:result:='SEND'; $E060:result:='Play/Pause'; $E061:result:='Play[Rewind]'; $E05F:result:='Play[Forward]'; $F856:result:='Play[Forward]'; $F854:result:='Play[Play/Pause]'; $F855:result:='Play[Stop]'; $F857:result:='Play[Rewind]'; $F847:result:='Slide[Down]'; $F84A:result:='Slide[Down|PlayMode]'; $F84B:result:='Slide[Up|Close]'; $F846:result:='Slide[Up|Open]'; $F80B:result:='Pen'; $F858:result:='MMedia key'; $F840:result:='VOL+'; $F841:result:='VOL-'; $F887:result:='Camera Lens open'; $F888:result:='Camera Lens close'; $E002:result:='Slide Open/Close'; else result:='UNKNOW KEY'; end; end; function getkeystatus(data:Word):string; begin case data of $000D:result:='Press, long press, repeat'; $000F:result:='Press, Release, Long press, repeat'; $0003:result:='Press, Release'; $0001:result:='Press'; $0007:result:='Press, Release, Long press'; $0083:result:='Press, Release'; $0010:result:='Slide up'; $0020:result:='Slide down'; $0030:result:='Slide down/up'; $0048:result:='Slide down/up many times'; //E0 0C 00 08 shorted $0008:result:='Possible shorted'; else result:='UNKNOW'; end; end; function affenabled():Boolean; var i:Integer; begin Form1.btnFLASH.Caption:='Stop'; stop:=False; Form1.btnFLASH.enabled:=true; result:=True; if (Form1.chkCheckRead.Checked=True) or (Form1.chkReseLt.checked=true) or (Form1.ChkAFFset.checked=true) or (Form1.chkBootNormal.checked=true) then begin Application.ProcessMessages; Sleep(500); Application.ProcessMessages; Sleep(500); Application.ProcessMessages; i:=0; if catchdevice<>$01 then begin repeat Application.ProcessMessages; if stop=True then i:=1000; if i=1000 then Break; Sleep(100); Inc(i); Application.ProcessMessages; until (catchdevice=$01) or (i=1000); end; if (i=1000) and (catchdevice<>$01) then begin if stop=true then begin form1._msg('-------AFTER FLASH BREAKED BY USER-------'); form1._msg(''); end; Application.ProcessMessages; Sleep(200); Form1.SetReady; Form1.TimConChk.Enabled:=true; Form1._msg('-> Flashing Failed! :( Maybee HW error, or Downgrade try???!'); Form1._msg(' Anyway - try reinsert battery and PowerUp phone manualy'); Form1._msg(''); Form1.DisconnectFill; Result:=false; Form1.chkPPMe.Enabled:=True; Form1.chkMCUen.Enabled:=True; Form1.chkPPM1e.Enabled:=True; Form1.chkCNTe.Enabled:=True; Form1.chkAPEe.Enabled:=True; Form1.chkcnt3.Enabled:=True; end; Form1.TimConChk.Enabled:=true; Form1.btnFLASH.Caption:='FLASH'; end; end; procedure starttime(); begin tmsstart:=0; tmsstart:=GetTickCount; end; procedure endtimecount(); begin tmsstop:=GetTickCount; tmsres:=tmsstop-tmsstart; fltime:=fltime+tmsres; end; function showtime(time:cardinal):string; var sec:Integer; begin sec:=0; sec:=(time div 1000); result:=FormatDateTime('hh:nn:ss',(SecondToTime(sec))); end; function FbusSelLoader2nd(IdR:string):boolean; var s,s1:string; begin Result:=false; FbusFloader:=''; FbusSloader:=''; if Pos(IdR,'008815B0008815C0008815C1008815D0008815D1008815D3')<>0 then begin FbusFloader:=StartDir+'Flash\UFS\nomadik8815_2nd.fg'; FbusSloader:=StartDir+'Flash\UFS\nomadik8815_alg.fg'; result:=true; exit; end; if Pos(IdR,'008815A1')<>0 then begin FbusFloader:=StartDir+'Flash\UFS\nomadik8815A1_2nd.fg'; FbusSloader:=StartDir+'Flash\UFS\nomadik8815_A1.fg'; result:=true; exit; end; if pos(IdR,'171007001710070117100702171007031710070417100708')<>0 then begin FbusFloader:=StartDir+'Flash\UFS\helen3_2nd.fg'; if pos('OMAP1610 GBBM-1.8.1',algo)>0 then FbusSloader:=StartDir+'Flash\UFS\h3_sam_nand_gbbm.fg' else begin case flven of $00A100EC,$00A1002C,$00780098,$00360098,$003600EC:FbusSloader:=StartDir+'Flash\UFS\h3_sam_nand_xsr.fg' //APE ALG0 Ver 1.49.0 else FbusSloader:=StartDir+'Flash\UFS\h3_xsr15_flash_alg.fg'; end; end; result:=true; exit; end; //OMAP2420 UNISTORE-II-1.5.1 ALG // teflon_sam_nand_xsr151_m1.fg if pos(IdR,'24200703242007042420070524200706')<>0 then begin FbusFloader:=StartDir+'Flash\UFS\omap2420_m1_2nd.fg'; if Pos('OMAP2420 UNISTORE-II-1.5.1',algo)<>0 then FbusSloader:=StartDir+'Flash\UFS\teflon_sam_nand_xsr151_m1.fg' else if Pos('OMAP2420 UNISTORE-II-1.2.1',algo)<>0 then FbusSloader:=StartDir+'Flash\UFS\teflon_sam_nand_xsr_m1.fg' else FbusSloader:=StartDir+'Flash\UFS\OMAP2420_XSR15_alg.fg'; result:=true; exit; end; if Pos(IdR,'0003192101002000000C1921010020000003192101002100000C1921010021000003192101002200000C1921010022000003192101012200000C192101012200')<>0 then begin FbusFloader:=StartDir+'Flash\UFS\RAP3Gv2_2nd.fg'; FbusSloader:=StartDir+'Flash\UFS\RAP3Gv3_algo.fg'; result:=true; exit; end; s:='0103192101003000010C1921010030000103192101013000010C1921010130000103192101003100010C1921010031000303192101023000030C192101023000'; s1:='0303192101033000030C1921010330000103192101001101010C1921010011010003192101001002000C1921010010020013192101001002001C192101001002'; s:=s+s1; if pos(idr,s)<>0 then begin FbusFloader:=StartDir+'Flash\UFS\RAP3Gv3_2nd.fg'; case flicven of $89820089,$89810089 : FbusSloader:=StartDir+'Flash\UFS\RAP3Gv3_algo_v1331.fg'; else FbusSloader:=StartDir+'Flash\UFS\RAP3Gv3_algo.fg'; end; result:=true; exit; end; s:='0003192101001203000C1921010012034003192101001203400C1921010012030003192101002003000C1921010020034003192101002003400C1921010020034003192101011103400C1921010111034003192101021103400C1921010211034003192101031103400C1921010311034'; s1:='003192101011105400C192101011105400C192101021105400C1921010311054003192101051103400C192101051103400C1921010511054003192101051105'; s:=s+s1; if pos(idr,s)<>0 then begin FbusFloader:=StartDir+'Flash\UFS\RAPIDOv11_2nd.fg'; FbusSloader:=StartDir+'Flash\UFS\RAPIDOv11_algo.fg'; result:=true; exit; end; if Pos (IdR,'0003192103002107000C1921030021070003192103012107000C192103012107000C1921030221070003192103022107')<>0 then begin FbusFloader:=StartDir+'Flash\RAPUv21_2nd.fg'; Result:=true; exit; end; if Pos (IdR,'4003192102001104400C1921020011046003192102001104600C1921020011046003192102011104600C1921020111046003192102021104600C1921020211046003192102031104600C192102031104')<>0 then begin FbusFloader:=StartDir+'Flash\UFS\RAPUv11_2nd.fg'; FbusSloader:=StartDir+'Flash\UFS\RAPUv11_algo_xsr16.fg'; Result:=true; exit; end; s:='0203192102004000020C1921020040000203192102024000020C192102024000020C1921020041000203192102004100020C1921020141000203192102014100020C1921020140000203192102014000'; s1:='020C19210203400002031921020340000203192102024100020C1921020241000203192102034100020C1921020341000203192102054100020C1921020541000203192102044100020C192102044100'; s:=s+s1; if Pos (IdR,s)<>0 then begin FbusFloader:=StartDir+'Flash\UFS\RAP3Gv4_2nd.fg'; FbusSloader:=StartDir+'Flash\UFS\RAP3Gv4_algo_xsr16.fg'; Result:=true; exit; end; end; function LastPos(SearchStr, Str: string): Integer; var i: Integer; TempStr: string; begin Result := Pos(SearchStr, Str); if Result = 0 then Exit; if (Length(Str) > 0) and (Length(SearchStr) > 0) then begin for i := Length(Str) + Length(SearchStr) - 1 downto Result do begin TempStr := Copy(Str, i, Length(Str)); if Pos(SearchStr, TempStr) > 0 then begin Result := i; break; end; end; end; end; // Search for the next occurence of a string from a certain Position function NextPos(SearchStr, Str: string; Position: Integer): Integer; begin Delete(Str, 1, Position - 1); Result := Pos(SearchStr, upperCase(Str)); if Result = 0 then Exit; if (Length(Str) > 0) and (Length(SearchStr) > 0) then Result := Result + Position + 1; end; function getasic(b:byte):string; begin case b of $00 : result:='CMT'; $01 : result:='APE' else result:='UNK['+byte2str(b)+']'; end; end; function getsub(b:byte):string; begin case b of $00 : result:='NOR'; $01 : result:='NAND'; $03 : result:='NAND' else result:='UNK['+byte2str(b)+']'; end; end; procedure UkeyClear(); begin UkeyData.hash:=''; UkeyData.PID:=''; UkeyData.key:=''; end; function convertimages40(imname:string):boolean; var CNT_PN_Sector : Byte; res : Boolean; image : String; fs : TFileStream; ms : TMemoryStream; buf : array[0..$3FFFF] of byte; begin result:=False; Form1._msg('ConvertImage: Processing '+ExtractFileName(imname)); Application.ProcessMessages; fs:=TFileStream.Create(imname,fmOpenRead); fs.Read(buf[0] ,1); fs.Free; if buf[0]<>$B2 then begin Form1._msg('ConvertImage: Image file is damaged'); exit; end; GetPageSize(imname, CNT_PN_Sector, res); if Not res then begin Form1._msg('ConvertImage: Error Image file converting'); exit; end; if pos('_128',imname)>0 then CNT_pn_sector:=128; if CNT_PN_Sector=64 then begin Form1._msg('ConvertImage: Page Size is 64K, converting...'); Application.ProcessMessages; GetFlashArea(imname, {EraseArea,} res); if Not Res then begin Form1._msg('ConvertImage: Error Image file converting'); Form1._msg(''); exit; end; ms:=TMemoryStream.Create; Image64to128(imname, ms, res); if Not Res then begin Form1._msg('ConvertImage: Error Image file converting'); Form1._msg(''); ms.Free; exit; end; Form1._msg('ConvertImage: File converted'); ms.Seek(0, sofrombeginning); ms.SaveToFile(imname+'_128'); result:=True; ms.Free; end else if CNT_PN_Sector=128 then begin Form1._msg('ConvertImage: Page Size is 128K, no need convert'); //Form1._msg(''); Application.ProcessMessages; end else begin Form1._msg('ConvertImage: Unknow Page Size [already 128?] '); //Form1._msg(''); exit; end; end; function checkcnt(imname:string):integer; var buf: array[0..$3FFFF] of byte; HdrLen, HdrSeems, CurrSeem, CurrSeemLen : Integer; ImagePageSize : Word; i : Integer; res, NeedConvert : Boolean; fs : TFileStream; ms : TMemoryStream; f5 : Boolean; begin imname:=image; //Form1._msg('CheckImage: Processing '+ExtractFileName(imname)); try currseem:=0; f5:=false; fs:=TFileStream.Create(imname,fmOpenRead); fs.Read(buf[0] ,1); if buf[0]<>$B2 then begin Form1._msg('CheckImage: Image file is damaged'); fs.Free; result:=0; exit; end; fs.ReadBuffer(buf[0], 4);//Длина Flash-header'a HdrLen := HexToInt(IntToHex(buf[0], 2)+IntToHex(buf[1], 2)+IntToHex(buf[2], 2)+IntToHex(buf[3], 2)); fs.Seek(4,soFromCurrent); HdrSeems := HdrLen+5; while fs.Position2 then form1._msg('Unknow Image-file'); fs.ReadBuffer(ImagePageSize, CurrSeemLen); if ImagePageSize=$1100 then begin NeedConvert:=false; //Form1._msg('ConvertImage: Page Size is 128K, using direct mode'); result:=2; fs.Free; Exit; end else if ImagePageSize=$1000 then begin NeedConvert:=true; //form1._msg('CheckImage: Page Size is 64K, using 2-stage mode'); result:=1; fs.Free; Exit; end else begin //form1._msg('ConvertImage: Unknow Page Size :( '); result:=3; fs.Free; Exit; end; end; fs.Seek(CurrSeemLen, sofromCurrent); end; end; fs.Free; if f5=false then begin //Form1._msg('CheckImage: cnt size not detected'); result:=4; exit; end; except on E:Exception do begin fs.Free; Form1._msg('CheckImage Error: '+E.Message); Result:=0; end; end; end; end.