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)
10 /* INCLUDES ******************************************************************/
15 #include <kernel32/kernel32.h>
17 /* FUNCTIONS *****************************************************************/
23 CreateFileMappingA(HANDLE hFile,
24 LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
26 DWORD dwMaximumSizeHigh,
27 DWORD dwMaximumSizeLow,
32 LARGE_INTEGER MaximumSize;
33 OBJECT_ATTRIBUTES ObjectAttributes;
35 UNICODE_STRING UnicodeName;
36 PSECURITY_DESCRIPTOR SecurityDescriptor;
38 if (lpFileMappingAttributes)
40 SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
44 SecurityDescriptor = NULL;
47 MaximumSize.u.LowPart = dwMaximumSizeLow;
48 MaximumSize.u.HighPart = dwMaximumSizeHigh;
49 RtlInitAnsiString(&AnsiName,
51 RtlAnsiStringToUnicodeString(&UnicodeName,
54 InitializeObjectAttributes(&ObjectAttributes,
59 Status = NtCreateSection(&SectionHandle,
65 hFile==INVALID_HANDLE_VALUE ? NULL : hFile);
66 RtlFreeUnicodeString(&UnicodeName);
67 if (!NT_SUCCESS(Status))
69 SetLastErrorByStatus(Status);
80 CreateFileMappingW(HANDLE hFile,
81 LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
83 DWORD dwMaximumSizeHigh,
84 DWORD dwMaximumSizeLow,
89 LARGE_INTEGER MaximumSize;
90 PLARGE_INTEGER MaximumSizePointer;
91 OBJECT_ATTRIBUTES ObjectAttributes;
92 UNICODE_STRING UnicodeName;
93 PSECURITY_DESCRIPTOR SecurityDescriptor;
95 if (lpFileMappingAttributes)
97 SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
101 SecurityDescriptor = NULL;
104 if ((dwMaximumSizeLow == 0) && (dwMaximumSizeHigh == 0))
106 MaximumSizePointer = NULL;
110 MaximumSize.u.LowPart = dwMaximumSizeLow;
111 MaximumSize.u.HighPart = dwMaximumSizeHigh;
112 MaximumSizePointer = &MaximumSize;
114 RtlInitUnicodeString(&UnicodeName,
116 InitializeObjectAttributes(&ObjectAttributes,
121 Status = NtCreateSection(&SectionHandle,
127 hFile==INVALID_HANDLE_VALUE ? NULL : hFile);
128 if (!NT_SUCCESS(Status))
130 SetLastErrorByStatus(Status);
133 return SectionHandle;
141 MapViewOfFileEx(HANDLE hFileMappingObject,
142 DWORD dwDesiredAccess,
143 DWORD dwFileOffsetHigh,
144 DWORD dwFileOffsetLow,
145 DWORD dwNumberOfBytesToMap,
146 LPVOID lpBaseAddress)
149 LARGE_INTEGER SectionOffset;
154 SectionOffset.u.LowPart = dwFileOffsetLow;
155 SectionOffset.u.HighPart = dwFileOffsetHigh;
157 if ( ( dwDesiredAccess & FILE_MAP_WRITE) == FILE_MAP_WRITE)
158 Protect = PAGE_READWRITE;
159 else if ((dwDesiredAccess & FILE_MAP_READ) == FILE_MAP_READ)
160 Protect = PAGE_READONLY;
161 else if ((dwDesiredAccess & FILE_MAP_ALL_ACCESS) == FILE_MAP_ALL_ACCESS)
162 Protect = PAGE_READWRITE;
163 else if ((dwDesiredAccess & FILE_MAP_COPY) == FILE_MAP_COPY)
164 Protect = PAGE_WRITECOPY;
166 Protect = PAGE_READWRITE;
168 if (lpBaseAddress == NULL)
174 BaseAddress = lpBaseAddress;
177 ViewSize = (ULONG) dwNumberOfBytesToMap;
179 Status = ZwMapViewOfSection(hFileMappingObject,
183 dwNumberOfBytesToMap,
189 if (!NT_SUCCESS(Status))
191 SetLastErrorByStatus(Status);
202 MapViewOfFile(HANDLE hFileMappingObject,
203 DWORD dwDesiredAccess,
204 DWORD dwFileOffsetHigh,
205 DWORD dwFileOffsetLow,
206 DWORD dwNumberOfBytesToMap)
208 return MapViewOfFileEx(hFileMappingObject,
212 dwNumberOfBytesToMap,
221 UnmapViewOfFile(LPVOID lpBaseAddress)
225 Status = NtUnmapViewOfSection(NtCurrentProcess(),
227 if (!NT_SUCCESS(Status))
229 SetLastErrorByStatus(Status);
240 OpenFileMappingA(DWORD dwDesiredAccess,
241 WINBOOL bInheritHandle,
245 HANDLE SectionHandle;
246 OBJECT_ATTRIBUTES ObjectAttributes;
247 ANSI_STRING AnsiName;
248 UNICODE_STRING UnicodeName;
250 ULONG Attributes = 0;
254 Attributes = OBJ_INHERIT;
257 RtlInitAnsiString(&AnsiName,
259 RtlAnsiStringToUnicodeString(&UnicodeName,
263 InitializeObjectAttributes(&ObjectAttributes,
268 Status = NtOpenSection(&SectionHandle,
271 RtlFreeUnicodeString (&UnicodeName);
272 if (!NT_SUCCESS(Status))
274 SetLastErrorByStatus (Status);
277 return SectionHandle;
285 OpenFileMappingW(DWORD dwDesiredAccess,
286 WINBOOL bInheritHandle,
290 HANDLE SectionHandle;
291 OBJECT_ATTRIBUTES ObjectAttributes;
292 UNICODE_STRING UnicodeName;
293 ULONG Attributes = 0;
297 Attributes = OBJ_INHERIT;
300 RtlInitUnicodeString(&UnicodeName,
302 InitializeObjectAttributes(&ObjectAttributes,
307 Status = ZwOpenSection(&SectionHandle,
310 if (!NT_SUCCESS(Status))
312 SetLastErrorByStatus(Status);
315 return SectionHandle;
323 FlushViewOfFile(LPCVOID lpBaseAddress,
324 DWORD dwNumberOfBytesToFlush)
327 ULONG NumberOfBytesFlushed;
329 Status = NtFlushVirtualMemory(NtCurrentProcess(),
330 (LPVOID)lpBaseAddress,
331 dwNumberOfBytesToFlush,
332 &NumberOfBytesFlushed);
333 if (!NT_SUCCESS(Status))
335 SetLastErrorByStatus(Status);