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

📄 unit1.pas

📁 厦新 E8手机 ROM 编辑工具源码 编译平台Delphi7
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    end;
  end;
end;

function get_info_mod(iFileHandle:integer;in_address:longword):string;
var
i:longword;
s,s1:string;
x:integer;
begin
//800400008147AF988128BF7480D7AFF80007A20001C6A88A5E0B6F7000000007
  s:=get_ibyte(iFileHandle,in_address-32,32);
  s1:= getname(iFileHandle,copy(s,25,8));

  with Form1.ListView1 do
    begin
    Items.Add;//一定要add
    x:=Items.Count-1;
    Items[x].Caption:=s1;
    Items[x].SubItems.add('--');
    Items[x].SubItems.add('--');
    Items[x].SubItems.add('--');
    Items[x].SubItems.add(ihextoint(copy(s,33,8)));
    Items[x].SubItems.add('M'+(copy(s,57,8)));
    end;

    FileSeek(iFileHandle,(strtoint64def('$'+address_conv(copy(s,17,8),false),-1)),0);
    FileRead(iFileHandle, i, 1);
    get_info_struct(iFileHandle,(strtoint64def('$'+address_conv(copy(s,9,8),false),-1)),s1,i);

end;


function get_name_sp(iFileHandle:integer;name_len:integer):longword;
var
i,i1:int64;
j:integer;
Buffer : Pchar;
b:boolean;
begin
   //加文件名
  result:=0;
  with Form1 do
  begin
    i:=strtoint64def('$'+address_conv(labelededit2.Text,false),0);
    i1:=strtoint64def('$'+address_conv(labelededit4.Text,false),0);
    if (i<>0) and (i1<>0) then
      begin
        Buffer := Pchar(AllocMem(name_len+5));//多读前两位后两位 =4
        b:=false;
            try
              repeat
                FileSeek(iFileHandle,i-2,0);
                FileRead(iFileHandle, Buffer^, name_len+4);
                for j:=0 to name_len+3 do
                  begin
                    if (Buffer[j]<>#0) then begin b:=false; break; end;
                    b:=true;
                  end;
                i:=i+2;
              until b or (i>i1-name_len+4);
              if b then
                result:=i-2
                  else
                    begin
                      op_log('未找到可用文件名空间!');
                      result:=0;
                      exit;
                    end;
            finally
              FreeMem(Buffer);
            end;
      end;
  end;
end;

function Do_compress(Pin:Pbyte;in_len:Dword; Pout:Pbyte):Dword;
TYPE
 TGetCecompress= function (indata:Pbyte;inlength:Dword;outdata:Pbyte; outlength:Dword; i_1:integer; i_4096:integer):dword;  cdecl;
var
DLLHandle:Thandle;
Func:TGetCecompress;
D:Dword;
begin
  result:=0;
  DLLHandle:=LoadLibrary('CECompressv4.dll');
  if DLLHandle>0 then
  try
  @Func:=GetProcAddress(DLLHandle,PChar('CECompress'));
  if Assigned(@Func) then
    begin
      D:=Func(Pin,in_len, Pout, in_len-1,1,4096);
      with Form1 do
      if (D=$FFFFFFFF) then op_log('压缩错误')
        else result:=D;
    end
      else
      ShowMessage('CECompress函数没有找到');
  finally
    FreeLibrary(DLLHandle); {释放DLL}
  end
  else
  ShowMessage('CECompressv4.dll没有找到');
end;

function get_rom_info():integer;
var
iFileHandle:integer;
i:longword;
begin
  result:=-1;
  with Form1 do
  if FileExists(Opendialog1.FileName) then
  begin
  iFileHandle := FileOpen(Opendialog1.FileName, fmOpenRead);
  if iFileHandle >0 then
    begin
    try
      rom_size := FileSeek(iFileHandle,0,2);
      //找ECEC标志及入口
      FileSeek(iFileHandle,0,0);
      i:=0;//longword不能为-4
      Repeat
        i:=i+4;
        application.ProcessMessages;
      Until ((get_ibyte(iFileHandle,i,4)='43454345') or (i >=rom_size)or (i >=20480));
      if (i >=rom_size)or (i >=20480) then
        begin
          showmessage(ExtractFileName(Opendialog1.Filename)+'不是正常ROM文件!');
          op_log(ExtractFileName(Opendialog1.Filename)+'不是正常ROM文件!');
          Opendialog1.FileName:='';
          result:=-1;
        end
          else
          begin
            rom_in:=strtoint64def('$'+address_conv(get_ibyte(iFileHandle,(i+4),4),false),-1);           //82ff1234->2FB1234
            rom_mod_start:=rom_in+84;
            rom_end:=get_ibyte(iFileHandle,(rom_in+12),4);
            num_mod:=strtoint64def('$'+get_ibyte(iFileHandle,rom_in+16,4),-1);
            num_filent:=strtoint64def('$'+get_ibyte(iFileHandle,rom_in+48,4),-1);
            now_address:=(rom_in+84+longword(32*num_mod)+longword(28*num_filent));//文件指针区尾地址

           //ROM信息
            StaticText1.Caption:=' 文件大小:'+inttostr(rom_size)+#13
            +' 文件总数:'+ inttostr(num_mod+num_filent)
            +' [M:'+inttostr(num_mod)
            +' / F:'+inttostr(num_filent)+']';
            if debug then op_log('不增加ROM长度可增加Filent文件数:'+inttostr((rom_size-16-now_address) div 28));
            
            {i:= (rom_mod_start-4); //找文件指针区的最后空位
            Repeat
            i:=i+4;
            Until ((get_ibyte(iFileHandle,i,4)='00000000') or (i >=iFileLength));
            //if i>=(iFileLength-44) then  }
            result:=0;
           end;
    finally
      FileClose(iFileHandle);
    end;
    end;
  end;
end;

function del_f_file(iFileHandle:integer;File_name:string):integer;
var
i,j:int64;
nadd,fadd:string;//name&file address
fsize:integer;
s:string;
Buffer,Buffer_0:Pbyte;
irow:integer;
begin
result:=0; //是否处理
            i:=rom_in+84+longword(32*num_mod)+longword(28*num_filent);//Filent文件指针结束
            j:=num_filent;
            repeat
              begin
              //application.ProcessMessages;
              nadd:=address_conv(get_ibyte(iFileHandle,i-8,4),false);
              s:=getname(iFileHandle,nadd);
              i:=i-28;
              j:=j-1;
              end;
            Until (j<=1) or (File_name=s);
            if File_name=s then
              begin
              fsize:=strtointdef('$'+get_ibyte(iFileHandle,i+16,4),0);
              fadd:=address_conv(get_ibyte(iFileHandle,i+24,4),false);
                j:=Fileseek(iFileHandle,0,2)-(i+28);//后面文件指针长度 
                Buffer_0:=Allocmem(256);
                Buffer:=Allocmem(j+29);
                try
                  //清除文件名
                  Fileseek(iFileHandle,strtoint64def('$'+nadd,0),0);
                  Filewrite(iFileHandle,Buffer_0^,length(s));//name
                  //清除文件指针
                  Fileseek(iFileHandle,i+28,0);
                  FileRead(iFileHandle,Buffer^,j); //copy
                  Fileseek(iFileHandle,i,0);
                  Filewrite(iFileHandle,Buffer^,j+28); //paste
                  //改文件数
                  num_filent:=num_filent-1;//file number
                  FileSeek(iFileHandle,rom_in+48,0);
                  FileWrite(iFileHandle,num_filent, sizeof(num_filent));
                  //清除数据
                  Freemem(Buffer);///
                  Buffer:=Allocmem(fsize+1);//delete data
                  FileSeek(iFileHandle,strtoint64def('$'+fadd,0),0);
                  FileWrite(iFileHandle,Buffer^, fsize);
                with Form1 do
                  begin
                  op_log('文件"'+File_name+'"已删除!');
                  for irow:=0 to ListView1.Items.Count-1 Do
                    if ListView1.Items[irow].Caption = s then
                      begin
                      ListView1.Items.Item[irow].Delete;  //删除当前选中行
                      break;
                      end else Button5.Click;
                  end;
                result:=1;
                finally
                  Freemem(Buffer_0);
                  Freemem(Buffer);
                end;
              end;
end;

function del_m_file(iFileHandle:integer;File_name:string):integer;
var
i,j:int64;
nadd,fadd:string;//name&file address
struct_num_add,struct_add:string;
fsize,istruct:integer;
s:string;
Buffer,Buffer_0:Pbyte;
s1,n1,n2:string;
irow:integer;
begin
result:=0; //是否处理
            i:=rom_in+84+longword(32*num_mod);//+longword(28*num_filent);//Filent文件指针结束
            j:=num_mod;
            repeat
              begin
              //application.ProcessMessages;
              nadd:=address_conv(get_ibyte(iFileHandle,i-16,4),false);
              //获取块数
              struct_num_add:=address_conv(get_ibyte(iFileHandle,i-12,4),false);
              FileSeek(iFileHandle,(strtointdef('$'+struct_num_add,-1)),0);
              FileRead(iFileHandle, istruct, 1);

              struct_add:=address_conv(get_ibyte(iFileHandle,i-8,4),false);
              s:=getname(iFileHandle,nadd);
              s1:=get_ibyte(iFileHandle,strtoint64def('$'+struct_add,0),24*istruct);//读struct块数据
              i:=i-32;
              j:=j-1;
              end;
            Until (j<=1) or (File_name=s);
            if File_name=s then
              begin
              //fsize:=strtointdef('$'+get_ibyte(iFileHandle,i+16,4),0);
              //fadd:=get_ibyte(iFileHandle,i+24,4);
                j:=Fileseek(iFileHandle,0,2)-(i+32);//后面文件指针长度
                Buffer_0:=Allocmem(256);
                Buffer:=Allocmem(j+33);
                try
                  //清除文件名
                  Fileseek(iFileHandle,strtoint64def('$'+nadd,0),0);
                  Filewrite(iFileHandle,Buffer_0^,length(s));//name
                  //清除struct段          
                  Fileseek(iFileHandle,strtoint64def('$'+struct_add,0),0);//定位到Struct地址
                  Filewrite(iFileHandle,Buffer_0^,24*istruct);
                  //清除struct_num段
                  Fileseek(iFileHandle,strtoint64def('$'+struct_num_add,0),0);//定位到Struct_num地址
                  Filewrite(iFileHandle,Buffer_0^,108);//段长为6C=108
                  //清除文件指针
                  Fileseek(iFileHandle,i+32,0);
                  FileRead(iFileHandle,Buffer^,j); //copy
                  Fileseek(iFileHandle,i,0);
                  Filewrite(iFileHandle,Buffer^,j+32); //paste 多写32位0
                  //改文件数
                  num_mod:=num_mod-1;//file number
                  FileSeek(iFileHandle,rom_in+16,0);
                  FileWrite(iFileHandle,num_mod, sizeof(num_mod));
                  //清除各块数据
                  while istruct>0 do
                    begin
                      fadd:=address_conv(copy(s1,48*(istruct-1)+17,8),false);
                      n1:=copy(s1,48*(istruct-1)+41,8);
                      n2:=copy(s1,48*(istruct-1)+25,8);
                      if n1>n2 then fsize:=strtointdef('$'+n2,0) else fsize:=strtointdef('$'+n1,0);//以小Size的计算结束地址

                      Freemem(Buffer);///
                      Buffer:=Allocmem(fsize+1);
                      Fileseek(iFileHandle,strtoint64def('$'+fadd,0),0);
                      Filewrite(iFileHandle,Buffer^,fsize);
                      with Form1 do//删除列表中信息
                      for irow:=ListView1.Items.Count-1 downto 0 Do
                      if ListView1.Items[irow].Caption=('  '+File_name+'_'+inttostr(istruct-1)) then
                        begin
                        ListView1.Items.Item[irow].Delete;  //删除当前选中行
                        break;
                        end;
                      //if FindRow('  '+File_name+'_'+inttostr(istruct-1),irow)=true then DeleteRow(irow);
                      istruct:=istruct-1;
                    end;
                  begin
                  op_log('模块文件"'+File_name+'"已删除!');
                with Form1 do
                  for irow:=ListView1.Items.Count-1 downto 0 Do
                      if ListView1.Items[irow].Caption=s then
                        begin
                        ListView1.Items.Item[irow].Delete;  //删除当前选中行
                        break;
                        end else Button5.Click;
                  end;
                result:=1;
                finally            
                  Freemem(Buffer_0);
                  Freemem(Buffer);
                end;
              end;
end;

function CustomSortProc(Item1,Item2:TListItem;ParamSort:Integer):integer;stdcall;//stdcall声明一定要
var
 txt1,txt2:String;
 n1,n2:integer;
begin
  case ParamSort of
  -1:begin//定义用于ListView2的大小排列
      n1:= strtointdef(Item1.Caption,0);
      n2:= strtointdef(Item2.Caption,0);
      if   m_bSort   then
      begin
            Result:=n1-n2;
      end
      else
      begin
            Result:=n2-n1;
      end;
    end;
  0: begin
      if   m_bSort   then
      begin
            Result:=CompareText(Item1.Caption,Item2.Caption);
      end
      else
      begin
            Result:=-CompareText(Item1.Caption,Item2.Caption);
      end;
    end;
  3,4:
    begin
      n1:= strtointdef(Item1.SubItems.Strings[ParamSort-1],0);
      n2:= strtointdef(Item2.SubItems.Strings[ParamSort-1],0);
      if m_bSort then
      begin
            Result:=n1-n2;
      end
      else
      begin
            Result:=n2-n1;
      end;
    end;
  else
    begin
      txt1:= Item1.SubItems.Strings[ParamSort-1];
      txt2:= Item2.SubItems.Strings[ParamSort-1];
      if m_bSort then
      begin
            Result:=CompareText(txt1,txt2);
      end
      else
      begin
            Result:=-CompareText(txt1,txt2);
      end;
    end;
  end
end;

{function CheckData0(iFileHandle:integer;iStartAddress:int64;iSize:Integer):integer;
var
Buffer:pChar;
i:integer;
begin
  result:=1;
  Buffer := Pchar(AllocMem(iSize+1));

  FileSeek(iFileHandle,iStartAddress,0);
  FileRead(iFileHandle, Buffer^, iSize);
  for  i:=0 to iSize-1 do
  begin
    if (Buffer[i]<>#0) then
    begin
      result:=0;
      break;

⌨️ 快捷键说明

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