ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

filemap.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.