2 * PROJECT: ReactOS Win32 Base API
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/kernel32/mem/section.c
5 * PURPOSE: Handles virtual memory APIs
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES ******************************************************************/
16 /* FUNCTIONS *****************************************************************/
23 CreateFileMappingA(IN HANDLE hFile
,
24 IN LPSECURITY_ATTRIBUTES lpFileMappingAttributes
,
26 IN DWORD dwMaximumSizeHigh
,
27 IN DWORD dwMaximumSizeLow
,
30 /* Call the W(ide) function */
31 ConvertWin32AnsiObjectApiToUnicodeApi(FileMapping
,
34 lpFileMappingAttributes
,
45 CreateFileMappingW(HANDLE hFile
,
46 LPSECURITY_ATTRIBUTES lpFileMappingAttributes
,
48 DWORD dwMaximumSizeHigh
,
49 DWORD dwMaximumSizeLow
,
54 OBJECT_ATTRIBUTES LocalAttributes
;
55 POBJECT_ATTRIBUTES ObjectAttributes
;
56 UNICODE_STRING SectionName
;
57 ACCESS_MASK DesiredAccess
;
58 LARGE_INTEGER LocalSize
;
59 PLARGE_INTEGER SectionSize
= NULL
;
62 /* Set default access */
63 DesiredAccess
= STANDARD_RIGHTS_REQUIRED
| SECTION_QUERY
| SECTION_MAP_READ
;
65 /* Get the attributes for the actual allocation and cleanup flProtect */
66 Attributes
= flProtect
& (SEC_FILE
| SEC_IMAGE
| SEC_RESERVE
| SEC_NOCACHE
| SEC_COMMIT
| SEC_LARGE_PAGES
);
67 flProtect
^= Attributes
;
69 /* If the caller didn't say anything, assume SEC_COMMIT */
70 if (!Attributes
) Attributes
= SEC_COMMIT
;
72 /* Now check if the caller wanted write access */
73 if (flProtect
== PAGE_READWRITE
)
76 DesiredAccess
|= (SECTION_MAP_WRITE
| SECTION_MAP_READ
);
79 /* Now check if we got a name */
80 if (lpName
) RtlInitUnicodeString(&SectionName
, lpName
);
82 /* Now convert the object attributes */
83 ObjectAttributes
= BasepConvertObjectAttributes(&LocalAttributes
,
84 lpFileMappingAttributes
,
85 lpName
? &SectionName
: NULL
);
87 /* Check if we got a size */
88 if (dwMaximumSizeLow
|| dwMaximumSizeHigh
)
90 /* Use a LARGE_INTEGER and convert */
91 SectionSize
= &LocalSize
;
92 SectionSize
->LowPart
= dwMaximumSizeLow
;
93 SectionSize
->HighPart
= dwMaximumSizeHigh
;
96 /* Make sure the handle is valid */
97 if (hFile
== INVALID_HANDLE_VALUE
)
99 /* It's not, we'll only go on if we have a size */
103 /* No size, so this isn't a valid non-mapped section */
104 SetLastError(ERROR_INVALID_PARAMETER
);
109 /* Now create the actual section */
110 Status
= NtCreateSection(&SectionHandle
,
118 if (Status
== STATUS_OBJECT_NAME_EXISTS
)
120 SetLastError(ERROR_ALREADY_EXISTS
);
121 return SectionHandle
;
124 if (!NT_SUCCESS(Status
))
127 BaseSetLastNTError(Status
);
131 SetLastError(ERROR_SUCCESS
);
132 /* Return the section */
133 return SectionHandle
;
141 MapViewOfFileEx(HANDLE hFileMappingObject
,
142 DWORD dwDesiredAccess
,
143 DWORD dwFileOffsetHigh
,
144 DWORD dwFileOffsetLow
,
145 SIZE_T dwNumberOfBytesToMap
,
146 LPVOID lpBaseAddress
)
149 LARGE_INTEGER SectionOffset
;
154 /* Convert the offset */
155 SectionOffset
.LowPart
= dwFileOffsetLow
;
156 SectionOffset
.HighPart
= dwFileOffsetHigh
;
158 /* Save the size and base */
159 ViewBase
= lpBaseAddress
;
160 ViewSize
= dwNumberOfBytesToMap
;
162 /* Convert flags to NT Protection Attributes */
163 if (dwDesiredAccess
& FILE_MAP_WRITE
)
165 Protect
= PAGE_READWRITE
;
167 else if (dwDesiredAccess
& FILE_MAP_READ
)
169 Protect
= PAGE_READONLY
;
171 else if (dwDesiredAccess
& FILE_MAP_COPY
)
173 Protect
= PAGE_WRITECOPY
;
177 Protect
= PAGE_NOACCESS
;
180 /* Map the section */
181 Status
= ZwMapViewOfSection(hFileMappingObject
,
191 if (!NT_SUCCESS(Status
))
194 BaseSetLastNTError(Status
);
198 /* Return the base */
207 MapViewOfFile(HANDLE hFileMappingObject
,
208 DWORD dwDesiredAccess
,
209 DWORD dwFileOffsetHigh
,
210 DWORD dwFileOffsetLow
,
211 SIZE_T dwNumberOfBytesToMap
)
213 /* Call the extended API */
214 return MapViewOfFileEx(hFileMappingObject
,
218 dwNumberOfBytesToMap
,
227 UnmapViewOfFile(LPCVOID lpBaseAddress
)
231 /* Unmap the section */
232 Status
= NtUnmapViewOfSection(NtCurrentProcess(), (PVOID
)lpBaseAddress
);
233 if (!NT_SUCCESS(Status
))
236 BaseSetLastNTError(Status
);
240 /* Otherwise, return sucess */
249 OpenFileMappingA(DWORD dwDesiredAccess
,
254 ANSI_STRING AnsiName
;
255 PUNICODE_STRING UnicodeCache
;
257 /* Check for a name */
261 UnicodeCache
= &NtCurrentTeb()->StaticUnicodeString
;
263 /* Convert to unicode */
264 RtlInitAnsiString(&AnsiName
, lpName
);
265 Status
= RtlAnsiStringToUnicodeString(UnicodeCache
, &AnsiName
, FALSE
);
266 if (!NT_SUCCESS(Status
))
268 /* Conversion failed */
269 BaseSetLastNTError(Status
);
276 SetLastError(ERROR_INVALID_PARAMETER
);
280 /* Call the Unicode version */
281 return OpenFileMappingW(dwDesiredAccess
,
283 (LPCWSTR
)UnicodeCache
->Buffer
);
291 OpenFileMappingW(DWORD dwDesiredAccess
,
296 HANDLE SectionHandle
;
297 OBJECT_ATTRIBUTES ObjectAttributes
;
298 UNICODE_STRING UnicodeName
;
303 /* Otherwise, fail */
304 SetLastError(ERROR_INVALID_PARAMETER
);
308 /* Convert attributes */
309 RtlInitUnicodeString(&UnicodeName
, lpName
);
310 InitializeObjectAttributes(&ObjectAttributes
,
312 (bInheritHandle
? OBJ_INHERIT
: 0),
316 /* Convert COPY to READ */
317 if (dwDesiredAccess
== FILE_MAP_COPY
) dwDesiredAccess
= FILE_MAP_READ
;
319 /* Open the section */
320 Status
= ZwOpenSection(&SectionHandle
,
323 if (!NT_SUCCESS(Status
))
326 BaseSetLastNTError(Status
);
330 SetLastError(ERROR_SUCCESS
);
331 /* Otherwise, return the handle */
332 return SectionHandle
;
340 FlushViewOfFile(LPCVOID lpBaseAddress
,
341 SIZE_T dwNumberOfBytesToFlush
)
343 SIZE_T NumberOfBytesToFlush
;
345 IO_STATUS_BLOCK IoStatusBlock
;
347 /* Save amount of bytes to flush to a local var */
348 NumberOfBytesToFlush
= dwNumberOfBytesToFlush
;
351 Status
= NtFlushVirtualMemory(NtCurrentProcess(),
352 (LPVOID
)lpBaseAddress
,
353 &NumberOfBytesToFlush
,
355 if (!NT_SUCCESS(Status
))
358 BaseSetLastNTError(Status
);