Comment obtenir le module HANDLE de func ptr dans Win32?

Je travaille sur les liaisons d’appel natives pour une machine virtuelle, et l’une des fonctionnalités est de pouvoir rechercher les fonctions standard de la libc par leur nom au moment de l’exécution. Sous Windows, cela devient un peu compliqué, car je dois obtenir un descripteur du module msvcrt actuellement chargé dans le processus. Normalement, il s’agit de msvcrt.dll, mais il peut également s’agir d’autres variantes (msvcr100.dll, etc.) et un appel à GetModuleHandle (“msvcrt”) peut échouer si une variante portant un nom différent est utilisée.

Ce que j’aimerais pouvoir faire, c’est une recherche inversée, prendre un pointeur de fonction dans libc (que j’ai en abondance) et obtenir un descripteur du module qui le fournit. En gros, quelque chose comme ça:

HANDLE hlibc = ReverseGetModuleHandle(fprintf); // Any func from libc should do the sortingck void *vfunc = GetProcAddress(hlibc); 

Existe-t-il une telle chose dans l’API win32 sans descendre dans un parcours manuel des descripteurs de processus et des tables de symboles? Inversement, si je réfléchis trop au problème, existe-t-il un moyen plus simple de rechercher une fonction libc par son nom sur win32?

 MEMORY_BASIC_INFORMATION mbi; HMODULE mod; if (VirtualQuery( vfunc, &mbi, sizeof(mbi) )) { mod = (HMODULE)mbi.AllocationBase; } 

La méthode documentée pour obtenir le descripteur de module consiste à utiliser GetModuleHandleEx .

 HMODULE hModule = NULL; if(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, // behave like GetModuleHandle (LPCTSTR)address), &hModule)) { // hModule should now refer to the module containing the target address. } 

Malheureusement, vous devrez parcourir les modules comme vous le craigniez. Ce n’est pas si mal cependant. Voici l’idée, du code écrit dans le bloc-notes:

 MODULEENTRY32 me = {0}; HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, 0 ); me.dwSize = sizeof me; Module32First( hSnapshot, &me ); if( me.modBaseAddr <= funcPtr && ( me.modBaseAddr + me.modBaseSize ) > funcPtr ) { ... break; } do { } while( Module32Next( hSnapshot, &me ) ); CloseHandle( hSnapshot );