提交 887cfaec 创建 作者: 赵鹏翀's avatar 赵鹏翀

init template

上级
/Debug
/Release
<?xml version="1.0" encoding="gb2312"?>
<ASMProject Version="1.00" Name="Lab016" TemplatePath="console(c)\Project" ProjectID="ca12aafa-5220-45b7-a28f-d2bd47c7cb60" IsSubmitWork="0">
<Configurations>
<Configuration Name="Debug" DebuggerFlavor="0">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_DEBUG" GenerateDebugInformation="-1" LanguageStandard="c99"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
<Configuration Name="Release" DebuggerFlavor="0">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="NDEBUG" LanguageStandard="c99"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool" StripDebugInfo="-1"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="ͷļ" Filter="h;hpp;hxx">
<File RelativePath=".\console.h">
</File>
</Filter>
<Filter Name="Դļ" Filter="cpp;c;cc;cxx">
<File RelativePath=".\console.c">
</File>
</Filter>
</Files>
</ASMProject>
添加文件
#include "console.h"
#include <Windows.h>
char DllName[20] = "library.dll"; // 将读入的文件名保存为全局变量
char intput[10];
typedef int (*pFun)(int a, int b); // 函数指针类型
int main(int argc, char* argv[])
{
FILE *fp; // 文件指针
int result; // 保存文件读入结果
// 设定开辟内存的起始地址
// 取得开辟的内存空间起始地址
int *pImageBase = VirtualAlloc(NULL, DLL_SIZE, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// 调用VirtualAlloc开辟内存空间,执行成功后返回开辟的初始地址
// 判断是否开辟成功
// 将返回地址打印
printf("将动态链接库文件的加载基址设置为以下地址:0x%x\n", pImageBase);
// 通过调用scanf让程序在此处暂停,在此时可通过获得的起始地址修改DLL的加载地址,然后重新生成后复制到此项目下供读入内存
printf("输入任一字符,按下回车后将%s读入内存...\n", DllName);
scanf("%s", intput);
// 尝试打开文件
// 将动态链接库文件读入到开辟的内存空间中
// 判断是否读入成功,若成功,则返回值与文件大小相同,否则读入文件失败
// 通过解实验7 任务(一)的程序解析动态链接库文件,取得导出函数的偏移地址。则在内存中导出函数的地址是:开辟内存空间的起始地址 + 偏移地址
// 将函数指针设置为导出函数的地址
// 通过地址调用导出函数SampleFunSum
// 关闭文件
// 调用VirtualFree释放开辟的内存空间。若成功释放,则返回非0值。失败则返回0
// 判断是否释放成功
int c = VirtualFree(pImageBase, 0, MEM_RELEASE);
if(!c)
{
printf("释放所开辟的内存空间失败!\n");
exit(1);
}
return 0;
}
#ifndef _CONSOLE_H_
#define _CONSOLE_H_
#include <stdio.h>
/* TODO: 在此处引用程序需要的其他头文件 */
#define DLL_SIZE 0x4000 // 设定开辟内存空间64K
// VirtualAlloc flAllocationType
#define MEM_COMMIT 0x1000 // 分配指定保留的内存页的物理存储在内存或磁盘上的分页文件
#define MEM_RESERVE 0x2000 // 保留在没有任何实际的物理存储在内存或磁盘上的分页文件
#define MEM_RESET 0x3000 // 页面不应该被读出或写入到分页文件
#define MEM_LARGE_PAGES 0x20000000 // 分配内存使用大页面支持
#define MEM_PHYSICAL 0x400000 // 储备的地址范围,可用于内存地址窗口扩展的页面
#define MEM_TOP_DOWN 0x100000 // 在尽可能高的地址分配内存
// VirtualFree FreeType
#define MEM_RELEASE 0x8000 // 释放分配的内存空间
// VirtualAlloc flProtect
#define PAGE_EXECUTE 0x10 // 区域包含可执行的代码
#define PAGE_EXECUTE_READ 0x20 // 区域包含可执行的代码,应用程序只能读该区域
#define PAGE_EXECUTE_READWRITE 0x40 // 区域包含可执行的代码,应用程序可读写该区域
#define PAGE_EXECUTE_WRITECOPY 0x80 // 区域包含可执行的代码,应用程序可读写镜像文件的代码页
#define PAGE_NOACCESS 0x01 // 任何访问该区域的操作都将被拒绝
#define PAGE_READONLY 0x02 // 区域不含可执行代码,该区域为只读
#define PAGE_READWRITE 0x04 // 区域不含可执行代码,应用程序可读写该区域
#define PAGE_NOCACHE 0x200 // RAM中的页映射到该区域时将不会被微处理器缓存
#endif /* _CONSOLE_H_ */
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论