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