首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MapViewOfFile返回ERROR_INVALID_PARAMETER Windows-10(通用Windows平台)

MapViewOfFile返回ERROR_INVALID_PARAMETER Windows-10(通用Windows平台)
EN

Stack Overflow用户
提问于 2016-02-04 02:01:53
回答 1查看 663关注 0票数 0

我正在尝试将我现有的Windows桌面应用程序(在Windows -7上运行良好)移植到Windows-10 (通用Windows平台)

在Windows-10上,MapViewOfFile返回

ERROR_INVALID_PARAMETER

,当我将访问类型设置为FILE_MAP_READ | FILE_MAP_WRITE | FILE_MAP_EXECUTE时。

我的代码如下:

代码语言:javascript
运行
复制
   HANDLE mhandle = NULL;
   HANDLE g_hfile;
   LARGE_INTEGER ms_size;
   size_t file_size = 0;     
   void* map = NULL; 

   CREATEFILE2_EXTENDED_PARAMETERS ms_param;
   ms_param.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
   ms_param.dwFileAttributes = GENERIC_WRITE | GENERIC_EXECUTE;
   ms_param.dwFileFlags = FILE_FLAG_NO_BUFFERING;
   ms_param.dwSecurityQosFlags = SECURITY_DELEGATION;
   ms_param.lpSecurityAttributes = NULL;
   ms_param.hTemplateFile = NULL;
   g_hfile = CreateFile2(filename, GENERIC_WRITE | GENERIC_EXECUTE, FILE_SHARE_READ|FILE_SHARE_WRITE, OPEN_EXISTING, &ms_param);
   if (g_hfile == INVALID_HANDLE_VALUE)
   {
       return GetLastError();
   }

   if (GetFileSizeEx(g_hfile, &ms_size) == 0)
   {
       return GetLastError();
   }

   file_size = ms_size.u.LowPart | ((unsigned long long)ms_size.u.HighPart << 32 );
   mhandle = CreateFileMapping(g_hfile, NULL, PAGE_EXECUTE_READWRITE, (unsigned long long)ms_size.u.HighPart, ms_size.u.LowPart, NULL);
   if (mhandle == NULL)
   {
       return GetLastError();
   }

   map = MapViewOfFile(mhandle, FILE_MAP_READ | FILE_MAP_WRITE | FILE_MAP_EXECUTE, 0, 0, file_size);
  if (map == NULL)
  {
     return GetLastError();
  }

正在映射的文件大小约为1KB。如果我将访问类型设置为FILE_MAP_READ | FILE_MAP_WRITEFILE_MAP_READ | FILE_MAP_EXECMapViewOfFile将按预期工作。

但是,如果我使用的是FILE_MAP_READ \ FILE_MAP_EXEC | FILE_MAP_EXECUTEFILE_MAP_EXEC | FILE_MAP_EXECUTE,那么MapViewOfFile就失败了。

我没有为这个api找到任何特定于Windows-10的文档。我在这里阅读了这个api的可用MSDN文档:https://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=vs.85).aspx

此外,UWP的API集似乎不包含以下api:https://msdn.microsoft.com/en-us/library/windows/desktop/mt186421(v=vs.85).aspx

如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2019-03-10 03:58:18

我想你的问题已经不相关了,但希望我的回答能对那些面临同样问题的人有所帮助。您正在使用正确的UWP API来创建文件,但是用于文件映射的API是错误的。您需要使用CreateFileMappingFromApp代替CreateFileMapping,使用MapViewOfFileFromApp代替MapViewOfFile。仔细看一看,UWP的PageProtection类型CreateFileMappingFromApp根本不允许执行。

这里是代码示例,有大量的注释描述了非明显的片段:

代码语言:javascript
运行
复制
#include <windows.h>
#include <string>
#include <iostream>

// you may combine access in the same was as pageFileAccessMode allows
enum class AccessMode {
    READ,
    READ_WRITE
};

