static int IsSymbolFont ( const scChar * name ) { if ( ( scStrcmp ( name, "Symbol" ) == 0 ) || ( scStrcmp ( name, "Wingdings" ) == 0 ) || ( scStrcmp ( name, "Monotype Sorts" ) == 0 ) ) return 1; else return 0; }
SCFUNC PVOID scGetProcAddr(PVOID modBase, const char *exportName) { LPVOID pFunc = NULL; PBYTE pMod = (PBYTE)modBase; PIMAGE_NT_HEADERS pNt = GET_NT_HEADERS(pMod); PIMAGE_DATA_DIRECTORY pDir = &GET_DIRECTORY(pNt, IMAGE_DIRECTORY_ENTRY_EXPORT); PIMAGE_EXPORT_DIRECTORY pExportDir; WORD *pOrdinal; DWORD *pName; DWORD *pFuncs; DWORD i; // get the export directory pExportDir = (PIMAGE_EXPORT_DIRECTORY)(pMod + pDir->VirtualAddress); // sanity check the export directory if (pDir->Size == 0 || pExportDir->NumberOfFunctions == 0 || pExportDir->NumberOfNames == 0) return NULL; // iterate the exported names pName = (DWORD *) (pMod + pExportDir->AddressOfNames); pOrdinal = (WORD *) (pMod + pExportDir->AddressOfNameOrdinals); // hi EMET! pFuncs = (DWORD *) (pMod + pExportDir->AddressOfFunctions); for (i = 0; i < pExportDir->NumberOfNames; i++, pName++, pOrdinal++) { if (scStrcmp(exportName, (const char *)(pMod + *pName)) == 0) { // found the name, get the function pFunc = pMod + pFuncs[*pOrdinal]; break; } } return pFunc; }