DllLoader.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #define WIN32_LEAN_AND_MEAN
  2. #ifndef _CRT_SECURE_NO_WARNINGS
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #endif
  5. #include <assert.h>
  6. #include <windows.h>
  7. #include <tchar.h>
  8. #include <stdio.h>
  9. #include <malloc.h>
  10. #include "../../MemoryModule.h"
  11. typedef int (*addNumberProc)(int, int);
  12. #define DLL_FILE TEXT("..\\SampleDLL\\SampleDLL.dll")
  13. void LoadFromFile(void)
  14. {
  15. addNumberProc addNumber;
  16. HRSRC resourceInfo;
  17. DWORD resourceSize;
  18. LPVOID resourceData;
  19. TCHAR buffer[100];
  20. HINSTANCE handle = LoadLibrary(DLL_FILE);
  21. if (handle == NULL)
  22. return;
  23. addNumber = (addNumberProc)GetProcAddress(handle, "addNumbers");
  24. _tprintf(_T("From file: %d\n"), addNumber(1, 2));
  25. resourceInfo = FindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
  26. _tprintf(_T("FindResource returned 0x%p\n"), resourceInfo);
  27. resourceSize = SizeofResource(handle, resourceInfo);
  28. resourceData = LoadResource(handle, resourceInfo);
  29. _tprintf(_T("Resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
  30. LoadString(handle, 1, buffer, sizeof(buffer));
  31. _tprintf(_T("String1: %s\n"), buffer);
  32. LoadString(handle, 20, buffer, sizeof(buffer));
  33. _tprintf(_T("String2: %s\n"), buffer);
  34. FreeLibrary(handle);
  35. }
  36. void LoadFromMemory(void)
  37. {
  38. FILE *fp;
  39. unsigned char *data=NULL;
  40. long size;
  41. size_t read;
  42. HMEMORYMODULE handle;
  43. addNumberProc addNumber;
  44. HMEMORYRSRC resourceInfo;
  45. DWORD resourceSize;
  46. LPVOID resourceData;
  47. TCHAR buffer[100];
  48. fp = _tfopen(DLL_FILE, _T("rb"));
  49. if (fp == NULL)
  50. {
  51. _tprintf(_T("Can't open DLL file \"%s\"."), DLL_FILE);
  52. goto exit;
  53. }
  54. fseek(fp, 0, SEEK_END);
  55. size = ftell(fp);
  56. assert(size >= 0);
  57. data = (unsigned char *)malloc(size);
  58. assert(data != NULL);
  59. fseek(fp, 0, SEEK_SET);
  60. read = fread(data, 1, size, fp);
  61. assert(read == static_cast<size_t>(size));
  62. fclose(fp);
  63. handle = MemoryLoadLibrary(data, size);
  64. if (handle == NULL)
  65. {
  66. _tprintf(_T("Can't load library from memory.\n"));
  67. goto exit;
  68. }
  69. addNumber = (addNumberProc)MemoryGetProcAddress(handle, "addNumbers");
  70. _tprintf(_T("From memory: %d\n"), addNumber(1, 2));
  71. resourceInfo = MemoryFindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
  72. _tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
  73. resourceSize = MemorySizeofResource(handle, resourceInfo);
  74. resourceData = MemoryLoadResource(handle, resourceInfo);
  75. _tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
  76. MemoryLoadString(handle, 1, buffer, sizeof(buffer));
  77. _tprintf(_T("String1: %s\n"), buffer);
  78. MemoryLoadString(handle, 20, buffer, sizeof(buffer));
  79. _tprintf(_T("String2: %s\n"), buffer);
  80. MemoryFreeLibrary(handle);
  81. exit:
  82. free(data);
  83. }
  84. int main()
  85. {
  86. LoadFromFile();
  87. printf("\n\n");
  88. LoadFromMemory();
  89. return 0;
  90. }