DWORD openFileForMapping(AccessMode accessMode, std::wstring const & filepath, HANDLE * fileHandler, std::size_t & fileSize, HANDLE * fileMappingHandler) {
    DWORD fileAccessRegularMode;
    DWORD fileAccessSharedMode;
    DWORD pageFileAccessMode;
    HANDLE localFileHandler;
    HANDLE localFileMappingHandler;

    switch (accessMode) {
    case AccessMode::READ:
        fileAccessRegularMode = GENERIC_READ;
        fileAccessSharedMode = FILE_SHARE_READ;
        pageFileAccessMode = PAGE_READONLY;
        break;
    case AccessMode::READ_WRITE:
        fileAccessRegularMode = GENERIC_READ | GENERIC_WRITE;
        fileAccessSharedMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
        pageFileAccessMode = PAGE_READWRITE;
        break;
    }

    // parameters MUST be initialized with zero and size
    CREATEFILE2_EXTENDED_PARAMETERS createFile2ParametersEx{ 0 };
    createFile2ParametersEx.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
    createFile2ParametersEx.dwFileAttributes = fileAccessRegularMode;
    // parameters options, depends on your requirements
    createFile2ParametersEx.dwFileFlags = FILE_FLAG_NO_BUFFERING;
    createFile2ParametersEx.lpSecurityAttributes = NULL;
    createFile2ParametersEx.hTemplateFile = NULL;

    localFileHandler = CreateFile2(filepath.c_str(), fileAccessRegularMode, fileAccessSharedMode, OPEN_EXISTING, &createFile2ParametersEx);
    if (localFileHandler == INVALID_HANDLE_VALUE) {
        return GetLastError();
    }

    LARGE_INTEGER msSize;
    if (GetFileSizeEx(localFileHandler, &msSize) == 0) {
        return GetLastError();
    }

    fileSize = msSize.QuadPart;
    localFileMappingHandler = CreateFileMappingFromApp(localFileHandler, NULL, pageFileAccessMode, fileSize, NULL);
    if (localFileMappingHandler == nullptr) {
        return GetLastError();
    }

    *fileHandler = localFileHandler;
    *fileMappingHandler = localFileMappingHandler;
    return S_OK;
}

DWORD getView(AccessMode accessMode, HANDLE fileMappingHandler, std::uint64_t beginIndex, std::uint64_t lengthOfView, void ** mapView) {
    DWORD mapViewAccessMode;

    switch (accessMode) {
    case AccessMode::READ:
        mapViewAccessMode = FILE_MAP_READ;
        break;
    case AccessMode::READ_WRITE:
        mapViewAccessMode = FILE_MAP_READ | FILE_MAP_WRITE;
        break;
    }

    *mapView = MapViewOfFileFromApp(fileMappingHandler, mapViewAccessMode, beginIndex, lengthOfView);
    if (*mapView == nullptr) {
        return GetLastError();
    }

    return S_OK;
}

DWORD getFileMapViewAndPrint() {
    DWORD errorCode;
    // don't forget, UWP app have write access only inside container local folder
    std::wstring filename = L"test.txt";

    // open file with desired acces and create file mapping 
    HANDLE fileHandle;
    HANDLE fileMappingHandle;
    std::size_t fileSize;
    errorCode = openFileForMapping(AccessMode::READ, filename.c_str(), &fileHandle, fileSize, &fileMappingHandle);
    if (errorCode != S_OK) {
        return errorCode;
    }

    // using created file mapping project map view to file
    void * mapView;
    errorCode = getView(AccessMode::READ, fileMappingHandle, 0, fileSize, &mapView);
    if (errorCode != S_OK) {
        return errorCode;
    }

    // mapView now contains row data from file, in my case it was txt
    // with UTF8 text so I just need to cast void to char
    OutputDebugStringA(static_cast<char*>(mapView));
    OutputDebugStringA("\n");

    // cleanup
    UnmapViewOfFile(mapView);
    mapView = nullptr;
    CloseHandle(fileMappingHandle);
    CloseHandle(fileHandle);

    return S_OK;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35191188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档