winedump: List exported functions sorted by ordinal.

This commit is contained in:
Alexandre Julliard 2009-01-06 15:11:06 +01:00
parent 9a847b3ab0
commit d6617258b7
1 changed files with 17 additions and 27 deletions

View File

@ -469,7 +469,7 @@ static void dump_dir_exported_functions(void)
const DWORD* pFunc;
const DWORD* pName;
const WORD* pOrdl;
DWORD* map;
DWORD* funcs;
if (!exportDir) return;
@ -496,37 +496,27 @@ static void dump_dir_exported_functions(void)
pOrdl = RVA(exportDir->AddressOfNameOrdinals, exportDir->NumberOfNames * sizeof(WORD));
if (!pOrdl) {printf("Can't grab functions' ordinal table\n"); return;}
/* bit map of used funcs */
map = calloc(((exportDir->NumberOfFunctions + 31) & ~31) / 32, sizeof(DWORD));
if (!map) fatal("no memory");
funcs = calloc( exportDir->NumberOfFunctions, sizeof(*funcs) );
if (!funcs) fatal("no memory");
for (i = 0; i < exportDir->NumberOfNames; i++, pName++, pOrdl++)
{
map[*pOrdl / 32] |= 1 << (*pOrdl % 32);
for (i = 0; i < exportDir->NumberOfNames; i++) funcs[pOrdl[i]] = pName[i];
printf(" %08X %4u %s", pFunc[*pOrdl], exportDir->Base + *pOrdl,
get_symbol_str((const char*)RVA(*pName, sizeof(DWORD))));
/* check for forwarded function */
if ((const char *)RVA(pFunc[*pOrdl],sizeof(void*)) >= (const char *)exportDir &&
(const char *)RVA(pFunc[*pOrdl],sizeof(void*)) < (const char *)exportDir + size)
printf( " (-> %s)", (const char *)RVA(pFunc[*pOrdl],1));
printf("\n");
}
pFunc = RVA(exportDir->AddressOfFunctions, exportDir->NumberOfFunctions * sizeof(DWORD));
if (!pFunc)
{
printf("Can't grab functions' address table\n");
free(map);
return;
}
for (i = 0; i < exportDir->NumberOfFunctions; i++)
{
if (pFunc[i] && !(map[i / 32] & (1 << (i % 32))))
{
printf(" %08X %4u <by ordinal>\n", pFunc[i], exportDir->Base + i);
}
if (!pFunc[i]) continue;
printf(" %08X %5u ", pFunc[i], exportDir->Base + i);
if (funcs[i])
{
printf("%s", get_symbol_str((const char*)RVA(funcs[i], sizeof(DWORD))));
/* check for forwarded function */
if ((const char *)RVA(pFunc[i],1) >= (const char *)exportDir &&
(const char *)RVA(pFunc[i],1) < (const char *)exportDir + size)
printf(" (-> %s)", (const char *)RVA(pFunc[i],1));
printf("\n");
}
else printf("<by ordinal>\n");
}
free(map);
free(funcs);
printf("\n");
}