@@ -31,7 +31,14 @@ char *CSysModule::find_pattern(char *pos, int range, const char *pattern, size_t
3131module_handle_t CSysModule::load (void *addr)
3232{
3333 MEMORY_BASIC_INFORMATION mem;
34- VirtualQuery (addr, &mem, sizeof (mem));
34+ if (!VirtualQuery (addr, &mem, sizeof (mem)))
35+ return INVALID_HANDLE ;
36+
37+ if (mem.State != MEM_COMMIT )
38+ return INVALID_HANDLE ;
39+
40+ if (!mem.AllocationBase )
41+ return INVALID_HANDLE ;
3542
3643 IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *)mem.AllocationBase ;
3744 IMAGE_NT_HEADERS *pe = (IMAGE_NT_HEADERS *)((uintptr_t )dos + (uintptr_t )dos->e_lfanew );
@@ -47,6 +54,16 @@ module_handle_t CSysModule::load(void *addr)
4754 return m_handle;
4855}
4956
57+ module_handle_t CSysModule::find (void *addr)
58+ {
59+ module_handle_t hHandle = INVALID_HANDLE ;
60+ if (!GetModuleHandleEx (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS , reinterpret_cast <LPCTSTR >(addr), &hHandle)) {
61+ return INVALID_HANDLE ;
62+ }
63+
64+ return hHandle;
65+ }
66+
5067module_handle_t CSysModule::load (const char *filepath)
5168{
5269 if (!m_handle) {
@@ -121,6 +138,21 @@ module_handle_t CSysModule::load(void *addr)
121138 return m_handle;
122139}
123140
141+ module_handle_t CSysModule::find (void *addr)
142+ {
143+ Dl_info dlinfo;
144+ if ((!dladdr (addr, &dlinfo) && !dlinfo.dli_fbase ) || !dlinfo.dli_fname ) {
145+ return false ;
146+ }
147+
148+ module_handle_t hHandle = INVALID_HANDLE ;
149+ if (!(hHandle = dlopen (dlinfo.dli_fname , RTLD_NOW | RTLD_NOLOAD ))) {
150+ return INVALID_HANDLE ;
151+ }
152+
153+ return hHandle;
154+ }
155+
124156module_handle_t CSysModule::load (const char *filepath)
125157{
126158 if (!m_handle) {
0 commit comments