home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 06_07 / libmon.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-04-05  |  6.5 KB  |  294 lines

  1.  
  2. (********************************************************)
  3. (*                    LIBMON.PAS                        *)
  4. (*      Library-Monitor zur Analyse von Library-Files   *)
  5.  
  6. PROGRAM LibMon;
  7.  
  8. TYPE ByteFile = FILE OF BYTE;
  9.      Str255 = STRING[255];
  10.  
  11. VAR InN : Str255;
  12.     InF : ByteFile;
  13.     b : BYTE;
  14.     found: BOOLEAN;
  15.     Wahl : CHAR;
  16.     Adr : Str255;
  17.     Nr : INTEGER;
  18.  
  19.  
  20. TYPE zweichar = STRING[2];
  21.  
  22. CONST IdentSet : SET OF CHAR = ['a'..'z','A'..'Z',
  23.                                 '0'..'9','_','@','$'];
  24.  
  25. PROCEDURE Usage;
  26.  
  27. BEGIN
  28.   WriteLn('## LIBMON ##');
  29.   WriteLn('Usage: LIBMON Libfile');
  30. END;
  31.  
  32. FUNCTION Hex(i : INTEGER) : Str255;
  33.  
  34. CONST HexDigit : ARRAY[0..15] OF CHAR = '0123456789ABCDEF';
  35.  
  36. BEGIN
  37.   Hex := Concat(HexDigit[i DIV 4096],
  38.                 HexDigit[(i MOD 4096)DIV 256],
  39.                 HexDigit[(i MOD 256) DIV 16],
  40.                 HexDigit[i MOD 16]);
  41. END;
  42.  
  43.  
  44. FUNCTION Dez(Hex : Str255) : INTEGER;
  45.  
  46. CONST HexDigit : ARRAY[0..15] OF CHAR = '0123456789ABCDEF';
  47.  
  48. VAR i,Faktor,Res : INTEGER;
  49.  
  50. BEGIN
  51.   Faktor := 1;
  52.   Res := 0;
  53.   FOR i := Length(Hex) DOWNTO 1 DO BEGIN
  54.     Res := Res + Faktor*(Pos(Hex[i],HexDigit)-1);
  55.     Faktor := Faktor * 16;
  56.   END;
  57.   Dez := Res;
  58. END;
  59.  
  60.  
  61. PROCEDURE Dump(VAR f : ByteFile;
  62.                AdrStr : Str255; Nr : INTEGER);
  63.  
  64. VAR Adr, i, ZeilenZeichen : INTEGER;
  65.     temp : Str255;
  66.  
  67. BEGIN
  68.   temp := '';
  69.   FOR i := 1 TO Length(AdrStr) DO
  70.     temp := Concat(temp,UpCase(AdrStr[i]));
  71.   Adr := Dez(AdrStr);
  72.   WriteLn;  WriteLn;
  73.   Seek(f,Adr);
  74.   ZeilenZeichen := 0;
  75.   Write(Concat(Hex(Adr),'      '));
  76.   FOR i := 0 TO Nr-1 DO BEGIN
  77.     ZeilenZeichen := ZeilenZeichen+1;
  78.     IF ZeilenZeichen > 20 THEN BEGIN
  79.       WriteLn;
  80.       Write(Concat(Hex(Adr+i),'      '));
  81.       ZeilenZeichen := 0;
  82.     END;
  83.     IF NOT(Eof(f)) THEN BEGIN
  84.       Read(f,b);
  85.       Write(Copy(Hex(Ord(b)),3,2):3);
  86.     END;
  87.   END;
  88. END;
  89.  
  90.  
  91. FUNCTION Match(VAR f : ByteFile;
  92.                ByteStr : Str255) : BOOLEAN;
  93.  
  94. VAR foundfirst, found : BOOLEAN;
  95.     Last : INTEGER;
  96.  
  97.   FUNCTION SearchFirst(c : CHAR) : BOOLEAN;
  98.   VAR z : BYTE;
  99.   BEGIN
  100.     IF NOT(Eof(f)) THEN Read(f,z);
  101.     WHILE NOT(Eof(f)) AND (z <> Ord(c)) DO
  102.       Read(f,z);
  103.     SearchFirst := z = Ord(c);
  104.   END;
  105.  
  106.  
  107.   FUNCTION CompStr : BOOLEAN;
  108.  
  109.   VAR tempStr : Str255;
  110.       i : INTEGER;
  111.       b : BYTE;
  112.  
  113.   BEGIN
  114.     tempStr := '';
  115.     FOR i := 2 TO Length(ByteStr) DO BEGIN
  116.       IF Eof(f) THEN BEGIN
  117.         CompStr := FALSE;
  118.         Exit;
  119.       END
  120.       ELSE BEGIN
  121.         Read(f,b);
  122.         tempStr := Concat(tempStr,Chr(b));
  123.       END;
  124.     END;
  125.     CompStr := (Concat(ByteStr[1],tempStr) = ByteStr);
  126.   END;
  127.  
  128. BEGIN
  129.   REPEAT
  130.     foundfirst := SearchFirst(ByteStr[1]);
  131.     Last := FilePos(f);
  132.     IF foundfirst THEN BEGIN
  133.       found := CompStr;
  134.       IF NOT found THEN Seek(f,Last);
  135.     END
  136.     ELSE BEGIN
  137.       found := FALSE;
  138.     END;
  139.   UNTIL NOT(foundfirst) OR found;
  140.   Match := found;
  141. END;
  142.  
  143.  
  144. (* Module suchen *)
  145. PROCEDURE SearchModuls(VAR f : ByteFile;
  146.                        VAR found : BOOLEAN);
  147.  
  148. VAR IdentStr : Str255;
  149.     i : INTEGER;
  150.  
  151. BEGIN
  152.   IdentStr := '';
  153.   (* Acht führénde Nullen... *)
  154.   FOR i := 1 TO 8 DO IdentStr := Concat(IdentStr,Chr($00));
  155.   (* ...dann $80,$08,$00 *)
  156.   found := Match(f,Concat(IdentStr,Chr($80),Chr($08),Chr($00)));
  157. END;
  158.  
  159.  
  160.  
  161. (* Identifier suchen (erste Sorte) *)
  162. PROCEDURE SearchIdenty1(VAR f : ByteFile;
  163.                         VAR  found : BOOLEAN);
  164.  
  165. BEGIN
  166.   found := Match(f,Concat(Chr($00),Chr($00),Chr($01)));
  167. END;
  168.  
  169.  
  170. (* Identifier suchen (zweite Sorte) *)
  171. PROCEDURE SearchIdenty2(VAR f : ByteFile;
  172.                         VAR  found : BOOLEAN);
  173.  
  174. BEGIN
  175.   found := Match(f,Concat(Chr($0f),Chr($00),Chr($00),
  176.                           Chr($00),Chr($00),Chr($00)));
  177. END;
  178.  
  179.  
  180. (* Ersten Identifier in Microsoft-Tabelle suchen *)
  181. PROCEDURE SearchMSTabFirst(VAR f : ByteFile;
  182.                            VAR  found : BOOLEAN);
  183.  
  184. BEGIN
  185.   found := Match(f,Concat('!',Chr($01),Chr($00)));
  186. END;
  187.  
  188.  
  189. (* Identifier in Microsoft-Tabelle suchen *)
  190. PROCEDURE SearchMSTab(VAR f : ByteFile;
  191.                       VAR found : BOOLEAN);
  192.  
  193. BEGIN
  194.   found := Match(f,Concat('{',Chr($00),Chr($00)));
  195. END;
  196.  
  197.  
  198. PROCEDURE WriteCountStr(Leader: Str255; VAR f : ByteFile);
  199.  
  200. LABEL 9999;
  201. VAR count, i, c : BYTE;
  202.     s : Str255;
  203.  
  204. BEGIN
  205.   s := Leader;
  206.   Read(f,count);
  207.   FOR i := 1 TO count DO BEGIN
  208.     Read(f,c);
  209.     IF Chr(c) IN IdentSet THEN
  210.       s := Concat(s,Chr(c))
  211.     ELSE
  212.       GOTO 9999;
  213.   END;
  214.   IF s <> Leader THEN WriteLn(s);
  215. 9999:
  216. END;
  217.  
  218.  
  219.  
  220. BEGIN
  221.   IF ParamCount <> 1 THEN BEGIN
  222.     Usage;
  223.     Exit
  224.   END;
  225.   InN := paramstr(1);
  226.   Assign(InF,InN); ReSet(InF);
  227.   ClrScr;
  228.   Write('******************** LIBRARY-MONITOR : ');
  229.   Write(InN); WriteLn(' **********************');
  230.   WriteLn; WriteLn;
  231.   WriteLn('-------- Module in der Library -------------');
  232.   found := FALSE;
  233.   REPEAT
  234.     SearchModuls(InF,found);
  235.     IF found THEN BEGIN
  236.       WriteCountStr(Concat('Offset: ',Hex(FilePos(InF)),
  237.                     '           '),InF);
  238.     END;
  239.   UNTIL NOT found;
  240.   WriteLn; WriteLn;
  241.  
  242.   WriteLn('------- Identifier der Library I ----------');
  243.   ReSet(InF);
  244.   found := FALSE;
  245.   REPEAT
  246.     SearchIdenty1(InF,found);
  247.     IF found THEN BEGIN
  248.       WriteCountStr(Concat('Offset: ',Hex(FilePos(InF)),
  249.                            '           '),InF);
  250.     END;
  251.   UNTIL NOT found;
  252.   WriteLn; WriteLn;
  253.  
  254.   WriteLn('------- Identifier der Library II --------');
  255.   ReSet(InF);
  256.   found := FALSE;
  257.   REPEAT
  258.     SearchIdenty2(InF,found);
  259.     IF found THEN BEGIN
  260.       WriteCountStr(Concat('Offset: ',Hex(FilePos(InF)),
  261.                            '           '),InF);
  262.     END;
  263.   UNTIL NOT found;
  264.   WriteLn; WriteLn;
  265.  
  266.   WriteLn('------ Identifier in der MS-Tabelle --------');
  267.   ReSet(InF);
  268.   SearchMSTabFirst(InF,found);
  269.   IF found THEN
  270.     WriteCountStr(Concat('Offset: ',Hex(FilePos(InF)),
  271.                          '           '),InF);
  272.   found := FALSE;
  273.   REPEAT
  274.     SearchMSTab(InF,found);
  275.     IF found THEN BEGIN
  276.       WriteCountStr(Concat('Offset: ',Hex(FilePos(InF)),
  277.                            '           '),InF);
  278.     END;
  279.   UNTIL NOT found;
  280.   WriteLn; WriteLn;
  281.  
  282.   REPEAT
  283.     Write('***** HEXDUMP (j/n): '); ReadLn(Wahl);
  284.     IF Wahl IN ['j','J'] THEN BEGIN
  285.       Write('***** Start-Adr: '); ReadLn(Adr);
  286.       Write('*****  Nr-Bytes: '); ReadLn(Nr);
  287.       WriteLn;
  288.       Dump(InF,Adr,Nr);
  289.     END;
  290.     WriteLn; WriteLn;
  291.   UNTIL Wahl IN ['n','N'];
  292.   Close(InF);
  293. END.
  294.