Domanda

Un modulo può essere scaricato, così come posso dire con certezza se si è ancora in memoria? Ho un manico ad esso, ottenuto da GetModuleHandle. Quando ho provato a chiamare GetHandleInformation su di esso vedo l'errore 0xc0000008 - "un handle non valido è stato specificato." Questo è accaduto prima che potesse essere stato scaricato.

È stato utile?

Soluzione

Il termine "gestire" è un po 'sovraccarica qui -. Un sacco di diverse classi di oggetti nel API Win32 sono chiamati "maniglie"

GetHandleInformation viene utilizzato per le maniglie per KERNEL oggetti -. File, chiavi di registro, mutex, etc

Il HMODULE restituito da GetModuleHandle viene utilizzato dal caricatore e non è un oggetto kernel reale, quindi GetHandleInformation fallisce. Nessuna delle bandiere si ottiene in GetHandleInformation senso per HMODULE però.

Se si desidera controllare se il HMODULE è ancora caricato in memoria, si può chiamare GetModuleHandle - questa API dovrebbe essere abbastanza veloce per chiamare molte volte. Tuttavia, il risultato di GetModuleHandle può non essere valido nel momento in cui ritorna - un altro thread avrebbe potuto chiamare FreeLibrary. E 'meglio per garantire che la DLL non rimanere caricato. È possibile farlo chiamando LoadLibrary soli, o chiamando GetModuleHandleEx che incrementare il conteggio dei riferimenti della DLL.

Altri suggerimenti

Due soluzioni:

1

Chiama GetModuleFileName () sul HMODULE. Se viene caricato il modulo si otterrà un nome di file valido. Se non viene caricato, non sarà possibile ottenere un nome di file valido. Assicurarsi di impostare sia il primo byte della matrice nome del file restituito al '\ 0' prima di chiamare GetModuleFileName () o per controllare il valore di ritorno. Se si imposta il primo byte prima che la chiamata si può ignorare in modo efficace il valore di ritorno e solo trattare la stringa di lunghezza zero come un segnale "non caricato".

TCHAR szModName[MAX_PATH + 1];

szModName[0] = _T('\0');
GetModuleFileName(hMod, szModName, MAX_PATH);

// zero length string if not loaded, valid DLL name if still loaded

2

Chiama VirtualQuery () passando il HMODULE come indirizzo per interrogare. Come esperimento fare questo su una libreria caricato e su una libreria che sapete essere liberato. Troverete hanno risultati molto differentl per la MEMORY_BASIC_INFORMATION restituito. Lascio a voi per elaborare un algoritmo adatto per determinare la differenza tra i due.

Caveat

Naturalmente, l'avvertenza che un altro thread può scaricare la libreria durante l'esecuzione eiher di questi test si applica. Nella mia esperienza, questo è altamente improbabile che ciò accada, ma che dipende molto da ciò che si sta facendo, perché si sta facendo, e quando si sta facendo percorso di esecuzione del programma. Usare con cura.

E 'molto semplice API.

PIMAGE_NT_HEADERS (NTAPI* _RtlImageNtHeader)

Esempio di programma:

(PVOID)typedef PIMAGE_NT_HEADERS (NTAPI *RTLIMAGENTHEADER)(PVOID);
RTLIMAGENTHEADER RtlImageNtHeader;
HMODULE hDll = GetModuleHandle("ntdll.dll");
HMODULE hDllTmp = LoadLibrary("ws2_32.dll");
RtlImageNtHeader = (RTLIMAGENTHEADER)GetProcAddress(hDll,"RtlImageNtHeader");

struct _IMAGE_NT_HEADERS *r,*r2;
r= RtlImageNtHeader(hDllTmp); 
FreeLibrary(hDllTmp);
r2= RtlImageNtHeader(hDllTmp);

//r = NULL
//r2 = return ws2_32 PE Header address
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top