1 krisbash 1.1 #include "shmem.h"
2 #include <stdio.h>
3 #include <pal/strings.h>
4
5 #ifdef _MSC_VER
6 SECURITY_DESCRIPTOR g_SecurityDescriptor = {
7 SECURITY_DESCRIPTOR_REVISION,
8 0,
9 SE_DACL_PRESENT,
10 NULL,
11 NULL,
12 NULL,
13 NULL,
14 };
15
16 SECURITY_ATTRIBUTES g_SecurityAttributes = {
17 sizeof(SECURITY_ATTRIBUTES),
18 &g_SecurityDescriptor,
19 FALSE,
20 };
21 #endif
22 krisbash 1.1
23 int Shmem_Open(
24 _Out_ Shmem* self,
25 _In_z_ const PAL_Char *name,
26 _In_ ShmemAccess access,
27 ShmemUserAccess userAccess,
28 _In_ size_t size)
29 {
30 #if defined(_MSC_VER)
31
32 DWORD protect = 0;
33 DWORD hi;
34 DWORD lo;
35
36 if (access == SHMEM_ACCESS_READWRITE)
37 protect = PAGE_READWRITE;
38 else if (access == SHMEM_ACCESS_READONLY)
39 protect = PAGE_READONLY;
40 else
41 {
42 self->handle = NULL;
43 krisbash 1.1 return -1;
44 }
45
46 hi = (DWORD)((0xFFFFFFFF00000000 & (PAL_Uint64)size) >> 32);
47 lo = (DWORD)(0x00000000FFFFFFFF & (PAL_Uint64)size);
48
49 self->handle = CreateFileMapping(
50 INVALID_HANDLE_VALUE, /* use paging file */
51 (userAccess == SHMEM_USER_ACCESS_ALLOW_ALL) ? &g_SecurityAttributes : NULL, /* default or allow all security attributes based on userAccess requested*/
52 protect, /* page access rights */
53 hi, /* size: high 32-bits */
54 lo, /* size: low 32-bits */
55 name); /* name of map object */
56
57 return self->handle ? 0 : -1;
58
59 #else
60
61 int oflag;
62
63 /*
64 krisbash 1.1 * This is done since the shm_open is only defined for char * and does not take wchar_t
65 */
66 if (!name)
67 return -1;
68
69 #if defined(CONFIG_ENABLE_WCHAR)
70 StrWcslcpy(self->shmname, name, PAL_MAX_PATH_SIZE);
71 #else
72 Strlcpy(self->shmname, name, PAL_MAX_PATH_SIZE);
73 #endif
74
75 /* Build the oflag */
76
77 if (access == SHMEM_ACCESS_READWRITE)
78 oflag = O_CREAT | O_RDWR;
79 else if (access == SHMEM_ACCESS_READONLY)
80 oflag = O_CREAT | O_RDONLY;
81 else
82 return -1;
83
84 /* Open the shared memory segment */
85 krisbash 1.1
86 if ((self->shmid = shm_open(self->shmname, oflag, S_IRUSR | S_IWUSR)) == -1)
87 {
88 return -1;
89 }
90
91 if (ftruncate(self->shmid, size) != 0)
92 {
93 close(self->shmid);
94 shm_unlink(self->shmname);
95 return -1;
96 }
97
98 return 0;
99
100 #endif
101 }
102
103 void* Shmem_Map(
104 _Inout_ Shmem* self,
105 _In_ ShmemAccess access,
106 krisbash 1.1 _In_ ptrdiff_t offset,
107 _In_ size_t size)
108 {
109 #if defined(_MSC_VER)
110
111 DWORD desiredAccess = 0;
112 DWORD lo;
113 DWORD hi;
114 void* ptr;
115
116 if (access == SHMEM_ACCESS_READWRITE)
117 desiredAccess = FILE_MAP_ALL_ACCESS;
118 else if (access == SHMEM_ACCESS_READONLY)
119 desiredAccess = FILE_MAP_READ;
120 else
121 return NULL;
122
123 lo = (DWORD)(0x00000000FFFFFFFF & (PAL_Uint64)offset);
124 hi = (DWORD)((0xFFFFFFFF00000000 & (PAL_Uint64)offset) >> 32);
125
126 ptr = MapViewOfFile(
127 krisbash 1.1 self->handle,
128 desiredAccess,
129 hi, /* offset: high 32-bits */
130 lo, /* offset: low 32-bits */
131 size);
132
133 return ptr;
134
135 #else
136
137 int mprot;
138 int mflags;
139 void* ptr;
140
141 if (access == SHMEM_ACCESS_READWRITE)
142 mprot = PROT_READ | PROT_WRITE;
143 else if (access == SHMEM_ACCESS_READONLY)
144 mprot = PROT_READ;
145 else
146 return NULL;
147
148 krisbash 1.1 mflags = MAP_SHARED;
149 #if !defined(sun)
150 mflags |= MAP_FILE;
151 #endif
152
153 ptr = mmap(NULL, size, mprot, mflags, self->shmid, offset);
154
155 if (ptr == MAP_FAILED)
156 return NULL;
157
158 return ptr;
159
160 #endif
161 }
|