Pregunta

Un módulo puede ser descargado, así que ¿cómo puede decir que a ciencia cierta si todavía está en la memoria? Tengo un identificador para ella, obtenida de GetModuleHandle. Cuando traté de llamar GetHandleInformation en él veo el error 0xc0000008 - "un identificador no válido se ha especificado." Esto ocurrió antes de que pudiera haber sido descargada.

¿Fue útil?

Solución

El término "manejar" es un poco sobrecargado aquí -. Un montón de diferentes clases de objetos de la API de Win32 que se llama "manijas"

GetHandleInformation se utiliza para mangos a los objetos del kernel -. Archivos, claves de registro, exclusiones mutuas, etc.

El HMODULE devuelto por GetModuleHandle es utilizada por el cargador y no es un objeto de núcleo real, por lo tanto, no GetHandleInformation. Ninguna de las banderas que recibe en GetHandleInformation tiene sentido para HMODULE sin embargo.

Si desea comprobar si el HMODULE todavía está cargado en la memoria, sólo puede llamar a GetModuleHandle - esta API debe ser lo suficientemente rápida para llamar muchas veces. Sin embargo, el resultado de GetModuleHandle puede ser nulo el momento en que regresa - otro hilo podría haber llamado a FreeLibrary. Es mejor asegurarse de que la DLL se queda cargado. Puede hacerlo llamando a LoadLibrary usted mismo, o llamando GetModuleHandleEx que se incremente el número de referencia de la DLL.

Otros consejos

dos soluciones:

1

Llamada GetModuleFileName () en el HMODULE. Si se carga el módulo obtendrá un nombre de archivo válido. Si no se carga, no obtendrá un nombre de archivo válido. Asegúrese de alguno de los conjuntos del primer byte de la matriz de nombre de archivo devuelto a '\ 0' antes de llamar GetModuleFileName () o para comprobar el valor de retorno. Si se establece el primer byte antes de la llamada puede ignorar efectivamente el valor de retorno y simplemente tratar a la cadena de longitud cero como una señal de "no cargado".

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

Llamada VirtualQuery () pasando el HMODULE como la dirección para consultar. Como un experimento hacer esto en una biblioteca y cargado en una biblioteca que saber para ser liberado. Usted encontrará que tienen resultados muy differentl para el MEMORY_BASIC_INFORMATION devuelto. Lo dejo a usted para elaborar un algoritmo adecuado para determinar la diferencia entre los dos.

Advertencia

Por supuesto, la advertencia de que otro hilo puede descargar la biblioteca mientras está ejecutando eiher de estas pruebas se aplica. En mi experiencia, esto es muy poco probable que suceda, pero eso depende mucho de lo que está haciendo, por qué lo está haciendo, y cuando lo está haciendo ruta de ejecución del programa. Usar con cuidado.

Es muy simple API.

PIMAGE_NT_HEADERS (NTAPI* _RtlImageNtHeader)

Programa de ejemplo:

(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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top