FARPROC aapi::GetProcAddress( HMODULE hModule, LPCSTR lpProcName ) { DWORD EATA,OP; IMAGE_DOS_HEADER *DOSH = ( IMAGE_DOS_HEADER* )hModule; IMAGE_NT_HEADERS *NTH = NULL; if( DOSH->e_magic != IMAGE_DOS_SIGNATURE ) return NULL; NTH = ( ( PIMAGE_NT_HEADERS )( ( DWORD )( DOSH ) + ( DWORD )( DOSH->e_lfanew ) ) ); if( NTH->Signature != IMAGE_NT_SIGNATURE ) return NULL; EATA = NTH->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT ].VirtualAddress; IMAGE_EXPORT_DIRECTORY *EATP = ( IMAGE_EXPORT_DIRECTORY* )( ( DWORD )EATA + ( DWORD )hModule ); for ( DWORD i = 0;i < EATP->NumberOfFunctions;i++ ) { DWORD * ENTP = (DWORD*)( ( DWORD )hModule + ((DWORD)EATP->AddressOfNames + (sizeof(DWORD)*i))); if( strcmp( ( char* )( ( DWORD )hModule + *ENTP ), lpProcName )== 0 ) { WORD * AONP = ( WORD* )( ( DWORD )hModule + ( ( DWORD )EATP->AddressOfNameOrdinals + ( i * sizeof( WORD ) ) ) ); DWORD * AOF = ( DWORD* )( ( DWORD )hModule + ( ( DWORD )EATP->AddressOfFunctions + ( sizeof( DWORD )**AONP ) ) ); return ( FARPROC )( *AOF + DWORD( hModule ) ); } } }