首页
社区
课程
招聘
未解决 [求助]MapViewOfFile遇到的问题
2020-12-21 12:46 2210

未解决 [求助]MapViewOfFile遇到的问题

2020-12-21 12:46
2210

#define PartSize 2*1024*1024             // 分块的大小2MB

hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,PartSize,NULL);

lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, i*PartSize, PartSize);      // 增加的代码
if ( lpMapStartPos == NULL )
{
    printf("\n映射原文件到内存映射失败:%d。",GetLastError());
    return -1;
}

i=0的时候,MapViewOfFile可以映射成功。
i=1的时候,MapViewOfFile可以映射失败,GetLastError()的返回值是5。


=====================


有问题的代码贴在这里。


#include <stdio.h>
#include <windows.h>

#define PartSize 2*1024*1024             // 分块的大小2MB
     
int main(int argc,char * argv[])  
{  
    HANDLE dstFile;    
    HANDLE hFileMap,hDstFileMap;    
    DWORD  dwFileSize;
    LPVOID lpMapStartPos,lpNewFilePos;     
    int  FileLen;
    char ext[256],destfilename[256];
    int i = 0;
    char *lpFileName = "01.flac";
    HANDLE hFile = CreateFile(lpFileName,
                              GENERIC_READ,
                              FILE_SHARE_READ | FILE_SHARE_WRITE,
                              NULL,
                              OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL,
                              NULL);
                              
    if (hFile == INVALID_HANDLE_VALUE) {
        printf("打开原文件失败。\n");
        return FALSE;
    }
        dwFileSize = GetFileSize(hFile, NULL);
        hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,PartSize,NULL);
    if(hFileMap == NULL)  
   {  
      printf("创建原文件映射对象句柄失败:%d。\n",GetLastError());
      CloseHandle(hFile);  
      return -1;  
   }
   

    lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, i * PartSize, 0);
        if ( lpMapStartPos == NULL )
   {
       printf("%d\n.",i);
        printf("映射原文件到内存映射失败:%d。\n",GetLastError());
        return -1;
   }
   
    i++;    
    
    lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, i * PartSize, 0);
    if ( lpMapStartPos == NULL )
   {
       printf("映射原文件到内存映射失败:%d。\n",GetLastError());
       printf("%d\n",i);
       return -1;
   }
 
    UnmapViewOfFile(lpMapStartPos);
    CloseHandle(hFileMap);                //  关闭内存句柄
    CloseHandle(hFile);                   //  关闭文件句柄                                    
}


[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

最后于 2020-12-21 13:03 被limee编辑 ,原因:
收藏
免费 0
打赏
分享
最新回复 (3)
雪    币: 5402
活跃值: (4740)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
gamehack 2020-12-21 13:43
2
0
填0就行了啊!
雪    币: 1540
活跃值: (2807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
limee 2020-12-21 14:04
3
0
怎么填0?GetLastError是5,访问权限不够。
代码如何修改?

    lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, i * PartSize, 0);
        if ( lpMapStartPos == NULL )
   {
        printf("%d\n.",i);
        printf("映射原文件到内存映射失败:%d。\n",GetLastError());
        return -1;
   }
   
    
    UnmapViewOfFile(lpMapStartPos);       //  撤销第一部分的映射
    
    // 第2部分的文件片段如何映射?

    i++;

    lpMapStartPos = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
    if ( lpMapStartPos == NULL )
   {
       printf("映射原文件到内存映射失败:%d。\n",GetLastError());
       printf("%d\n",i);
       return -1;
   }

我是来解决大于4GB文件映射的问题,测试代码内存先开的小一点。
雪    币: 1540
活跃值: (2807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
limee 2020-12-21 14:07
4
0
gamehack 填0就行了啊!
我知道你的意思了,填0是一次把文件全部映射进去,是可以通过的。
但对于超过4G或者更大的文件,填0直接就是映射失败。所以我想
分段映射。我的测试代码内存先开的小一点。
如果想分段映射,代码应该如何修改?谢谢!
游客
登录 | 注册 方可回帖
返回