- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 CreateFileMapping 和 MapViewOfFile 函数将文件映射到内存中。在某一点之后,我调用 VirtualProtect 将其保护从只读更改为读写。此调用失败,GetLastError 给出 ERROR_INVALID_PARAMETER。
这是我的代码的简化版本,它演示了这个问题。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main() {
HANDLE fd, md;
char *addr;
DWORD old;
BOOL ok;
fd = CreateFile("filename", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
md = CreateFileMapping(fd, NULL, PAGE_READWRITE, 0, 100, NULL);
addr = MapViewOfFile(md, FILE_MAP_READ, 0, 0, 100);
ok = VirtualProtect(addr, 100, PAGE_READWRITE, &old);
if (!ok) {
// we fall into this if block
DWORD err = GetLastError();
// this outputs "error protecting: 87"
printf("error protecting: %u\n", err);
return 1;
}
UnmapViewOfFile(addr);
CloseHandle(md);
CloseHandle(fd);
return 0;
}
我在这里做错了什么?我是否不允许在包含映射文件的区域上调用 VirtualProtect?
最佳答案
首先使用 FILE_MAP_READ 创建 View | FILE_MAP_WRITE 并使用 PAGE_READONLY 进行保护。现在您可以轻松地稍后将其设为 PAGE_READWRITE:
addr = MapViewOfFile(md, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 100);
ok = VirtualProtect(addr, 100, PAGE_READONLY, &old);
//...
ok = VirtualProtect(addr, 100, PAGE_READWRITE, &old);
关于在映射文件上调用 VirtualProtect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346913/
我正在使用 CreateFileMapping 和 MapViewOfFile 函数将文件映射到内存中。在某一点之后,我调用 VirtualProtect 将其保护从只读更改为读写。此调用失败,Get
VirtualProtect 的第三个参数可以使用如下标志: PAGE_EXECUTE PAGE_NOACCESS PAGE_READWRITE PAGE_READONLY ... 一开始我觉得Vir
我需要使用 VirtualProtect,我的问题是关于传递给函数的区域地址。它说(在 MSDN 上)“描述起始页的地址”,它必须是页面开头的地址还是可以是该页面中的任何地址?也就是说,是不是应该先用
我有一个 DWORD 值,我想监视更改,所以我决定使用保护页。 问题是 STATUS_GUARD_PAGE_VIOLATION 异常是在使用 VirtualProtect 将内存标记为 PAGE_GU
美好的一天,我正在尝试以某种方式防止“dll 注入(inject)”到我的程序中。这是我到目前为止所拥有的,但由于某种原因它使我的 .exe 崩溃了。我正在加载这段代码,我的程序附加了一个 .dll。
我在使用 Windows 的 Virtualprotect() api 时遇到问题。我从学校得到了一个作业,我的老师告诉我们,在过去内存力稀缺且成本高昂的时候。程序员必须创建可以动态修改自身以节省内存
我正在 D2010 中进行简单的本地化工作。我正在处理表单上的所有字符串,因为 ETM 似乎超出了我的需求,其他第 3 方工具也是如此......(尽管我目前不太确定!) 下面用于更改 Const.p
这是一些标准的代码片段,我们在其中安装了钩子(Hook),在我们感兴趣的函数的开头重写了一些字节。我的问题是:为什么我们需要重新保护一 block 重写的内存?我们不能只保留 PAGE_EXECUTE
我正在分析进程加载的各种模块。不幸的是,我无法创建 kernel32.dll 内存快照,尽管该函数可以与其他模块(例如 ntddl.dll)一起正常工作。问题在于以下代码: /* Copy code
这按预期工作。引发了 STATUS_GUARD_PAGE_VIOLATION。 int main() { DWORD oldp; DWORD *pdp = new DWORD;
我正在尝试使用 PAGE_GUARD Hook 函数,但在调用页面/地址时它不会引发任何异常。 void HookMe(){ printf("Not hooked\n"); } void Go
我使用 VirtualAlloc(Ex) 来分配和提交大范围的页面。 稍后在执行过程中,我希望“ fork ”该内存,启动一个可以在当前状态下读取它的新进程,而父进程将其视为写时复制内存。 这可以用
我知道 VirtualProtect 函数会毫无疑问地更改内存中页面的权限。当任何正在运行的进程能够使用它时,这肯定不会立即产生效果吗? 例如,有人可以轻松编写一段使用 VirtualProtectE
我有 Delphi 6 DLL,它在内部使用第三方库来进行自动资源字符串翻译。 在库源代码中,2 个 RTL 函数(ShortCutToText 和 LoadResString)被替换为对应的多语言函
我正在尝试转换来自 CHook 的代码论坛发布了这段代码,它执行 EAT Hook : #include #include #include #if PSAPI_VERSION == 1 #pr
我是一名优秀的程序员,十分优秀!