mirror of
https://github.com/vxcontrol/MemoryModule.git
synced 2026-07-21 14:16:03 -04:00
+25
-15
@@ -584,9 +584,7 @@ error:
|
||||
FARPROC MemoryGetProcAddress(HMEMORYMODULE module, LPCSTR name)
|
||||
{
|
||||
unsigned char *codeBase = ((PMEMORYMODULE)module)->codeBase;
|
||||
int idx=-1;
|
||||
DWORD i, *nameRef;
|
||||
WORD *ordinal;
|
||||
int idx;
|
||||
PIMAGE_EXPORT_DIRECTORY exports;
|
||||
PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY((PMEMORYMODULE)module, IMAGE_DIRECTORY_ENTRY_EXPORT);
|
||||
if (directory->Size == 0) {
|
||||
@@ -602,20 +600,32 @@ FARPROC MemoryGetProcAddress(HMEMORYMODULE module, LPCSTR name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// search function name in list of exported names
|
||||
nameRef = (DWORD *) (codeBase + exports->AddressOfNames);
|
||||
ordinal = (WORD *) (codeBase + exports->AddressOfNameOrdinals);
|
||||
for (i=0; i<exports->NumberOfNames; i++, nameRef++, ordinal++) {
|
||||
if (_stricmp(name, (const char *) (codeBase + (*nameRef))) == 0) {
|
||||
idx = *ordinal;
|
||||
break;
|
||||
if (HIWORD(name) == 0) {
|
||||
// load function by ordinal value
|
||||
if (LOWORD(name) < exports->Base) {
|
||||
SetLastError(ERROR_PROC_NOT_FOUND);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (idx == -1) {
|
||||
// exported symbol not found
|
||||
SetLastError(ERROR_PROC_NOT_FOUND);
|
||||
return NULL;
|
||||
idx = LOWORD(name) - exports->Base;
|
||||
} else {
|
||||
// search function name in list of exported names
|
||||
DWORD i;
|
||||
DWORD *nameRef = (DWORD *) (codeBase + exports->AddressOfNames);
|
||||
WORD *ordinal = (WORD *) (codeBase + exports->AddressOfNameOrdinals);
|
||||
idx = -1;
|
||||
for (i=0; i<exports->NumberOfNames; i++, nameRef++, ordinal++) {
|
||||
if (_stricmp(name, (const char *) (codeBase + (*nameRef))) == 0) {
|
||||
idx = *ordinal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (idx == -1) {
|
||||
// exported symbol not found
|
||||
SetLastError(ERROR_PROC_NOT_FOUND);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if ((DWORD)idx > exports->NumberOfFunctions) {
|
||||
|
||||
+2
-1
@@ -63,7 +63,8 @@ HMEMORYMODULE MemoryLoadLibraryEx(const void *,
|
||||
void *);
|
||||
|
||||
/**
|
||||
* Get address of exported method.
|
||||
* Get address of exported method. Supports loading both by name and by
|
||||
* ordinal value.
|
||||
*/
|
||||
FARPROC MemoryGetProcAddress(HMEMORYMODULE, LPCSTR);
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ BOOL LoadFromMemory(char *filename)
|
||||
size_t size;
|
||||
HMEMORYMODULE handle;
|
||||
addNumberProc addNumber;
|
||||
addNumberProc addNumber2;
|
||||
HMEMORYRSRC resourceInfo;
|
||||
DWORD resourceSize;
|
||||
LPVOID resourceData;
|
||||
@@ -45,9 +46,31 @@ BOOL LoadFromMemory(char *filename)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
addNumber = (addNumberProc)MemoryGetProcAddress(handle, NULL);
|
||||
if (addNumber != NULL) {
|
||||
_tprintf(_T("MemoryGetProcAddress(NULL) returned %p\n"), addNumber);
|
||||
result = FALSE;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
addNumber = (addNumberProc)MemoryGetProcAddress(handle, reinterpret_cast<LPCTSTR>(0xff));
|
||||
if (addNumber != NULL) {
|
||||
_tprintf(_T("MemoryGetProcAddress(0xff) returned %p\n"), addNumber);
|
||||
result = FALSE;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
addNumber = (addNumberProc)MemoryGetProcAddress(handle, "addNumbers");
|
||||
_tprintf(_T("From memory: %d\n"), addNumber(1, 2));
|
||||
|
||||
// the DLL only exports one function, try to load by ordinal value
|
||||
addNumber2 = (addNumberProc)MemoryGetProcAddress(handle, reinterpret_cast<LPCTSTR>(0x01));
|
||||
if (addNumber != addNumber2) {
|
||||
_tprintf(_T("MemoryGetProcAddress(0x01) returned %p (expected %p)\n"), addNumber2, addNumber);
|
||||
result = FALSE;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
resourceInfo = MemoryFindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
|
||||
_tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user