char *wpiGetLabel(UINT addr, INT32 *found = NULL) { INT32 pVal; SYM_TYPE pType; char name[MAX_SYS_SYM_LEN + 1]; static char label[DBG_DEMANGLE_PRINT_LEN + 1 + 11]; bzero(label, DBG_DEMANGLE_PRINT_LEN + 1 + 11); if (symFindByValue(sysSymTbl, addr, name, &pVal, &pType) == OK) { cplusDemangle(name, label, sizeof(label) - 11); if ((UINT)pVal != addr) { sprintf(&label[strlen(label)], "+0x%04x", addr-pVal); if (found) *found = 2; } else { if (found) *found = 1; } } else { sprintf(label, "0x%04x", addr); if (found) *found = 0; } return label; }
LOCAL void taskHookShow ( FUNCPTR table[], /* table from which to delete */ int maxEntries /* max entries in table */ ) { FAST int ix; char * name; /* pointer to symTbl copy of name */ int displacement; void * symValue; /* actual symbol value */ SYMBOL_ID symId; /* symbol identifier */ char demangled[TASK_DEMANGLE_PRINT_LEN+1]; char * nameToPrint; /* * Only check one symLib function pointer (for performance's sake). * All symLib functions are provided by the same library, by convention. */ if ((_func_symFindSymbol !=(FUNCPTR) NULL) && (sysSymTbl != NULL)) { for (ix = 0; ix < maxEntries; ++ix) { if (table [ix] == NULL) break; if (((* _func_symFindSymbol) (sysSymTbl, NULL, (void *)table[ix], SYM_MASK_NONE, SYM_MASK_NONE, &symId) == OK) && ((* _func_symNameGet) (symId, &name) == OK) && ((* _func_symValueGet) (symId, &symValue) == OK)) { nameToPrint = cplusDemangle (name, demangled, sizeof (demangled)); printf ("%-15s", nameToPrint); if ((displacement = (int)table[ix] - (int)symValue) != 0) printf ("+0x%-4x", displacement); else printf ("%6s", ""); /* no displacement */ } printf ("\n"); } } else { for (ix = 0; ix < maxEntries; ++ix) { if (table [ix] == NULL) break; printf ("%#21x", table [ix]); printf ("\n"); } } }
LOCAL void timexShowCalls ( CALL_ARRAY calls /* list of functions to be displayed */ ) { char *name; /* pointer to sym table's copy of name string */ char demangled [TIMEX_DEMANGLE_PRINT_LEN + 1]; char *nameToPrint; void *value; SYMBOL_ID symId; /* symbol identifier */ int offset; int i; int j; int arg; int ncalls = 0; for (i = 0; i < MAX_CALLS; i++) { if (calls[i].func != timexNull) { ncalls++; if ((symFindSymbol (sysSymTbl, NULL, (void *)calls[i].func, SYM_MASK_NONE, SYM_MASK_NONE, &symId) != OK) || (symNameGet (symId, &name) != OK) || (symValueGet (symId, &value) != OK)) printf (" %d: 0x%x (", i, (int)calls[i].func); else { offset = (int) calls[i].func - (int) value; nameToPrint = cplusDemangle (name, demangled, sizeof (demangled)); if (offset == 0) printf (" %d: %s (", i, nameToPrint); else printf (" %d: %s+%x (", i, nameToPrint, offset); } for (j = 0; j < MAX_ARGS; j++) { if (j != 0) printf (", "); arg = calls[i].arg[j]; if ((-9 <= arg) && (arg <= 9)) printf ("%d", arg); else printf ("0x%x", arg); } printf (")\n"); } } if (ncalls == 0) printf (" (none)\n"); }