home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / vp21beta.zip / LRTLSRC.RAR / PE2ELF / RESKONV.PAS < prev    next >
Pascal/Delphi Source File  |  2000-08-15  |  6KB  |  190 lines

  1. (*$Alignrec-*)
  2. unit reskonv; (* Convert Resource(tree)s *)
  3.  
  4. interface
  5.  
  6. uses pe2lety;
  7.  
  8. procedure konvertiere_resourcen(
  9.   const quelle                  :pointer;
  10.   const quell_laenge,quell_rva  :longint;
  11.   var   ziel                    :speicherfeld_z_typ;
  12.   var   ziel_laenge             :longint);
  13.  
  14. implementation
  15.  
  16. type
  17.  
  18.   RESOURCE_DIR_ENTRIES_typ=
  19.     record
  20.       NAME_RVA_or_INTEGER_ID    :longint;
  21.       DATA_ENTRY_RVA_or_SUBDIR_RVA:longint; (* Bit 31=1 -> Subdir *)
  22.     end;
  23.  
  24.   Resource_Directory_Table_typ=
  25.     record
  26.       RESOURCE_FLAGS            :longint;
  27.       TIME_DATE_STAMP           :longint;
  28.       MAJOR_VERSION             :smallword;
  29.       MINOR_VERSION             :smallword;
  30.       number_of_NAME_ENTRY      :smallword;
  31.       number_of_ID_ENTRY        :smallword;
  32.       RESOURCE_DIR_ENTRIES      :array[1..100000] of RESOURCE_DIR_ENTRIES_typ;
  33.     end;
  34.  
  35.   Resource_Directory_Table_z_typ=^Resource_Directory_Table_typ;
  36.  
  37.   Resource_Data_Entry=
  38.     record
  39.       DATA_RVA                  :longint;
  40.       SIZE                      :longint;
  41.       CODEPAGE                  :longint;
  42.       RESERVED                  :longint;
  43.     end;
  44.  
  45.   Resource_Data_Entry_z_typ     =^Resource_Data_Entry;
  46.  
  47.  
  48. procedure konvertiere_resourcen(
  49.   const quelle                  :pointer;
  50.   const quell_laenge,quell_rva  :longint;
  51.   var   ziel                    :speicherfeld_z_typ;
  52.   var   ziel_laenge             :longint);
  53.  
  54.  
  55.   procedure schreibe(var a;laenge:longint);
  56.     begin
  57.       Move(a,Mem[ofs(ziel^)+ziel_laenge],laenge);
  58.       Inc(ziel_laenge,laenge);
  59.     end;
  60.  
  61.   var
  62.     resource_typid,
  63.     resource_nameid             :smallword;
  64.  
  65.     d32_reso_kopf:
  66.       record
  67.         reso_laenge             :longint;
  68.         reso_typ,reso_id        :smallword;
  69.       end;
  70.  
  71.   procedure kopiere_resourcen(const r:Resource_Data_Entry_z_typ);
  72.     var
  73.       weiter                    :pointer;
  74.       zaehler,
  75.       string_laenge,
  76.       lese_position,
  77.       schreib_position          :longint;
  78.       temp                      :array[0..16*8000] of byte;
  79.     begin
  80.       weiter:=ptr(ofs(quelle^)+r.DATA_RVA-quell_rva);
  81.       d32_reso_kopf.reso_id:=resource_nameid;
  82.  
  83.       if resource_typid=6 (* StringTable *) then
  84.         begin
  85.           d32_reso_kopf.reso_typ:=0;  (* StringTable *)
  86.           dec(d32_reso_kopf.reso_id); (* $ff80 -> $0ff9 -> $0ff8 *)
  87.  
  88.           lese_position:=ofs(weiter^);
  89.           schreib_position:=0;
  90.  
  91.           for zaehler:=0 to 15 do
  92.             begin
  93.               string_laenge:=memw[lese_position];
  94.               inc(lese_position,2);
  95.               temp[schreib_position]:=lo(string_laenge);
  96.               inc(schreib_position);
  97.               temp[schreib_position]:=hi(string_laenge);
  98.               inc(schreib_position);
  99.  
  100.               (*write(d32_reso_kopf.reso_id*16+zaehler,', "');*)
  101.  
  102.               while string_laenge>0 do
  103.                 begin
  104.                   temp[schreib_position]:=mem[lese_position];
  105.                   (*write(chr(mem[lese_position]));*)
  106.                   inc(lese_position,2);
  107.                   inc(schreib_position);
  108.                   dec(string_laenge);
  109.                 end;
  110.  
  111.               (*writeln('"');*)
  112.  
  113.             end;
  114.           d32_reso_kopf.reso_laenge:=sizeof(d32_reso_kopf)+schreib_position;
  115.           schreibe(d32_reso_kopf,sizeof(d32_reso_kopf));
  116.           schreibe(temp,schreib_position);
  117.         end
  118.       else
  119.         begin
  120.           d32_reso_kopf.reso_typ:=1; (* binary *)
  121.           d32_reso_kopf.reso_laenge:=r.size+sizeof(d32_reso_kopf);
  122.           schreibe(d32_reso_kopf,sizeof(d32_reso_kopf));
  123.           schreibe(weiter^,r.size);
  124.         end;
  125.     end;
  126.  
  127.   procedure Language_baum(const l:Resource_Directory_Table_z_typ);
  128.     var
  129.       zaehler                   :longint;
  130.       weiter                    :pointer;
  131.     begin
  132.       with l^ do
  133.         for zaehler:=1 to number_of_ID_ENTRY do
  134.           with RESOURCE_DIR_ENTRIES[zaehler] do
  135.             begin
  136.               if NAME_RVA_or_INTEGER_ID<>0 then
  137.                 writeln('warning: no multilanguage support!');
  138.               weiter:=ptr(ofs(quelle^)+(DATA_ENTRY_RVA_or_SUBDIR_RVA and $7fffffff));
  139.               if (DATA_ENTRY_RVA_or_SUBDIR_RVA and $80000000)=0 then
  140.                 kopiere_resourcen(Resource_Data_Entry_z_typ(weiter))
  141.               else
  142.                 Language_baum(Resource_Directory_Table_z_typ(weiter));
  143.             end;
  144.     end;
  145.  
  146.   procedure NameId_baum(const l:Resource_Directory_Table_z_typ);
  147.     var
  148.       zaehler                   :longint;
  149.       weiter                    :pointer;
  150.     begin
  151.       with l^ do
  152.         for zaehler:=1 to number_of_ID_ENTRY do
  153.           with RESOURCE_DIR_ENTRIES[zaehler] do
  154.             begin
  155.               resource_nameid:=NAME_RVA_or_INTEGER_ID;
  156.               weiter:=ptr(ofs(quelle^)+(DATA_ENTRY_RVA_or_SUBDIR_RVA and $7fffffff));
  157.               if (DATA_ENTRY_RVA_or_SUBDIR_RVA and $80000000)=0 then
  158.                 kopiere_resourcen(Resource_Data_Entry_z_typ(weiter))
  159.               else
  160.                 Language_baum(Resource_Directory_Table_z_typ(weiter));
  161.             end;
  162.     end;
  163.  
  164.   procedure TypeId_baum(const l:Resource_Directory_Table_z_typ);
  165.     var
  166.       zaehler                   :longint;
  167.       weiter                    :pointer;
  168.     begin
  169.       with l^ do
  170.         for zaehler:=1 to number_of_ID_ENTRY do
  171.           with RESOURCE_DIR_ENTRIES[zaehler] do
  172.             begin
  173.               resource_typid :=NAME_RVA_or_INTEGER_ID;
  174.               resource_nameid:=0;
  175.               weiter:=ptr(ofs(quelle^)+(DATA_ENTRY_RVA_or_SUBDIR_RVA and $7fffffff));
  176.               if (DATA_ENTRY_RVA_or_SUBDIR_RVA and $80000000)=0 then
  177.                 kopiere_resourcen(Resource_Data_Entry_z_typ(weiter))
  178.               else
  179.                 NameId_baum(Resource_Directory_Table_z_typ(weiter));
  180.             end;
  181.     end;
  182.  
  183.  
  184.   begin
  185.     TypeId_baum(Resource_Directory_Table_z_typ(quelle));
  186.   end;
  187.  
  188. end.
  189.  
  190.