CHDK_DE Vorschauversion  Trunk Rev. 6014
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
extract_event_procedures.c-Dateireferenz
#include <stdio.h>
+ Include-Abhängigkeitsdiagramm für extract_event_procedures.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define DUMP_SIZE   0x400000
 
#define HOST_ADDR(addr)   ((addr)-baseaddr+dump)
 
#define PEEKW(addr)   (*(int*)HOST_ADDR(addr))
 
#define ADDR(idx)   (baseaddr+(idx))
 
#define IS_METHOD(addr)   (addr > baseaddr && addr < baseaddr+DUMP_SIZE && PEEKW(addr) != 0 && isString(HOST_ADDR(addr)) < 4)
 
#define MATCH_POSTFIX()   printf("};\n")
 
#define MATCH_PREFIX()   printf("#include <idc.idc>\nstatic main(){\n")
 
#define MATCH_FOUND(s, addr)   printf("MakeNameEx(0x%x, \"%s\", SN_PUBLIC);\n", addr, s)
 
#define DEBUG(...)
 

Funktionen

int isIdentifies (char *str)
 
int isString (char *str)
 
int main (int argc, char **argv)
 

Makro-Dokumentation

#define ADDR (   idx)    (baseaddr+(idx))

Definiert in Zeile 12 der Datei extract_event_procedures.c.

#define DEBUG (   ...)

Definiert in Zeile 25 der Datei extract_event_procedures.c.

#define DUMP_SIZE   0x400000

Definiert in Zeile 6 der Datei extract_event_procedures.c.

#define HOST_ADDR (   addr)    ((addr)-baseaddr+dump)

Definiert in Zeile 8 der Datei extract_event_procedures.c.

#define IS_METHOD (   addr)    (addr > baseaddr && addr < baseaddr+DUMP_SIZE && PEEKW(addr) != 0 && isString(HOST_ADDR(addr)) < 4)

Definiert in Zeile 14 der Datei extract_event_procedures.c.

#define MATCH_FOUND (   s,
  addr 
)    printf("MakeNameEx(0x%x, \"%s\", SN_PUBLIC);\n", addr, s)

Definiert in Zeile 22 der Datei extract_event_procedures.c.

#define MATCH_POSTFIX ( )    printf("};\n")

Definiert in Zeile 19 der Datei extract_event_procedures.c.

#define MATCH_PREFIX ( )    printf("#include <idc.idc>\nstatic main(){\n")

Definiert in Zeile 20 der Datei extract_event_procedures.c.

#define PEEKW (   addr)    (*(int*)HOST_ADDR(addr))

Definiert in Zeile 10 der Datei extract_event_procedures.c.

Dokumentation der Funktionen

int isIdentifies ( char *  str)

Definiert in Zeile 28 der Datei extract_event_procedures.c.

28  {
29 
30  char * start = str;
31 
32  while (*str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z' || *str == '_')
33  {
34  str++;
35  if (str - start > 50) return 0;
36  if (*str == 0) return (str-start);
37  }
38 
39  return 0;
40 
41 }
int isString ( char *  str)

Definiert in Zeile 43 der Datei extract_event_procedures.c.

43  {
44 
45  char * start = str;
46 
47  while (*str >= 0x20 && *str < 0x7F || *str == 0x0A)
48  {
49  str++;
50  if (str - start > 500) return 0;
51  if (*str == 0) return (str-start);
52  }
53 
54  return 0;
55 
56 }
int main ( int  argc,
char **  argv 
)

Definiert in Zeile 58 der Datei extract_event_procedures.c.

58  {
59 
60  int baseaddr;
61 
62  if (argc < 2) {
63  printf("usage: <input dump file> <base address>\n");
64  return 1;
65  }
66 
67  sscanf(argv[2], "%x", &baseaddr);
68 
69  FILE *fd = fopen(argv[1], "r");
70  fseek(fd, 0, SEEK_SET);
71 
72  char *dump = malloc(DUMP_SIZE);
73 
74  fread(dump, 1, DUMP_SIZE, fd);
75 
76 
77  // Search for strings
78  int sidx;
79  for(sidx = 0; sidx < DUMP_SIZE; sidx +=1) {
80 
81  int idlen = isIdentifies(dump+sidx);
82 
83  if ( idlen <= 3) {
84  sidx += idlen;
85  continue;
86  }
87 
88  DEBUG("Searching for: %08x : %s\n", ADDR(sidx), HOST_ADDR(ADDR(sidx)));
89 
90  int tidx;
91  for(tidx = 0; tidx < DUMP_SIZE; tidx +=4) {
92 
93  if (PEEKW(ADDR(tidx)) == ADDR(sidx)) {
94 
95  DEBUG("Found ref:%x\n", baseaddr+tidx);
96  // Trying method address as the next entry in a table:
97  if ( IS_METHOD(PEEKW(ADDR(tidx+4))) ) {
98  MATCH_FOUND(dump+sidx, PEEKW(ADDR(tidx+4)) );
99  }
100  }
101 
102  }
103 
104 
105  sidx += idlen;
106  }
107 
108 
109  free(dump);
110  fclose(fd);
111 
112 }