www.pudn.com > HookAPI > ApiInfo.cpp
// APIInfo.cpp: implementation of the CAPIInfo class. // ////////////////////////////////////////////////////////////////////// #include#include "APIInfo.h" #include "util.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// #ifdef WIN95 APIINFO g_apiinfo_buf[1000]; #endif CAPIInfo::CAPIInfo() { m_count =0; m_pInfo =NULL; } CAPIInfo::~CAPIInfo() { DeleteAll(); } APIINFO *CAPIInfo::Add(char *module_name, char *api_name, char *my_api_name, int param_count, APIFUNC old_api, APIFUNC my_api, char *my_friend_api_name, int start_pos) { #ifdef WIN95 APIINFO *pinfo =(APIINFO *)&g_apiinfo_buf[m_count]; #else APIINFO *pinfo =(APIINFO *)malloc(sizeof(APIINFO)); #endif strcpy(pinfo->module_name, module_name); strcpy(pinfo->api_name, api_name); strcpy(pinfo->my_api_name, my_api_name); pinfo->param_count =param_count; pinfo->old_api =old_api; pinfo->my_api =my_api; if(my_friend_api_name) strcpy(pinfo->my_friend_api_name, my_friend_api_name); else pinfo->my_friend_api_name[0] =0; pinfo->start_pos =start_pos; pinfo->f_hooked =false; #ifdef WIN95 pinfo->hMutex =CreateMutex(NULL, FALSE, api_name); #endif #ifdef WINNT InitializeCriticalSection(&pinfo->cs); #endif pinfo->pnext =NULL; APIINFO *pinfo2 =m_pInfo; while(pinfo2 !=NULL && pinfo2->pnext !=NULL) pinfo2 =pinfo2->pnext; if(pinfo2 ==NULL) m_pInfo =pinfo; // this is head of m_pInfo else pinfo2->pnext =pinfo; m_count++; return pinfo; } int CAPIInfo::DeleteAll() { APIINFO *pinfo =m_pInfo, *pinfo2; while(pinfo) { pinfo2 =pinfo; pinfo =pinfo->pnext; #ifdef WIN95 if (pinfo2->hMutex) CloseHandle(pinfo2->hMutex); #else DeleteCriticalSection(&pinfo2->cs); free(pinfo2); #endif } m_pInfo =NULL; m_count =0; return 0; } APIINFO *CAPIInfo::FindByMyAPI(APIFUNC my_api) { APIINFO *pinfo =m_pInfo; while(pinfo) { if(pinfo->my_api ==my_api) break; pinfo =pinfo->pnext; } return pinfo; } APIINFO *CAPIInfo::FindByOldAPI(APIFUNC old_api) { APIINFO *pinfo =m_pInfo; while(pinfo) { if((BYTE *)pinfo->old_api+pinfo->start_pos ==(BYTE *)old_api) break; pinfo =pinfo->pnext; } return pinfo; } APIINFO *CAPIInfo::FindByAPIName(char *api_name) { APIINFO *pinfo =m_pInfo; while(pinfo) { if(!strcmp(pinfo->api_name, api_name)) break; pinfo =pinfo->pnext; } return pinfo; } APIINFO *CAPIInfo::FindByMyAPIName(char *my_api_name) { APIINFO *pinfo =m_pInfo; while(pinfo) { if(!strcmp(pinfo->my_api_name, my_api_name)) break; pinfo =pinfo->pnext; } return pinfo; } int CAPIInfo::lock(APIINFO *pinfo) { #ifdef WIN95 if((pinfo->m_hMutex =OpenMutex(MUTEX_ALL_ACCESS, FALSE, pinfo->api_name)) !=NULL) WaitForSingleObject(pinfo->m_hMutex, INFINITE); #else EnterCriticalSection(&pinfo->cs); #endif return 0; } int CAPIInfo::unlock(APIINFO *pinfo) { #ifdef WIN95 if(pinfo->m_hMutex) { ReleaseMutex(pinfo->m_hMutex); CloseHandle(pinfo->m_hMutex); pinfo->m_hMutex =NULL; } #else LeaveCriticalSection(&pinfo->cs); #endif return 0; }