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 *****************************************************************/
20 CreateFileMappingA(HANDLE hFile,
21 LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
23 DWORD dwMaximumSizeHigh,
24 DWORD dwMaximumSizeLow,
29 LARGE_INTEGER MaximumSize;
30 OBJECT_ATTRIBUTES ObjectAttributes;
32 UNICODE_STRING UnicodeName;
33 PSECURITY_DESCRIPTOR SecurityDescriptor;
35 if (lpFileMappingAttributes)
37 SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
41 SecurityDescriptor = NULL;
44 MaximumSize.u.LowPart = dwMaximumSizeLow;
45 MaximumSize.u.HighPart = dwMaximumSizeHigh;
46 RtlInitAnsiString(&AnsiName,
48 RtlAnsiStringToUnicodeString(&UnicodeName,
51 InitializeObjectAttributes(&ObjectAttributes,
56 Status = NtCreateSection(&SectionHandle,
63 RtlFreeUnicodeString(&UnicodeName);
64 if (!NT_SUCCESS(Status))
66 SetLastErrorByStatus(Status);
74 CreateFileMappingW(HANDLE hFile,
75 LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
77 DWORD dwMaximumSizeHigh,
78 DWORD dwMaximumSizeLow,
83 LARGE_INTEGER MaximumSize;
84 PLARGE_INTEGER MaximumSizePointer;
85 OBJECT_ATTRIBUTES ObjectAttributes;
86 UNICODE_STRING UnicodeName;
87 PSECURITY_DESCRIPTOR SecurityDescriptor;
89 if (lpFileMappingAttributes)
91 SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
95 SecurityDescriptor = NULL;
98 if ((dwMaximumSizeLow == 0) && (dwMaximumSizeHigh == 0))
100 MaximumSizePointer = NULL;
104 MaximumSize.u.LowPart = dwMaximumSizeLow;
105 MaximumSize.u.HighPart = dwMaximumSizeHigh;
106 MaximumSizePointer = &MaximumSize;
108 RtlInitUnicodeString(&UnicodeName,
110 InitializeObjectAttributes(&ObjectAttributes,
115 Status = NtCreateSection(&SectionHandle,
122 if (!NT_SUCCESS(Status))
124 SetLastErrorByStatus(Status);
127 return SectionHandle;
132 MapViewOfFileEx(HANDLE hFileMappingObject,
133 DWORD dwDesiredAccess,
134 DWORD dwFileOffsetHigh,
135 DWORD dwFileOffsetLow,
136 DWORD dwNumberOfBytesToMap,
137 LPVOID lpBaseAddress)
140 LARGE_INTEGER SectionOffset;
145 SectionOffset.u.LowPart = dwFileOffsetLow;
146 SectionOffset.u.HighPart = dwFileOffsetHigh;
148 if ( ( dwDesiredAccess & FILE_MAP_WRITE) == FILE_MAP_WRITE)
149 Protect = PAGE_READWRITE;
150 else if ((dwDesiredAccess & FILE_MAP_READ) == FILE_MAP_READ)
151 Protect = PAGE_READONLY;
152 else if ((dwDesiredAccess & FILE_MAP_ALL_ACCESS) == FILE_MAP_ALL_ACCESS)
153 Protect = PAGE_READWRITE;
154 else if ((dwDesiredAccess & FILE_MAP_COPY) == FILE_MAP_COPY)
155 Protect = PAGE_WRITECOPY;
157 Protect = PAGE_READWRITE;
159 if (lpBaseAddress == NULL)
165 BaseAddress = lpBaseAddress;
168 ViewSize = (ULONG) dwNumberOfBytesToMap;
170 Status = ZwMapViewOfSection(hFileMappingObject,
174 dwNumberOfBytesToMap,
180 if (!NT_SUCCESS(Status))
182 SetLastErrorByStatus(Status);
190 MapViewOfFile(HANDLE hFileMappingObject,
191 DWORD dwDesiredAccess,
192 DWORD dwFileOffsetHigh,
193 DWORD dwFileOffsetLow,
194 DWORD dwNumberOfBytesToMap)
196 return MapViewOfFileEx(hFileMappingObject,
200 dwNumberOfBytesToMap,
206 UnmapViewOfFile(LPVOID lpBaseAddress)
210 Status = NtUnmapViewOfSection(NtCurrentProcess(),
212 if (!NT_SUCCESS(Status))
214 SetLastErrorByStatus(Status);
222 OpenFileMappingA(DWORD dwDesiredAccess,
223 WINBOOL bInheritHandle,
227 HANDLE SectionHandle;
228 OBJECT_ATTRIBUTES ObjectAttributes;
229 ANSI_STRING AnsiName;
230 UNICODE_STRING UnicodeName;
232 ULONG Attributes = 0;
236 Attributes = OBJ_INHERIT;
239 RtlInitAnsiString(&AnsiName,
241 RtlAnsiStringToUnicodeString(&UnicodeName,
245 InitializeObjectAttributes(&ObjectAttributes,
250 Status = NtOpenSection(&SectionHandle,
253 RtlFreeUnicodeString (&UnicodeName);
254 if (!NT_SUCCESS(Status))
256 SetLastErrorByStatus (Status);
259 return SectionHandle;
264 OpenFileMappingW(DWORD dwDesiredAccess,
265 WINBOOL bInheritHandle,
269 HANDLE SectionHandle;
270 OBJECT_ATTRIBUTES ObjectAttributes;
271 UNICODE_STRING UnicodeName;
272 ULONG Attributes = 0;
276 Attributes = OBJ_INHERIT;
279 RtlInitUnicodeString(&UnicodeName,
281 InitializeObjectAttributes(&ObjectAttributes,
286 Status = ZwOpenSection(&SectionHandle,
289 if (!NT_SUCCESS(Status))
291 SetLastErrorByStatus(Status);
294 return SectionHandle;
299 FlushViewOfFile(LPCVOID lpBaseAddress,
300 DWORD dwNumberOfBytesToFlush)
303 ULONG NumberOfBytesFlushed;
305 Status = NtFlushVirtualMemory(NtCurrentProcess(),
306 (LPVOID)lpBaseAddress,
307 dwNumberOfBytesToFlush,
308 &NumberOfBytesFlushed);
309 if (!NT_SUCCESS(Status))
311 SetLastErrorByStatus(Status);