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 ******************************************************************/
12 #include <ddk/ntddk.h>
13 #include <kernel32/error.h>
16 #include <kernel32/kernel32.h>
18 /* FUNCTIONS *****************************************************************/
21 CreateFileMappingA(HANDLE hFile,
22 LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
24 DWORD dwMaximumSizeHigh,
25 DWORD dwMaximumSizeLow,
30 LARGE_INTEGER MaximumSize;
31 OBJECT_ATTRIBUTES ObjectAttributes;
33 UNICODE_STRING UnicodeName;
34 PSECURITY_DESCRIPTOR SecurityDescriptor;
36 if (lpFileMappingAttributes)
38 SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
42 SecurityDescriptor = NULL;
45 MaximumSize.u.LowPart = dwMaximumSizeLow;
46 MaximumSize.u.HighPart = dwMaximumSizeHigh;
47 RtlInitAnsiString(&AnsiName,
49 RtlAnsiStringToUnicodeString(&UnicodeName,
52 InitializeObjectAttributes(&ObjectAttributes,
57 Status = NtCreateSection(&SectionHandle,
64 RtlFreeUnicodeString(&UnicodeName);
65 if (!NT_SUCCESS(Status))
67 SetLastErrorByStatus(Status);
75 CreateFileMappingW(HANDLE hFile,
76 LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
78 DWORD dwMaximumSizeHigh,
79 DWORD dwMaximumSizeLow,
84 LARGE_INTEGER MaximumSize;
85 OBJECT_ATTRIBUTES ObjectAttributes;
86 UNICODE_STRING UnicodeName;
87 PSECURITY_DESCRIPTOR SecurityDescriptor;
89 if (lpFileMappingAttributes)
91 SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
95 SecurityDescriptor = NULL;
98 MaximumSize.u.LowPart = dwMaximumSizeLow;
99 MaximumSize.u.HighPart = dwMaximumSizeHigh;
100 RtlInitUnicodeString(&UnicodeName,
102 InitializeObjectAttributes(&ObjectAttributes,
107 Status = NtCreateSection(&SectionHandle,
114 if (!NT_SUCCESS(Status))
116 SetLastErrorByStatus(Status);
119 return SectionHandle;
124 MapViewOfFileEx(HANDLE hFileMappingObject,
125 DWORD dwDesiredAccess,
126 DWORD dwFileOffsetHigh,
127 DWORD dwFileOffsetLow,
128 DWORD dwNumberOfBytesToMap,
129 LPVOID lpBaseAddress)
132 LARGE_INTEGER SectionOffset;
137 SectionOffset.u.LowPart = dwFileOffsetLow;
138 SectionOffset.u.HighPart = dwFileOffsetHigh;
140 if ( ( dwDesiredAccess & FILE_MAP_WRITE) == FILE_MAP_WRITE)
141 Protect = PAGE_READWRITE;
142 else if ((dwDesiredAccess & FILE_MAP_READ) == FILE_MAP_READ)
143 Protect = PAGE_READONLY;
144 else if ((dwDesiredAccess & FILE_MAP_ALL_ACCESS) == FILE_MAP_ALL_ACCESS)
145 Protect = PAGE_READWRITE;
146 else if ((dwDesiredAccess & FILE_MAP_COPY) == FILE_MAP_COPY)
147 Protect = PAGE_WRITECOPY;
149 Protect = PAGE_READWRITE;
151 if (lpBaseAddress == NULL)
157 BaseAddress = lpBaseAddress;
160 ViewSize = (ULONG) dwNumberOfBytesToMap;
162 Status = ZwMapViewOfSection(hFileMappingObject,
166 dwNumberOfBytesToMap,
172 if (!NT_SUCCESS(Status))
174 SetLastErrorByStatus(Status);
182 MapViewOfFile(HANDLE hFileMappingObject,
183 DWORD dwDesiredAccess,
184 DWORD dwFileOffsetHigh,
185 DWORD dwFileOffsetLow,
186 DWORD dwNumberOfBytesToMap)
188 return MapViewOfFileEx(hFileMappingObject,
192 dwNumberOfBytesToMap,
198 UnmapViewOfFile(LPVOID lpBaseAddress)
202 Status = NtUnmapViewOfSection(NtCurrentProcess(),
204 if (!NT_SUCCESS(Status))
206 SetLastErrorByStatus(Status);
214 OpenFileMappingA(DWORD dwDesiredAccess,
215 WINBOOL bInheritHandle,
219 HANDLE SectionHandle;
220 OBJECT_ATTRIBUTES ObjectAttributes;
221 ANSI_STRING AnsiName;
222 UNICODE_STRING UnicodeName;
224 ULONG Attributes = 0;
228 Attributes = OBJ_INHERIT;
231 RtlInitAnsiString(&AnsiName,
233 RtlAnsiStringToUnicodeString(&UnicodeName,
237 InitializeObjectAttributes(&ObjectAttributes,
242 Status = NtOpenSection(&SectionHandle,
245 RtlFreeUnicodeString (&UnicodeName);
246 if (!NT_SUCCESS(Status))
248 SetLastErrorByStatus (Status);
251 return SectionHandle;
256 OpenFileMappingW(DWORD dwDesiredAccess,
257 WINBOOL bInheritHandle,
261 HANDLE SectionHandle;
262 OBJECT_ATTRIBUTES ObjectAttributes;
263 UNICODE_STRING UnicodeName;
264 ULONG Attributes = 0;
268 Attributes = OBJ_INHERIT;
271 RtlInitUnicodeString(&UnicodeName,
273 InitializeObjectAttributes(&ObjectAttributes,
278 Status = ZwOpenSection(&SectionHandle,
281 if (!NT_SUCCESS(Status))
283 SetLastErrorByStatus(Status);
286 return SectionHandle;
291 FlushViewOfFile(LPCVOID lpBaseAddress,
292 DWORD dwNumberOfBytesToFlush)
295 ULONG NumberOfBytesFlushed;
297 Status = NtFlushVirtualMemory(NtCurrentProcess(),
298 (LPVOID)lpBaseAddress,
299 dwNumberOfBytesToFlush,
300 &NumberOfBytesFlushed);
301 if (!NT_SUCCESS(Status))
303 SetLastErrorByStatus(Status);