| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | #define WIN32_LEAN_AND_MEAN#ifndef _CRT_SECURE_NO_WARNINGS#define _CRT_SECURE_NO_WARNINGS#endif#include <assert.h>#include <windows.h>#include <tchar.h>#include <stdio.h>#include <malloc.h>#include "../../MemoryModule.h"typedef int (*addNumberProc)(int, int);#define DLL_FILE TEXT("..\\SampleDLL\\SampleDLL.dll")void LoadFromFile(void){    addNumberProc addNumber;    HRSRC resourceInfo;    DWORD resourceSize;    LPVOID resourceData;    TCHAR buffer[100];    HINSTANCE handle = LoadLibrary(DLL_FILE);    if (handle == NULL)        return;    addNumber = (addNumberProc)GetProcAddress(handle, "addNumbers");    _tprintf(_T("From file: %d\n"), addNumber(1, 2));    resourceInfo = FindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);    _tprintf(_T("FindResource returned 0x%p\n"), resourceInfo);    resourceSize = SizeofResource(handle, resourceInfo);    resourceData = LoadResource(handle, resourceInfo);    _tprintf(_T("Resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);    LoadString(handle, 1, buffer, sizeof(buffer));    _tprintf(_T("String1: %s\n"), buffer);    LoadString(handle, 20, buffer, sizeof(buffer));    _tprintf(_T("String2: %s\n"), buffer);    FreeLibrary(handle);}void LoadFromMemory(void){    FILE *fp;    unsigned char *data=NULL;    long size;    size_t read;    HMEMORYMODULE handle;    addNumberProc addNumber;    HMEMORYRSRC resourceInfo;    DWORD resourceSize;    LPVOID resourceData;    TCHAR buffer[100];    fp = _tfopen(DLL_FILE, _T("rb"));    if (fp == NULL)    {        _tprintf(_T("Can't open DLL file \"%s\"."), DLL_FILE);        goto exit;    }    fseek(fp, 0, SEEK_END);    size = ftell(fp);    assert(size >= 0);    data = (unsigned char *)malloc(size);    assert(data != NULL);    fseek(fp, 0, SEEK_SET);    read = fread(data, 1, size, fp);    assert(read == static_cast<size_t>(size));    fclose(fp);    handle = MemoryLoadLibrary(data, size);    if (handle == NULL)    {        _tprintf(_T("Can't load library from memory.\n"));        goto exit;    }    addNumber = (addNumberProc)MemoryGetProcAddress(handle, "addNumbers");    _tprintf(_T("From memory: %d\n"), addNumber(1, 2));    resourceInfo = MemoryFindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);    _tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);    resourceSize = MemorySizeofResource(handle, resourceInfo);    resourceData = MemoryLoadResource(handle, resourceInfo);    _tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);    MemoryLoadString(handle, 1, buffer, sizeof(buffer));    _tprintf(_T("String1: %s\n"), buffer);    MemoryLoadString(handle, 20, buffer, sizeof(buffer));    _tprintf(_T("String2: %s\n"), buffer);    MemoryFreeLibrary(handle);exit:    free(data);}int main(){    LoadFromFile();    printf("\n\n");    LoadFromMemory();    return 0;}
 |