ff473d148b0e81213010c6aa079f59e0709085fc
[reactos.git] / reactos / lib / kernel32 / mem / section.c
1 /* $Id: section.c,v 1.4 1999/10/03 23:19:15 ea Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: lib/kernel32/mem/section.c
6 * PURPOSE: Implementing file mapping
7 * PROGRAMMER: David Welch (welch@mcmail.com)
8 */
9
10 /* INCLUDES ******************************************************************/
11
12 #include <windows.h>
13 #include <ddk/ntddk.h>
14
15 /* FUNCTIONS *****************************************************************/
16
17 HANDLE
18 STDCALL
19 CreateFileMappingA (
20 HANDLE hFile,
21 LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
22 DWORD flProtect,
23 DWORD dwMaximumSizeHigh,
24 DWORD dwMaximumSizeLow,
25 LPCSTR lpName
26 )
27 {
28 NTSTATUS Status;
29 HANDLE SectionHandle;
30 LARGE_INTEGER MaximumSize;
31 OBJECT_ATTRIBUTES ObjectAttributes;
32 ANSI_STRING AnsiName;
33 UNICODE_STRING UnicodeName;
34
35 MaximumSize.u.LowPart = dwMaximumSizeLow;
36 MaximumSize.u.HighPart = dwMaximumSizeHigh;
37 RtlInitAnsiString(&AnsiName, (LPSTR)lpName);
38 RtlAnsiStringToUnicodeString(&UnicodeName, &AnsiName, TRUE);
39 InitializeObjectAttributes(&ObjectAttributes,
40 &UnicodeName,
41 0,
42 NULL,
43 lpFileMappingAttributes);
44 Status = ZwCreateSection(&SectionHandle,
45 SECTION_ALL_ACCESS,
46 &ObjectAttributes,
47 &MaximumSize,
48 flProtect,
49 0,
50 hFile);
51 if (!NT_SUCCESS(Status))
52 {
53 SetLastError(RtlNtStatusToDosError(Status));
54 return NULL;
55 }
56
57 return SectionHandle;
58 }
59
60
61 HANDLE
62 STDCALL
63 CreateFileMappingW (
64 HANDLE hFile,
65 LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
66 DWORD flProtect,
67 DWORD dwMaximumSizeHigh,
68 DWORD dwMaximumSizeLow,
69 LPCWSTR lpName
70 )
71 {
72 NTSTATUS Status;
73 HANDLE SectionHandle;
74 LARGE_INTEGER MaximumSize;
75 OBJECT_ATTRIBUTES ObjectAttributes;
76 UNICODE_STRING UnicodeName;
77
78 MaximumSize.u.LowPart = dwMaximumSizeLow;
79 MaximumSize.u.HighPart = dwMaximumSizeHigh;
80 RtlInitUnicodeString(&UnicodeName, lpName);
81 InitializeObjectAttributes(&ObjectAttributes,
82 &UnicodeName,
83 0,
84 NULL,
85 lpFileMappingAttributes);
86 Status = ZwCreateSection(&SectionHandle,
87 SECTION_ALL_ACCESS,
88 &ObjectAttributes,
89 &MaximumSize,
90 flProtect,
91 0,
92 hFile);
93 if (!NT_SUCCESS(Status))
94 {
95 SetLastError(RtlNtStatusToDosError(Status));
96 return NULL;
97 }
98
99 return SectionHandle;
100 }
101
102
103 LPVOID
104 STDCALL
105 MapViewOfFileEx (
106 HANDLE hFileMappingObject,
107 DWORD dwDesiredAccess,
108 DWORD dwFileOffsetHigh,
109 DWORD dwFileOffsetLow,
110 DWORD dwNumberOfBytesToMap,
111 LPVOID lpBaseAddress
112 )
113 {
114 NTSTATUS Status;
115
116
117
118
119 LARGE_INTEGER SectionOffset;
120 ULONG ViewSize;
121 ULONG Protect;
122 LPVOID BaseAddress;
123
124 SectionOffset.u.LowPart = dwFileOffsetLow;
125 SectionOffset.u.HighPart = dwFileOffsetHigh;
126
127
128
129
130
131
132 if ( ( dwDesiredAccess & FILE_MAP_WRITE ) == FILE_MAP_WRITE )
133 Protect = PAGE_READWRITE;
134 else if ( ( dwDesiredAccess & FILE_MAP_READ ) == FILE_MAP_READ )
135 Protect = PAGE_READONLY;
136 else if ( ( dwDesiredAccess & FILE_MAP_ALL_ACCESS ) == FILE_MAP_ALL_ACCESS )
137 Protect = PAGE_READWRITE;
138 else if ( ( dwDesiredAccess & FILE_MAP_COPY ) == FILE_MAP_COPY )
139 Protect = PAGE_WRITECOPY;
140 else
141 Protect = PAGE_READWRITE;
142
143
144 Status = ZwMapViewOfSection(hFileMappingObject,
145 NtCurrentProcess(),
146 &BaseAddress,
147 0,
148 dwNumberOfBytesToMap,
149 &SectionOffset,
150 &ViewSize,
151 ViewShare,
152 0,
153 Protect);
154
155
156
157 if (!NT_SUCCESS(Status))
158 {
159 SetLastError(RtlNtStatusToDosError(Status));
160 return NULL;
161 }
162
163 return BaseAddress;
164
165 }
166
167 LPVOID
168 STDCALL
169 MapViewOfFile (
170 HANDLE hFileMappingObject,
171 DWORD dwDesiredAccess,
172 DWORD dwFileOffsetHigh,
173 DWORD dwFileOffsetLow,
174 DWORD dwNumberOfBytesToMap
175 )
176 {
177 return MapViewOfFileEx(hFileMappingObject,dwDesiredAccess,
178 dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap,NULL);
179 }
180
181
182 WINBOOL
183 STDCALL
184 UnmapViewOfFile (
185 LPVOID lpBaseAddress
186 )
187 {
188 NTSTATUS Status;
189 Status = NtUnmapViewOfSection(NtCurrentProcess(),lpBaseAddress);
190
191 if (!NT_SUCCESS(Status))
192 {
193 SetLastError(RtlNtStatusToDosError(Status));
194 return FALSE;
195 }
196
197 return TRUE;
198 }
199
200
201 HANDLE
202 STDCALL
203 OpenFileMappingA (
204 DWORD dwDesiredAccess,
205 WINBOOL bInheritHandle,
206 LPCSTR lpName
207 )
208 {
209 NTSTATUS Status;
210 HANDLE SectionHandle;
211 OBJECT_ATTRIBUTES ObjectAttributes;
212 ANSI_STRING AnsiName;
213 UNICODE_STRING UnicodeName;
214
215 ULONG Attributes = 0;
216
217 if ( bInheritHandle )
218 Attributes = OBJ_INHERIT;
219
220 RtlInitAnsiString(&AnsiName, lpName);
221 RtlAnsiStringToUnicodeString(&UnicodeName, &AnsiName, TRUE);
222
223
224 InitializeObjectAttributes(&ObjectAttributes,
225 &UnicodeName,
226 Attributes,
227 NULL,
228 NULL);
229 Status = ZwOpenSection(&SectionHandle,
230 SECTION_ALL_ACCESS,
231 &ObjectAttributes
232 );
233 if (!NT_SUCCESS(Status))
234 {
235 SetLastError(RtlNtStatusToDosError(Status));
236 return NULL;
237 }
238
239 return SectionHandle;
240 }
241
242
243 HANDLE
244 STDCALL
245 OpenFileMappingW (
246 DWORD dwDesiredAccess,
247 WINBOOL bInheritHandle,
248 LPCWSTR lpName
249 )
250 {
251 NTSTATUS Status;
252 HANDLE SectionHandle;
253 OBJECT_ATTRIBUTES ObjectAttributes;
254 UNICODE_STRING UnicodeName;
255
256 ULONG Attributes = 0;
257
258 if ( bInheritHandle )
259 Attributes = OBJ_INHERIT;
260
261 RtlInitUnicodeString(&UnicodeName, lpName);
262 InitializeObjectAttributes(&ObjectAttributes,
263 &UnicodeName,
264 Attributes,
265 NULL,
266 NULL);
267 Status = ZwOpenSection(&SectionHandle,
268 SECTION_ALL_ACCESS,
269 &ObjectAttributes);
270 if (!NT_SUCCESS(Status))
271 {
272 SetLastError(RtlNtStatusToDosError(Status));
273 return NULL;
274 }
275
276 return SectionHandle;
277 }
278
279
280 /* EOF */