Ho un programma funzionante che carica i plugin con LoadLibrary
.Intervallo di indirizzi di una libreria caricata dinamicamente in Windows
Nuovo requisito: ad un certo punto nel codice, mi viene fornito un puntatore e ho bisogno di verificare se questo puntatore punta al codice o ai dati statici di un plugin.
Equivalentemente, ho bisogno di recuperare il plugin in cui punta un puntatore, se presente. Devo anche sapere se il puntatore punta al codice del programma principale o ai dati statici (e idealmente, distinguere tra aree di sola lettura e di lettura-scrittura).
HMODULE plugin_containing_pointer(void *p);
equivalente, ho bisogno di essere in grado di recuperare l'estensione (indirizzo e dimensione) a cui viene mappato un plugin. Ho anche bisogno di queste informazioni per il programma principale.
Come è possibile implementare is_pointer_into_plugin
o plugin_containing_pointer
o qualcosa di equivalente?
Posso cambiare la chiamata a LoadLibrary
se necessario. La ricerca dovrebbe essere ragionevolmente veloce possibile, il codice di caricamento non deve essere veloce. L'esecuzione dei plug-in in processi separati e la comunicazione attraverso la memoria condivisa non è un'opzione. Il programma deve essere eseguito su Windows XP e versioni successive (e Linux, ma è another question).
Le informazioni di cui ho bisogno sono più o meno quali sono i rapporti dell'utilità Sysinternals listdlls
, quindi ho cercato di scoprire come è implementato. Ho visto un suggestion di utilizzare NtQueryInformationProcess
per recuperare una struttura PEB
che collega a LDR_DATA_TABLE_ENTRY
. Sembra essere molto promettente, ma:
- posso vedere un
DllBase
che sembra che potrebbe essere l'indirizzo di partenza di ogni DLL (è?), Ma nessun formato. - La documentazione di
NtQueryInformationProcess
lo segnala come non importabile, ma non suggerisce un'alternativa per quello che sto cercando di fare. - Sul mio sistema, gli unici campi in
PEB
sonoBeingDebugged
eSessionId
, più alcuni array di byteReservedN
- non un buon segno.
Come è possibile enumerare l'intervallo di indirizzi dei plug-in o verificare se un puntatore si trova all'interno di un plug-in o determinare a quale plug-in punta un puntatore?