bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) { // Grab a pointer to the memory block int permissions = (mode == QSharedMemory::ReadOnly ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS); #if defined(Q_OS_WINPHONE) Q_UNIMPLEMENTED(); Q_UNUSED(mode) memory = 0; #elif defined(Q_OS_WINRT) memory = (void *)MapViewOfFileFromApp(handle(), permissions, 0, 0); #else memory = (void *)MapViewOfFile(handle(), permissions, 0, 0, 0); #endif if (0 == memory) { setErrorString(QLatin1String("QSharedMemory::attach")); cleanHandle(); return false; } // Grab the size of the memory we have been given (a multiple of 4K on windows) MEMORY_BASIC_INFORMATION info; if (!VirtualQuery(memory, &info, sizeof(info))) { // Windows doesn't set an error code on this one, // it should only be a kernel memory error. error = QSharedMemory::UnknownError; errorString = QSharedMemory::tr("%1: size query failed").arg(QLatin1String("QSharedMemory::attach: ")); return false; } size = info.RegionSize; return true; }
void* mono_file_map (size_t length, int flags, int fd, guint64 offset, void **ret_handle) { void *ptr; int mflags = 0; HANDLE file, mapping; int prot = mono_mmap_win_prot_from_flags (flags); mflags = FILE_MAP_READ; if (flags & MONO_MMAP_WRITE) mflags = FILE_MAP_COPY; file = (HANDLE) _get_osfhandle (fd); mapping = CreateFileMappingFromApp (file, NULL, prot, length, NULL); if (mapping == NULL) return NULL; ptr = MapViewOfFileFromApp (mapping, mflags, offset, length); if (ptr == NULL) { CloseHandle (mapping); return NULL; } *ret_handle = (void*)mapping; return ptr; }