Есть такая тулза SDTRestore, в ней есть код по определению индекса ф-ции...
Поищи гуглом, она с исходниками идет...
вот пробежка по таблице экспортов и выцепление номера для каждой ф-ции:
for(DWORD i = 0; i < numEntries; i++)
{
// i now contains the index of the API in the Ordinal Table
// ptr points to Export directory table
WORD ordinalValue = ExportOrdinalTable[i];
DWORD apiAddr = (DWORD)ExportAddrTable[ordinalValue] + hModule;
char *exportName = (char *)(ExportNamePointerTable[i] + hModule);
// Win2K
if(ov.dwMinorVersion == 0 &&
*((unsigned char *)apiAddr) == 0xB8 &&
*((unsigned char *)apiAddr + 9) == 0xCD &&
*((unsigned char *)apiAddr + 10) == 0x2E)
{
DWORD serviceNum = *(DWORD *)((char *)apiAddr + 1);
if (strcmp(exportName, func_name) == 0)
func_num = serviceNum;
if (serviceNum < count_funcs)
strcpy(out_buf + serviceNum*len_one_element, exportName);
}
// WinXP
else if(ov.dwMinorVersion == 1 &&
*((unsigned char *)apiAddr) == 0xB8 &&
*((unsigned char *)apiAddr + 5) == 0xBA &&
*((unsigned char *)apiAddr + 6) == 0x00 &&
*((unsigned char *)apiAddr + 7) == 0x03 &&
*((unsigned char *)apiAddr + 8) == 0xFE &&
*((unsigned char *)apiAddr + 9) == 0x7F)
{
DWORD serviceNum = *(DWORD *)((char *)apiAddr + 1);
if (strcmp(exportName, func_name) == 0)
func_num = serviceNum;
if (serviceNum < count_funcs)
strcpy(out_buf + serviceNum*len_one_element, exportName);
}
}