|
11 | 11 |
|
12 | 12 | #include "../MemoryModule.h" |
13 | 13 |
|
| 14 | +typedef int (*addProc)(int); |
14 | 15 | typedef int (*addNumberProc)(int, int); |
15 | 16 |
|
16 | 17 | // Thanks to Tim Cooper (from http://stackoverflow.com/a/8584708) |
@@ -127,6 +128,11 @@ BOOL LoadFromMemory(char *filename) |
127 | 128 | } |
128 | 129 |
|
129 | 130 | addNumber = (addNumberProc)MemoryGetProcAddress(handle, "addNumbers"); |
| 131 | + if (!addNumber) { |
| 132 | + _tprintf(_T("MemoryGetProcAddress(\"addNumber\") returned NULL\n")); |
| 133 | + result = FALSE; |
| 134 | + goto exit; |
| 135 | + } |
130 | 136 | _tprintf(_T("From memory: %d\n"), addNumber(1, 2)); |
131 | 137 |
|
132 | 138 | // the DLL only exports one function, try to load by ordinal value |
@@ -218,15 +224,80 @@ BOOL LoadFromMemory(char *filename) |
218 | 224 | return result; |
219 | 225 | } |
220 | 226 |
|
| 227 | +BOOL LoadExportsFromMemory(char *filename) |
| 228 | +{ |
| 229 | + FILE *fp; |
| 230 | + unsigned char *data=NULL; |
| 231 | + long size; |
| 232 | + size_t read; |
| 233 | + HMEMORYMODULE handle = NULL; |
| 234 | + int i; |
| 235 | + BOOL result = TRUE; |
| 236 | + |
| 237 | + fp = fopen(filename, "rb"); |
| 238 | + if (fp == NULL) |
| 239 | + { |
| 240 | + printf("Can't open DLL file \"%s\".", filename); |
| 241 | + result = FALSE; |
| 242 | + goto exit; |
| 243 | + } |
| 244 | + |
| 245 | + fseek(fp, 0, SEEK_END); |
| 246 | + size = ftell(fp); |
| 247 | + assert(size > 0); |
| 248 | + data = (unsigned char *)malloc(size); |
| 249 | + assert(data != NULL); |
| 250 | + fseek(fp, 0, SEEK_SET); |
| 251 | + read = fread(data, 1, size, fp); |
| 252 | + assert(read == static_cast<size_t>(size)); |
| 253 | + fclose(fp); |
| 254 | + |
| 255 | + handle = MemoryLoadLibrary(data, size); |
| 256 | + if (handle == NULL) |
| 257 | + { |
| 258 | + _tprintf(_T("Can't load library from memory.\n")); |
| 259 | + result = FALSE; |
| 260 | + goto exit; |
| 261 | + } |
| 262 | + |
| 263 | + for (i = 1; i <= 100; i++) { |
| 264 | + char name[100]; |
| 265 | + sprintf(name, "add%d", i); |
| 266 | + addProc addNumber = (addProc)MemoryGetProcAddress(handle, name); |
| 267 | + if (!addNumber) { |
| 268 | + _tprintf(_T("MemoryGetProcAddress(\"%s\") returned NULL\n"), name); |
| 269 | + result = FALSE; |
| 270 | + goto exit; |
| 271 | + } |
| 272 | + int result = addNumber(1); |
| 273 | + if (result != 1 + i) { |
| 274 | + _tprintf(_T("(\"%s\") returned %d, expected %d\n"), name, result, 1 + i); |
| 275 | + result = FALSE; |
| 276 | + goto exit; |
| 277 | + } |
| 278 | + _tprintf(_T("%s: %d\n"), name, result); |
| 279 | + } |
| 280 | +exit: |
| 281 | + MemoryFreeLibrary(handle); |
| 282 | + free(data); |
| 283 | + return result; |
| 284 | +} |
| 285 | + |
221 | 286 | int main(int argc, char* argv[]) |
222 | 287 | { |
223 | 288 | if (argc < 2) { |
224 | 289 | fprintf(stderr, "USAGE: %s <filename.dll>\n", argv[0]); |
225 | 290 | return 1; |
226 | 291 | } |
227 | 292 |
|
228 | | - if (!LoadFromMemory(argv[1])) { |
229 | | - return 2; |
| 293 | + if (!strstr((const char *) argv[1], "exports")) { |
| 294 | + if (!LoadFromMemory(argv[1])) { |
| 295 | + return 2; |
| 296 | + } |
| 297 | + } else { |
| 298 | + if (!LoadExportsFromMemory(argv[1])) { |
| 299 | + return 2; |
| 300 | + } |
230 | 301 | } |
231 | 302 |
|
232 | 303 | return 0; |
|
0 commit comments