00001 /* 00002 * PeRdr - PE file disassembler 00003 * Copyright (C) 1999-2002 Frediano Ziglio 00004 * ----- 00005 * 00006 * This program is free software; you can redistribute it and/or modify 00007 * it under the terms of the GNU General Public License as published by 00008 * the Free Software Foundation; either version 2 of the License, or 00009 * (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software 00018 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00019 * ----- 00020 * 00021 * INFORMATION 00022 * www: https://freddy77.tripod.com/perdr/ 00023 * e-mail: freddy77@angelfire.com 00024 * */ 00025 #include "global.h" 00026 #ifdef HAVE_HDRSTOP 00027 #pragma hdrstop 00028 #endif 00029 00030 #include <algorithm> 00031 #include "apicache.h" 00032 #include "apiexp.h" 00033 00034 using namespace std; 00035 00036 bool ApiCache::GetFullApiName(std::string& out,const char* dllName,int ordinal) 00037 { 00038 // find dll 00039 // FIXME do a best search, dll should be ordered 00040 const DllFunctions *dll; 00041 for(dll = cachedDlls; ; ) 00042 { 00043 if (stricmp(dll->name,dllName)==0) 00044 break; 00045 ++dll; 00046 if (dll == (cachedDlls + numCachedDlls) ) 00047 return false; 00048 } 00049 00050 // find function 00051 const int *pend = dll->ords + dll->count; 00052 const int *p = lower_bound(dll->ords,pend,ordinal); 00053 if ( pend == p || *p != ordinal) 00054 return false; 00055 out = dll->names[p-dll->ords]; 00056 return true; 00057 } 00058