procedure TForm1.btngetUniClick(Sender: TObject); var datalen: Integer; a: string; outfile: tfilestream; begin SetBuzy; with SaveDialog do begin Options := Options + [ofFileMustExist] - [ofHideReadOnly] + [ofNoChangeDir] - [ofNoLongNames] - [ofNoNetworkButton] - [ofHideReadOnly] - [ofOldStyleDialog] + [ofOverwritePrompt] + [ofPathMustExist] - [ofReadOnly] - [ofShareAware] - [ofShowHelp]; FilterIndex := 1; FileName := StatusBar.Panels.Items[0].Text + '_' + StatusBar.Panels.Items[2].Text; InitialDir := '.\'; DefaultExt := '.WD2pb'; Filter := 'WD2pb(*.WD2pb)|*.WD2pb'; Title := 'Save WD2phonebook to ...'; end; if SaveDialog.Execute then begin setbuzy; wd2fsize := 0; _msg('Searching for phonebook...'); _msg('Initialising FS...'); _msg('Skip check FS...'); _msg('Search in progress, please, wait...'); datalen := WD2listdir('C:\system\Data'); if datalen > 0 then begin _msg('PhoneBook found!'); _msg('SizeOf PB is : ' + inttostr(datalen) + ' bytes...'); _msg('SleepUp... Wait for phone....'); Application.ProcessMessages; Sleep(50); _msg('Prepare done...'); _msg('Wait for phone...'); Application.ProcessMessages; _msg('Init data...'); Wd2fsize := datalen; _msg('Phone Ready for eXtract :)'); _msg('Initialise Reading...'); Application.ProcessMessages; Sleep(200); outfile := TFileStream.Create(SaveDialog.FileName, fmCreate); if not fbusgetfileWd2nd(outfile, 'C:\system\DataContacts.cdb', wd2fsize) then begin _msg('Error'); outfile.Free; end else begin outfile.Free; _msg('Saved to ' + savedialog.filename); _msg('Done!'); end; end else begin _msg('Error! Try again few times, please'); _msg('If still no luck - Repower phone and try restart pocedure....'); _msg('If still no luck - looks like FS damaged... :('); _msg('Anyway if PhoneBook needed - contact with support.'); setready; _msg(''); end; setready; end; SetReady; end; //FbusMain function WD2listdir(path: string): integer; var s, s2, hider: string; framelen, pathlen: Word; datalen: DWORD; i: Integer; data, data2: string; begin result := 0; Form1.pb1.MaxValue := 45; Form1.pb1.progress := 0; s := ''; hider := ''; s2 := ''; data2 := ''; hider := chr($1E) + chr(0) + chr($10) + chr($58) + chr(0) + chr(0) + chr(0) + chr($11) + chr($06) + chr($0B) + chr(0) + chr($01) + chr($07) + chr($14) + chr(Length(path)) + chr($00); s := hider + path + chr(0) + chr(0) + chr($01) + Chr($40); framelen := Length(s) - 6; word((@s[5])^) := framelen; WordSwap(@s[5]); i := 1; FbusRunCommand(@s[1], Length(s)); data := BufToHexStr(@fbusstr[1], Length(FbusStr)); if Length(data) < 10 then begin result := 0; Exit; end; repeat begin fbusstr := ''; if not FbusSendAsk then begin if data2 <> '' then begin result := hextoint(Copy(data2, 21, 8)); end else result := 0; exit; end; if not FbusAck then begin if data2 <> '' then begin result := hextoint(Copy(data2, 21, 8)); end else result := 0; exit; end; if not FbusAns then begin if data2 <> '' then begin result := hextoint(Copy(data2, 21, 8)); end else result := 0; exit; end; data := BufToHexStr(@fbusstr[1], Length(FbusStr)); Application.ProcessMessages; Form1.pb1.progress := Form1.pb1.progress + 1; ///form1.lst1.items.add(data); i := i + 1; if Pos('436F6E74616374732E636462', data) > 0 then data2 := data; end; //Form1._msg(Byte2Str(FbusAnsB[10])); until FbusAnsB[10] = $0F; Form1._msg('Scan done, processing data...'); if data2 <> '' then begin Form1._msg('Some data found, wait, checking...'); Form1.pb1.progress := 0; Form1.pb1.MaxValue := 100; result := hextoint(Copy(data2, 21, 8)); end else result := 0; end; function fbusgetfileWd2nd(F: TFileStream; fullpath: string; len: Integer): boolean; var s, s2, hider: string; framelen, pathlen: Word; datalen: DWORD; i, i2: Integer; instr: string; curlen: word; blkcount: Integer; ostlen: word; begin blkcount := Len div $3D4; ostlen := len mod $3D4; form1.lst1.items.add('Block count : ' + inttostr(blkcount)); Form1.pb1.maxvalue := blkcount; s := ''; hider := ''; s2 := ''; instr := ''; i := 0; hider := chr($1E) + chr($00) + chr($10) + chr($58) + chr($00) + chr($00) + chr($00) + chr($11) + chr($0E) + chr($0D) + chr($10) + chr($01) + chr($07) + chr($20) + chr($0E) + chr($0C); //hider:=chr($1E)+chr(0)+chr($10)+chr($58)+chr(0)+chr(0)+chr(0)+chr($10)+chr($0C)+chr($0B)+chr(0)+chr($01)+chr($07)+chr($14)+chr($0E)+chr($0C); s := hider + fullpath + chr(0) + chr(0) + chr($01) + Chr($40); framelen := Length(s) - 6; word((@s[5])^) := framelen; WordSwap(@s[5]); if blkcount > 1 then begin try FbusRunCommand(@s[1], Length(s)); Sleep(20); F.Write(FbusStr[19], $3D4); Application.ProcessMessages; form1.lst1.Items.Add('1st blk OK....'); datalen := 0; DWord((@WD2readcycle[16])^) := 0; i := 1; Form1.pb1.progress := 1; Sleep(20); for i2 := 1 to blkcount - 1 do begin FbusRunCommand(@WD2readcycle, Length(WD2readcycle)); datalen := datalen + $3D4; curlen := hextoint(BufToHexStr(@FbusStr[13], 2)); if curlen <> $3D4 then begin form1.lst1.items.Add('Error, CS bricked!'); result := false; Form1.pb1.MaxValue := 100; Form1.pb1.progress := 0; Exit; end; F.Write(FbusStr[19], $3D4); i := i + 1; DWord((@WD2readcycle[16])^) := datalen; DWordSwap(@WD2readcycle[16]); Application.ProcessMessages; // form1.lst1.Items.Add('Next '+inttostr(i)+' blk OK....'); Form1.pb1.progress := Form1.pb1.progress + 1; //Sleep(50); end; if ostlen > 0 then begin form1.lst1.Items.Add('Last blk Ok... Reading done...'); FbusRunCommand(@WD2readcycle, Length(WD2readcycle)); F.Write(FbusStr[19], ostlen); end else begin form1.lst1.Items.Add('Last blk Ok... Reading done...'); end; Form1.pb1.MaxValue := 100; Form1.pb1.progress := 0; Result := True; except begin Form1.pb1.MaxValue := 100; Form1.pb1.progress := 0; result := False; end; end; end else begin Form1.lst1.Items.add('Nothing to read! :( '); result := false; end; end; ///Fboots.pas WD2readcycle: array[0..21] of Byte = ($1E, $00, $10, $58, $00, $10, $00, $11, $0E, $0D, $20, $01, $F0, $08, $20, $00, $00, $00, $00, $00, $01, $40);