2 * mono-mmap-windows.c: Windows support for mapping code into the process address space
5 * Mono Team (mono-list@lists.ximian.com)
7 * Copyright 2001-2008 Novell, Inc.
8 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
14 #if defined(HOST_WIN32)
16 #include "mono/utils/mono-mmap-windows.h"
17 #include <mono/utils/mono-counters.h>
20 static void *malloced_shared_area = NULL;
26 static int saved_pagesize = 0;
28 return saved_pagesize;
29 GetSystemInfo (&info);
30 saved_pagesize = info.dwAllocationGranularity;
31 return saved_pagesize;
35 mono_mmap_win_prot_from_flags (int flags)
37 int prot = flags & (MONO_MMAP_READ|MONO_MMAP_WRITE|MONO_MMAP_EXEC);
39 case 0: prot = PAGE_NOACCESS; break;
40 case MONO_MMAP_READ: prot = PAGE_READONLY; break;
41 case MONO_MMAP_READ|MONO_MMAP_EXEC: prot = PAGE_EXECUTE_READ; break;
42 case MONO_MMAP_READ|MONO_MMAP_WRITE: prot = PAGE_READWRITE; break;
43 case MONO_MMAP_READ|MONO_MMAP_WRITE|MONO_MMAP_EXEC: prot = PAGE_EXECUTE_READWRITE; break;
44 case MONO_MMAP_WRITE: prot = PAGE_READWRITE; break;
45 case MONO_MMAP_WRITE|MONO_MMAP_EXEC: prot = PAGE_EXECUTE_READWRITE; break;
46 case MONO_MMAP_EXEC: prot = PAGE_EXECUTE; break;
48 g_assert_not_reached ();
54 mono_valloc (void *addr, size_t length, int flags, MonoMemAccountType type)
57 int mflags = MEM_RESERVE|MEM_COMMIT;
58 int prot = mono_mmap_win_prot_from_flags (flags);
59 /* translate the flags */
61 ptr = VirtualAlloc (addr, length, mflags, prot);
63 account_mem (type, (ssize_t)length);
69 mono_valloc_aligned (size_t length, size_t alignment, int flags, MonoMemAccountType type)
71 int prot = mono_mmap_win_prot_from_flags (flags);
72 char *mem = VirtualAlloc (NULL, length + alignment, MEM_RESERVE, prot);
78 aligned = aligned_address (mem, length, alignment);
80 aligned = VirtualAlloc (aligned, length, MEM_COMMIT, prot);
83 account_mem (type, (ssize_t)length);
89 mono_vfree (void *addr, size_t length, MonoMemAccountType type)
91 MEMORY_BASIC_INFORMATION mbi;
92 SIZE_T query_result = VirtualQuery (addr, &mbi, sizeof (mbi));
95 g_assert (query_result);
97 res = VirtualFree (mbi.AllocationBase, 0, MEM_RELEASE);
101 account_mem (type, -(ssize_t)length);
106 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
108 mono_file_map (size_t length, int flags, int fd, guint64 offset, void **ret_handle)
112 HANDLE file, mapping;
113 int prot = mono_mmap_win_prot_from_flags (flags);
114 /* translate the flags */
115 /*if (flags & MONO_MMAP_PRIVATE)
116 mflags |= MAP_PRIVATE;
117 if (flags & MONO_MMAP_SHARED)
118 mflags |= MAP_SHARED;
119 if (flags & MONO_MMAP_ANON)
120 mflags |= MAP_ANONYMOUS;
121 if (flags & MONO_MMAP_FIXED)
123 if (flags & MONO_MMAP_32BIT)
124 mflags |= MAP_32BIT;*/
126 mflags = FILE_MAP_READ;
127 if (flags & MONO_MMAP_WRITE)
128 mflags = FILE_MAP_COPY;
130 file = (HANDLE) _get_osfhandle (fd);
132 mapping = CreateFileMapping (file, NULL, prot, 0, 0, NULL);
137 ptr = MapViewOfFile (mapping, mflags, 0, offset, length);
140 CloseHandle (mapping);
143 *ret_handle = (void*)mapping;
148 mono_file_unmap (void *addr, void *handle)
150 UnmapViewOfFile (addr);
151 CloseHandle ((HANDLE)handle);
154 #endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
157 mono_mprotect (void *addr, size_t length, int flags)
160 int prot = mono_mmap_win_prot_from_flags (flags);
162 if (flags & MONO_MMAP_DISCARD) {
163 VirtualFree (addr, length, MEM_DECOMMIT);
164 VirtualAlloc (addr, length, MEM_COMMIT, prot);
167 return VirtualProtect (addr, length, prot, &oldprot) == 0;
171 mono_shared_area (void)
173 if (!malloced_shared_area)
174 malloced_shared_area = malloc_shared_area (0);
175 /* get the pid here */
176 return malloced_shared_area;
180 mono_shared_area_remove (void)
182 if (malloced_shared_area)
183 g_free (malloced_shared_area);
184 malloced_shared_area = NULL;
188 mono_shared_area_for_pid (void *pid)
194 mono_shared_area_unload (void *area)
199 mono_shared_area_instances (void **array, int count)