id,summary,reporter,owner,description,type,status,milestone,component,version,severity,resolution,keywords,cc 2996,[iostreams] Can't open mapped_file data file for read/write access on Windows,Allen Cronce ,Jonathan Turkanis,"I see access errors when trying to use mapped_file open a data file for reading and writing under Windows (built with VS2005). The same code works fine under Mac OS X, which is posix, of course. Note that I originally found this problem under boost 1.35, but it is still present in the just released 1.39 version. Unfortunately it looks like trac has not been updated, so I cannot set the ""version"" to 1.38, or the ""milestone"" to 1.40. Here's a code sample that works on Mac OS X and fails under Windows: --snip-- /** Test boost iostream mapped_file. */ static int BoostMappedFileTest(void) { int result = 0; std::cout << ""\nRunning BoostMappedFileTest..."" << std::endl; // Initialize our test directory fs::path testDirPath( ""BoostMappedFileTest"" ); create_directory(testDirPath); // Initialize a test file buffer with some data const size_t kTestFileSize = 4096; boost::scoped_array fileBuffer( new char[kTestFileSize] ); char* pCur = fileBuffer.get(); char curChar = 0; for( size_t i = 0; i < kTestFileSize; ++i ) { *pCur++ = curChar++; } // Write the data to a test file. Be sure to explicitly close it. fs::path testFilePath( testDirPath / ""test_mapped_file"" ); boost::filesystem::ofstream testFile( testFilePath, ios::trunc | ios::binary ); testFile.write(fileBuffer.get(), kTestFileSize); testFile.close(); // Try and open the test file as a memory mapped file. string testFilePathStr = testFilePath.file_string(); mapped_file mappedFile(testFilePathStr); // We never get here under Windows. The file fails to // open with an access error. // Compare the mapped file data to our original buffer const char* mmConstData = mappedFile.const_data(); bool compareSucceeded = (0 == memcmp(fileBuffer.get(), mmConstData, kTestFileSize)); if (!compareSucceeded) { throw runtime_error(""The boost memory mapped file data doesn't match our buffer!""); } return result; } --snip-- The problem seems to come from passing GENERIC_ALL as the ""dwDesiredAccess"" parameter to the CreateFileA call. If I change the implementation to pass GENERIC_READ | GENERIC_WRITE, then it works in my test scenario. Please note that I haven't tried pointing the current code at an actual executable to see if it works with GENERIC_ALL. If you assume a strict interpretation of the mapped_file API, the mode of BOOST_IOS::in would map to GENERIC_READ in the Windows world, and BOOST_IOS::out would map to GENERIC_WRITE. There is no corresponding ""execute"" flag that I can see in this API. I've attached a diff created from the boost 1.39 release that fixes the problem. My email address (in case my trac preferences doesn't work) is acronce@gmail.com.",Bugs,closed,Boost 1.39.0,iostreams,Boost 1.38.0,Problem,fixed,,