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
相关产品推荐
相关产品推荐

