Есть такая тулза 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);
	}
}