Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfilemap.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Win32 Base API 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: dll/win32/kernel32/mem/section.c 00005 * PURPOSE: Handles virtual memory APIs 00006 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 00007 */ 00008 00009 /* INCLUDES *******************************************************************/ 00010 00011 #include <k32.h> 00012 00013 #define NDEBUG 00014 #include <debug.h> 00015 00016 /* FUNCTIONS ******************************************************************/ 00017 00018 /* 00019 * @implemented 00020 */ 00021 HANDLE 00022 NTAPI 00023 CreateFileMappingA(IN HANDLE hFile, 00024 IN LPSECURITY_ATTRIBUTES lpFileMappingAttributes, 00025 IN DWORD flProtect, 00026 IN DWORD dwMaximumSizeHigh, 00027 IN DWORD dwMaximumSizeLow, 00028 IN LPCSTR lpName) 00029 { 00030 /* Call the W(ide) function */ 00031 ConvertWin32AnsiObjectApiToUnicodeApi(FileMapping, 00032 lpName, 00033 hFile, 00034 lpFileMappingAttributes, 00035 flProtect, 00036 dwMaximumSizeHigh, 00037 dwMaximumSizeLow); 00038 } 00039 00040 /* 00041 * @implemented 00042 */ 00043 HANDLE 00044 NTAPI 00045 CreateFileMappingW(HANDLE hFile, 00046 LPSECURITY_ATTRIBUTES lpFileMappingAttributes, 00047 DWORD flProtect, 00048 DWORD dwMaximumSizeHigh, 00049 DWORD dwMaximumSizeLow, 00050 LPCWSTR lpName) 00051 { 00052 NTSTATUS Status; 00053 HANDLE SectionHandle; 00054 OBJECT_ATTRIBUTES LocalAttributes; 00055 POBJECT_ATTRIBUTES ObjectAttributes; 00056 UNICODE_STRING SectionName; 00057 ACCESS_MASK DesiredAccess; 00058 LARGE_INTEGER LocalSize; 00059 PLARGE_INTEGER SectionSize = NULL; 00060 ULONG Attributes; 00061 00062 /* Set default access */ 00063 DesiredAccess = STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ; 00064 00065 /* Get the attributes for the actual allocation and cleanup flProtect */ 00066 Attributes = flProtect & (SEC_FILE | SEC_IMAGE | SEC_RESERVE | SEC_NOCACHE | SEC_COMMIT | SEC_LARGE_PAGES); 00067 flProtect ^= Attributes; 00068 00069 /* If the caller didn't say anything, assume SEC_COMMIT */ 00070 if (!Attributes) Attributes = SEC_COMMIT; 00071 00072 /* Now check if the caller wanted write access */ 00073 if (flProtect == PAGE_READWRITE) 00074 { 00075 /* Give it */ 00076 DesiredAccess |= SECTION_MAP_WRITE; 00077 } 00078 else if (flProtect == PAGE_EXECUTE_READWRITE) 00079 { 00080 /* Give it */ 00081 DesiredAccess |= (SECTION_MAP_WRITE | SECTION_MAP_EXECUTE); 00082 } 00083 else if (flProtect == PAGE_EXECUTE_READ) 00084 { 00085 /* Give it */ 00086 DesiredAccess |= SECTION_MAP_EXECUTE; 00087 } 00088 else if ((flProtect != PAGE_READONLY) && (flProtect != PAGE_WRITECOPY)) 00089 { 00090 SetLastError(ERROR_INVALID_PARAMETER); 00091 return NULL; 00092 } 00093 00094 /* Now check if we got a name */ 00095 if (lpName) RtlInitUnicodeString(&SectionName, lpName); 00096 00097 /* Now convert the object attributes */ 00098 ObjectAttributes = BaseFormatObjectAttributes(&LocalAttributes, 00099 lpFileMappingAttributes, 00100 lpName ? &SectionName : NULL); 00101 00102 /* Check if we got a size */ 00103 if (dwMaximumSizeLow || dwMaximumSizeHigh) 00104 { 00105 /* Use a LARGE_INTEGER and convert */ 00106 SectionSize = &LocalSize; 00107 SectionSize->LowPart = dwMaximumSizeLow; 00108 SectionSize->HighPart = dwMaximumSizeHigh; 00109 } 00110 00111 /* Make sure the handle is valid */ 00112 if (hFile == INVALID_HANDLE_VALUE) 00113 { 00114 /* It's not, we'll only go on if we have a size */ 00115 hFile = NULL; 00116 if (!SectionSize) 00117 { 00118 /* No size, so this isn't a valid non-mapped section */ 00119 SetLastError(ERROR_INVALID_PARAMETER); 00120 return NULL; 00121 } 00122 } 00123 00124 /* Now create the actual section */ 00125 Status = NtCreateSection(&SectionHandle, 00126 DesiredAccess, 00127 ObjectAttributes, 00128 SectionSize, 00129 flProtect, 00130 Attributes, 00131 hFile); 00132 if (!NT_SUCCESS(Status)) 00133 { 00134 /* We failed */ 00135 BaseSetLastNTError(Status); 00136 return NULL; 00137 } 00138 else if (Status == STATUS_OBJECT_NAME_EXISTS) 00139 { 00140 SetLastError(ERROR_ALREADY_EXISTS); 00141 } 00142 else 00143 { 00144 SetLastError(ERROR_SUCCESS); 00145 } 00146 00147 /* Return the section */ 00148 return SectionHandle; 00149 } 00150 00151 /* 00152 * @implemented 00153 */ 00154 LPVOID 00155 NTAPI 00156 MapViewOfFileEx(HANDLE hFileMappingObject, 00157 DWORD dwDesiredAccess, 00158 DWORD dwFileOffsetHigh, 00159 DWORD dwFileOffsetLow, 00160 SIZE_T dwNumberOfBytesToMap, 00161 LPVOID lpBaseAddress) 00162 { 00163 NTSTATUS Status; 00164 LARGE_INTEGER SectionOffset; 00165 SIZE_T ViewSize; 00166 ULONG Protect; 00167 LPVOID ViewBase; 00168 00169 /* Convert the offset */ 00170 SectionOffset.LowPart = dwFileOffsetLow; 00171 SectionOffset.HighPart = dwFileOffsetHigh; 00172 00173 /* Save the size and base */ 00174 ViewBase = lpBaseAddress; 00175 ViewSize = dwNumberOfBytesToMap; 00176 00177 /* Convert flags to NT Protection Attributes */ 00178 if (dwDesiredAccess == FILE_MAP_COPY) 00179 { 00180 Protect = PAGE_WRITECOPY; 00181 } 00182 else if (dwDesiredAccess & FILE_MAP_WRITE) 00183 { 00184 Protect = (dwDesiredAccess & FILE_MAP_EXECUTE) ? 00185 PAGE_EXECUTE_READWRITE : PAGE_READWRITE; 00186 } 00187 else if (dwDesiredAccess & FILE_MAP_READ) 00188 { 00189 Protect = (dwDesiredAccess & FILE_MAP_EXECUTE) ? 00190 PAGE_EXECUTE_READ : PAGE_READONLY; 00191 } 00192 else 00193 { 00194 Protect = PAGE_NOACCESS; 00195 } 00196 00197 /* Map the section */ 00198 Status = NtMapViewOfSection(hFileMappingObject, 00199 NtCurrentProcess(), 00200 &ViewBase, 00201 0, 00202 0, 00203 &SectionOffset, 00204 &ViewSize, 00205 ViewShare, 00206 0, 00207 Protect); 00208 if (!NT_SUCCESS(Status)) 00209 { 00210 /* We failed */ 00211 BaseSetLastNTError(Status); 00212 return NULL; 00213 } 00214 00215 /* Return the base */ 00216 return ViewBase; 00217 } 00218 00219 /* 00220 * @implemented 00221 */ 00222 LPVOID 00223 NTAPI 00224 MapViewOfFile(HANDLE hFileMappingObject, 00225 DWORD dwDesiredAccess, 00226 DWORD dwFileOffsetHigh, 00227 DWORD dwFileOffsetLow, 00228 SIZE_T dwNumberOfBytesToMap) 00229 { 00230 /* Call the extended API */ 00231 return MapViewOfFileEx(hFileMappingObject, 00232 dwDesiredAccess, 00233 dwFileOffsetHigh, 00234 dwFileOffsetLow, 00235 dwNumberOfBytesToMap, 00236 NULL); 00237 } 00238 00239 /* 00240 * @implemented 00241 */ 00242 BOOL 00243 NTAPI 00244 UnmapViewOfFile(LPCVOID lpBaseAddress) 00245 { 00246 NTSTATUS Status; 00247 00248 /* Unmap the section */ 00249 Status = NtUnmapViewOfSection(NtCurrentProcess(), (PVOID)lpBaseAddress); 00250 if (!NT_SUCCESS(Status)) 00251 { 00252 /* Check if the pages were protected */ 00253 if (Status == STATUS_INVALID_PAGE_PROTECTION) 00254 { 00255 /* Flush the region if it was a "secure memory cache" */ 00256 if (RtlFlushSecureMemoryCache((PVOID)lpBaseAddress, 0)) 00257 { 00258 /* Now try to unmap again */ 00259 Status = NtUnmapViewOfSection(NtCurrentProcess(), (PVOID)lpBaseAddress); 00260 if (NT_SUCCESS(Status)) return TRUE; 00261 } 00262 } 00263 00264 /* We failed */ 00265 BaseSetLastNTError(Status); 00266 return FALSE; 00267 } 00268 00269 /* Otherwise, return sucess */ 00270 return TRUE; 00271 } 00272 00273 /* 00274 * @implemented 00275 */ 00276 HANDLE 00277 NTAPI 00278 OpenFileMappingA(IN DWORD dwDesiredAccess, 00279 IN BOOL bInheritHandle, 00280 IN LPCSTR lpName) 00281 { 00282 ConvertOpenWin32AnsiObjectApiToUnicodeApi(FileMapping, dwDesiredAccess, bInheritHandle, lpName); 00283 } 00284 00285 /* 00286 * @implemented 00287 */ 00288 /* FIXME: Convert to the new macros */ 00289 HANDLE 00290 NTAPI 00291 OpenFileMappingW(IN DWORD dwDesiredAccess, 00292 IN BOOL bInheritHandle, 00293 IN LPCWSTR lpName) 00294 { 00295 NTSTATUS Status; 00296 HANDLE SectionHandle; 00297 OBJECT_ATTRIBUTES ObjectAttributes; 00298 UNICODE_STRING UnicodeName; 00299 00300 /* We need a name */ 00301 if (!lpName) 00302 { 00303 /* Otherwise, fail */ 00304 SetLastError(ERROR_INVALID_PARAMETER); 00305 return NULL; 00306 } 00307 00308 /* Convert attributes */ 00309 RtlInitUnicodeString(&UnicodeName, lpName); 00310 InitializeObjectAttributes(&ObjectAttributes, 00311 &UnicodeName, 00312 (bInheritHandle ? OBJ_INHERIT : 0), 00313 BaseGetNamedObjectDirectory(), 00314 NULL); 00315 00316 /* Convert COPY to READ */ 00317 if (dwDesiredAccess == FILE_MAP_COPY) 00318 { 00319 /* Fixup copy */ 00320 dwDesiredAccess = SECTION_MAP_READ; 00321 } 00322 else if (dwDesiredAccess & FILE_MAP_EXECUTE) 00323 { 00324 /* Fixup execute */ 00325 dwDesiredAccess = (dwDesiredAccess & ~FILE_MAP_EXECUTE) | SECTION_MAP_EXECUTE; 00326 } 00327 00328 /* Open the section */ 00329 Status = NtOpenSection(&SectionHandle, dwDesiredAccess, &ObjectAttributes); 00330 if (!NT_SUCCESS(Status)) 00331 { 00332 /* We failed */ 00333 BaseSetLastNTError(Status); 00334 return NULL; 00335 } 00336 00337 /* Otherwise, return the handle */ 00338 return SectionHandle; 00339 } 00340 00341 /* 00342 * @implemented 00343 */ 00344 BOOL 00345 NTAPI 00346 FlushViewOfFile(IN LPCVOID lpBaseAddress, 00347 IN SIZE_T dwNumberOfBytesToFlush) 00348 { 00349 SIZE_T NumberOfBytesToFlush; 00350 NTSTATUS Status; 00351 IO_STATUS_BLOCK IoStatusBlock; 00352 00353 /* Save amount of bytes to flush to a local var */ 00354 NumberOfBytesToFlush = dwNumberOfBytesToFlush; 00355 00356 /* Flush the view */ 00357 Status = NtFlushVirtualMemory(NtCurrentProcess(), 00358 (LPVOID)lpBaseAddress, 00359 &NumberOfBytesToFlush, 00360 &IoStatusBlock); 00361 if (!NT_SUCCESS(Status) && (Status != STATUS_NOT_MAPPED_DATA)) 00362 { 00363 /* We failed */ 00364 BaseSetLastNTError(Status); 00365 return FALSE; 00366 } 00367 00368 /* Return success */ 00369 return TRUE; 00370 } 00371 00372 /* EOF */ Generated on Sun May 27 2012 04:24:26 for ReactOS by
1.7.6.1
|