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

gehe zum Quellcode dieser Datei

Datenstrukturen

struct  Instr
 

Funktionen

void usage ()
 
int bits (uint32_t v)
 
void dump_sig (uint32_t pos, int size, FILE *f)
 
int main (int argc, char **argv)
 

Variablen

Instr instrs []
 
uint32_t buf [1024]
 

Dokumentation der Funktionen

int bits ( uint32_t  v)

Definiert in Zeile 269 der Datei gensig_dryos.c.

269  {
270  int i, res=0;
271 
272  for (i=0; i<32; ++i)
273  res+=(v>>i)&1;
274 
275  return res;
276 }
void dump_sig ( uint32_t  pos,
int  size,
FILE f 
)

Definiert in Zeile 280 der Datei gensig_dryos.c.

281 {
282  int i, j;
283  char tbuf[1024];
284  int finish = 0;
285  int wcount = 0;
286 
287  int offset_mask = 0;
288  if (size < 0)
289  {
290  size = -size;
291  offset_mask = 0xfff;
292  }
293 
294  fseek(f, pos, SEEK_SET);
295  i = fread(buf, 4, size, f);
296 
297  for (i=0;i<size;++i){
298  tbuf[0]=0;
299  for (j=0;instrs[j].inst | instrs[j].mask;j++){
300  if ((buf[i] & instrs[j].mask) == instrs[j].inst){
301  uint32_t ignore = ~instrs[j].ignore | offset_mask;
302  //if (!instrs[j].is_adr)
303  {
304  if (!tbuf[0])
305  sprintf(tbuf, "\t{ %3d, 0x%08x, 0x%08x }, //", i, buf[i] & ignore, ignore);
306  sprintf(tbuf+strlen(tbuf), " %s:%d:0x%08X", instrs[j].cmd, bits(instrs[j].mask), buf[i]);
307  wcount++;
308  if ((buf[i] == 0xe1a0f00e) /* "mov pc,lr" aka "ret" */
309  && (size*100/wcount) > 75){
310  sprintf(tbuf+strlen(tbuf), "\t/* RET found, stopping... */");
311  finish = 1;
312  }
313  }
314  break;
315  }
316  }
317  if (tbuf[0])
318  printf("%s\n", tbuf);
319  if (finish)
320  break;
321  }
322  printf("\t/* %d/%d */\n",wcount, size);
323 }
int main ( int  argc,
char **  argv 
)

Definiert in Zeile 325 der Datei gensig_dryos.c.

326 {
327  char *proc_name;
328  FILE *f;
329  uint32_t base;
330  uint32_t pos, lnk_pos;
331  uint32_t size, lnk_size;
332 // int i,j;
333 // int wcount;
334 // char tbuf[1024];
335 // int finish;
336 
337  if (argc != 8)
338  usage();
339 
340  f = fopen(argv[1], "r+b");
341 
342  if (f == NULL)
343  usage();
344 
345  base = strtoul(argv[2], NULL, 0);
346  proc_name = argv[3];
347  pos = strtoul(argv[4], NULL, 0) - base;
348  size = strtoul(argv[5], NULL, 0);
349  lnk_pos = strtoul(argv[6], NULL, 0);
350  if (lnk_pos != 0) lnk_pos -= base;
351  lnk_size = strtoul(argv[7], NULL, 0);
352 // wcount = 0;
353 
354  printf("static FuncSig func_sig_%s[] = {\n",proc_name);
355 
356  dump_sig(pos,size,f);
357 
358  if (lnk_pos != 0)
359  {
360  printf("\t{ -1, %d, -2 },\n",size-1);
361  dump_sig(lnk_pos,lnk_size,f);
362  }
363  printf("\t{ -1, -1, -1 },\n");
364  printf("};\n\n");
365 
366  fclose(f);
367 
368  return 0;
369 }
void usage ( void  )

Definiert in Zeile 263 der Datei gensig_dryos.c.

264 {
265  printf("gensig <primary> <base> <proc_name> <proc_vaddr> <proc_size>\n");
266  exit(1);
267 }

Variablen-Dokumentation

uint32_t buf[1024]

Definiert in Zeile 278 der Datei gensig_dryos.c.

Instr instrs[]

Definiert in Zeile 197 der Datei gensig_dryos.c.