You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下用CreateFileMappingA映射文件修改字段后写入新文件值未生效问题

问题诊断与解决方法

你的问题核心是内存映射修改后,写入新文件时原数值未生效,主要可能是内存同步不及时、参数错误或API调用失败未被检测导致的,以下是针对性的解决步骤:

1. 强制同步内存映射的修改

虽然修改指针后内存数据应立即更新,但系统可能存在缓存延迟,建议在写入新文件前调用FlushViewOfFile确保内存中的修改完全生效:

FlushViewOfFile(ViewBase, sizeofdata);

2. 确保sizeofdata的正确性

如果sizeofdata小于修改字段所在的文件范围,会导致修改的内容未被完整写入新文件。务必用GetFileSize获取原文件的实际大小:

DWORD fileSize = GetFileSize(File, NULL);
if (fileSize == INVALID_FILE_SIZE) {
    // 处理文件大小获取失败的错误
}
// 后续写入新文件时使用fileSize替代sizeofdata

3. 检查所有Win32 API的调用结果

忽略API调用失败会导致后续操作在无效指针上执行,必须在每一步后检查返回值:

// 检查CreateFileA是否成功
if (File == INVALID_HANDLE_VALUE) {
    // 处理文件打开错误,可调用GetLastError()获取错误码
    return;
}
// 检查CreateFileMappingA是否成功
if (FileMap == NULL) {
    CloseHandle(File);
    // 处理映射创建错误
    return;
}
// 检查MapViewOfFile是否成功
if (ViewBase == NULL) {
    CloseHandle(FileMap);
    CloseHandle(File);
    // 处理视图映射错误
    return;
}

4. 完整修正后的代码示例

HANDLE File = CreateFileA(PathFile, GENERIC_READ | GENERIC_WRITE, 0,
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (File == INVALID_HANDLE_VALUE) {
    // 错误处理
    return;
}

DWORD fileSize = GetFileSize(File, NULL);
if (fileSize == INVALID_FILE_SIZE) {
    CloseHandle(File);
    // 错误处理
    return;
}

HANDLE FileMap = CreateFileMappingA(File, NULL, PAGE_READWRITE, 0, 0, NULL);
if (FileMap == NULL) {
    CloseHandle(File);
    // 错误处理
    return;
}

LPVOID ViewBase = MapViewOfFile(FileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (ViewBase == NULL) {
    CloseHandle(FileMap);
    CloseHandle(File);
    // 错误处理
    return;
}

_DUMP_HEADER64* LocalViewBase = (_DUMP_HEADER64*)ViewBase;
LocalViewBase->DumpType = 0; // 修改目标字段

// 强制同步内存修改
FlushViewOfFile(ViewBase, fileSize);

// 写入新文件
FILE* dumpfile = fopen("new_dump_file.dmp", "wb");
if (dumpfile != NULL) {
    size_t count = fwrite(ViewBase, 1, fileSize, dumpfile);
    fclose(dumpfile);
}

// 按顺序释放资源
UnmapViewOfFile(ViewBase);
CloseHandle(FileMap);
CloseHandle(File);

内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:16:20