- Timestamp:
- Aug 25, 1999, 12:28:41 PM (26 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/HandleManager.cpp
r673 r678 1 /* $Id: HandleManager.cpp,v 1.1 4 1999-08-25 08:55:17 phallerExp $ */1 /* $Id: HandleManager.cpp,v 1.15 1999-08-25 10:28:39 sandervl Exp $ */ 2 2 3 3 /* … … 2279 2279 /* call the device handler */ 2280 2280 rc = pDeviceHandler->OpenFileMapping(&TabWin32Handles[iIndexNew].hmHandleData, 2281 2281 fdwAccess, 2282 2282 fInherit, 2283 2283 lpName); … … 2290 2290 2291 2291 return iIndexNew; /* return valid handle */ 2292 }2293 2294 2295 /*****************************************************************************2296 * Name : HMMapViewOfFile2297 * Purpose : router function for MapViewOfFile2298 * Parameters:2299 * Variables :2300 * Result :2301 * Remark :2302 * Status :2303 *2304 * Author : Patrick Haller [Wed, 1999/06/17 20:44]2305 *****************************************************************************/2306 2307 LPVOID HMMapViewOfFile(HANDLE hFileMappingObject,2308 DWORD dwDesiredAccess,2309 DWORD dwFileOffsetHigh,2310 DWORD dwFileOffsetLow,2311 DWORD dwNumberOfBytesToMap)2312 {2313 int iIndex; /* index into the handle table */2314 LPVOID lpResult; /* result from the device handler's API */2315 PHMHANDLE pHMHandle; /* pointer to the handle structure in the table */2316 2317 /* validate handle */2318 iIndex = _HMHandleQuery(hFileMappingObject); /* get the index */2319 if (-1 == iIndex) /* error ? */2320 {2321 SetLastError(ERROR_INVALID_HANDLE); /* set win32 error information */2322 return (NULL); /* signal failure */2323 }2324 2325 pHMHandle = &TabWin32Handles[iIndex]; /* call device handler */2326 lpResult = pHMHandle->pDeviceHandler->MapViewOfFile(&pHMHandle->hmHandleData,2327 dwDesiredAccess,2328 dwFileOffsetHigh,2329 dwFileOffsetLow,2330 dwNumberOfBytesToMap);2331 2332 return (lpResult); /* deliver return code */2333 2292 } 2334 2293 … … 2376 2335 } 2377 2336 2378 2379 /*****************************************************************************2380 * Name : HMUnmapViewOfFile2381 * Purpose : router function for UnmapViewOfFile2382 * Parameters:2383 * Variables :2384 * Result :2385 * Remark :2386 * Status :2387 *2388 * Author : Patrick Haller [Wed, 1999/06/17 20:44]2389 *****************************************************************************/2390 2391 BOOL HMUnmapViewOfFile(LPVOID lpBaseAddress)2392 {2393 int iIndex; /* index into the handle table */2394 BOOL bResult; /* result from the device handler's API */2395 PHMHANDLE pHMHandle; /* pointer to the handle structure in the table */2396 2397 /* validate handle */2398 iIndex = HMDeviceMemMapClass::findByBaseAddress(lpBaseAddress);2399 if (-1 == iIndex) /* error ? */2400 {2401 SetLastError(ERROR_INVALID_HANDLE); /* set win32 error information */2402 return (NULL); /* signal failure */2403 }2404 2405 bResult = pHMHandle->pDeviceHandler->UnmapViewOfFile(&pHMHandle->hmHandleData,2406 lpBaseAddress);2407 2408 return (bResult); /* deliver return code */2409 }2410 2411 2412 /*****************************************************************************2413 * Name : HMFlushViewOfFile2414 * Purpose : router function for FlushViewOfFile2415 * Parameters:2416 * Variables :2417 * Result :2418 * Remark :2419 * Status :2420 *2421 * Author : Patrick Haller [Wed, 1999/06/17 20:44]2422 *****************************************************************************/2423 2424 BOOL HMFlushViewOfFile(LPVOID lpBaseAddress,2425 DWORD dwNumberOfBytesToFlush)2426 {2427 int iIndex; /* index into the handle table */2428 BOOL bResult; /* result from the device handler's API */2429 PHMHANDLE pHMHandle; /* pointer to the handle structure in the table */2430 2431 /* validate handle */2432 iIndex = HMDeviceMemMapClass::findByBaseAddress(lpBaseAddress);2433 if (-1 == iIndex) /* error ? */2434 {2435 SetLastError(ERROR_INVALID_HANDLE); /* set win32 error information */2436 return (NULL); /* signal failure */2437 }2438 2439 bResult = pHMHandle->pDeviceHandler->FlushViewOfFile(&pHMHandle->hmHandleData,2440 lpBaseAddress,2441 dwNumberOfBytesToFlush);2442 2443 return (bResult); /* deliver return code */2444 }2445 2446 2447 2448 2337 /***************************************************************************** 2449 2338 * Name : HMWaitForMultipleObjects -
trunk/src/kernel32/exceptions.cpp
r634 r678 1 /* $Id: exceptions.cpp,v 1.1 1 1999-08-22 22:11:21sandervl Exp $ */1 /* $Id: exceptions.cpp,v 1.12 1999-08-25 10:28:40 sandervl Exp $ */ 2 2 3 3 /* … … 56 56 #include "exceptions.h" 57 57 #include "exceptutil.h" 58 #include "misc.h" 58 #include <misc.h> 59 #include "mmap.h" 59 60 60 61 //Global Process Unhandled exception filter … … 873 874 switch(pERepRec->ExceptionNum) 874 875 { 875 876 877 878 879 880 881 882 883 884 885 886 887 888 return (XCPT_CONTINUE_EXECUTION);889 890 891 892 SetExceptionChain((ULONG)0);893 return (XCPT_CONTINUE_SEARCH);876 case XCPT_FLOAT_DENORMAL_OPERAND: 877 case XCPT_FLOAT_DIVIDE_BY_ZERO: 878 case XCPT_FLOAT_INEXACT_RESULT: 879 case XCPT_FLOAT_INVALID_OPERATION: 880 case XCPT_FLOAT_OVERFLOW: 881 case XCPT_FLOAT_STACK_CHECK: 882 case XCPT_FLOAT_UNDERFLOW: 883 dprintf(("KERNEL32: OS2ExceptionHandler: FPU exception, fix and continue\n")); 884 pCtxRec->ctx_env[0] |= 0x1F; 885 pCtxRec->ctx_stack[0].losig = 0; 886 pCtxRec->ctx_stack[0].hisig = 0; 887 pCtxRec->ctx_stack[0].signexp = 0; 888 889 return (XCPT_CONTINUE_EXECUTION); 890 891 case XCPT_PROCESS_TERMINATE: 892 case XCPT_ASYNC_PROCESS_TERMINATE: 893 SetExceptionChain((ULONG)0); 894 return (XCPT_CONTINUE_SEARCH); 894 895 895 896 case XCPT_ACCESS_VIOLATION: 897 { 898 Win32MemMap *map; 899 900 if(pERepRec->ExceptionInfo[1] == 0 && pERepRec->ExceptionInfo[1] == XCPT_DATA_UNKNOWN) { 901 goto continueFail; 902 } 903 map = Win32MemMap::findMap(pERepRec->ExceptionInfo[0]); 904 if(map == NULL) { 905 goto continueFail; 906 } 907 switch(pERepRec->ExceptionInfo[0]) { 908 case XCPT_READ_ACCESS: 909 if(map->hasReadAccess() == FALSE) { 910 goto continueFail; 911 } 912 break; 913 case XCPT_WRITE_ACCESS: 914 if(map->hasWriteAccess() == FALSE) { 915 goto continueFail; 916 } 917 break; 918 case XCPT_EXECUTE_ACCESS: 919 if(map->hasExecuteAccess() == FALSE) { 920 goto continueFail; 921 } 922 break; 923 default: 924 goto continueFail; 925 } 926 //Might want to consider mapping more than one page if access is at 927 //a high offset in the page 928 if(map->commitPage((LPVOID)pERepRec->ExceptionInfo[1], 1) == TRUE) 929 return (XCPT_CONTINUE_EXECUTION); 930 931 //no break; 932 } 933 continueFail: 934 896 935 case XCPT_BREAKPOINT: 897 936 case XCPT_ARRAY_BOUNDS_EXCEEDED: … … 907 946 case XCPT_IN_PAGE_ERROR: 908 947 case XCPT_SIGNAL: 909 dprintf(("KERNEL32: OS2ExceptionHandler: Continue and kill\n"));910 pCtxRec->ctx_RegEip = (ULONG)KillWin32Process;911 pCtxRec->ctx_RegEsp = pCtxRec->ctx_RegEsp + 0x10;912 pCtxRec->ctx_RegEax = pERepRec->ExceptionNum;913 pCtxRec->ctx_RegEbx = pCtxRec->ctx_RegEip;914 return (XCPT_CONTINUE_EXECUTION);948 dprintf(("KERNEL32: OS2ExceptionHandler: Continue and kill\n")); 949 pCtxRec->ctx_RegEip = (ULONG)KillWin32Process; 950 pCtxRec->ctx_RegEsp = pCtxRec->ctx_RegEsp + 0x10; 951 pCtxRec->ctx_RegEax = pERepRec->ExceptionNum; 952 pCtxRec->ctx_RegEbx = pCtxRec->ctx_RegEip; 953 return (XCPT_CONTINUE_EXECUTION); 915 954 916 955 default: //non-continuable exceptions -
trunk/src/kernel32/hmdevice.cpp
r673 r678 1 /* $Id: hmdevice.cpp,v 1. 5 1999-08-25 08:55:18 phallerExp $ */1 /* $Id: hmdevice.cpp,v 1.6 1999-08-25 10:28:40 sandervl Exp $ */ 2 2 3 3 /* … … 983 983 dprintf(("KERNEL32: HandleManager::DeviceHandler::OpenFileMapping(%08xh,%08xh,%08xh,%08xh)\n", 984 984 pHMHandleData->hHMHandle, 985 985 fdwAccess, 986 986 fInherit, 987 987 lpName)); … … 1006 1006 *****************************************************************************/ 1007 1007 1008 LPVOID HMDeviceHandler::MapViewOfFile (PHMHANDLEDATA pHMHandleData,1008 LPVOID HMDeviceHandler::MapViewOfFileEx(PHMHANDLEDATA pHMHandleData, 1009 1009 DWORD dwDesiredAccess, 1010 1010 DWORD dwFileOffsetHigh, 1011 1011 DWORD dwFileOffsetLow, 1012 DWORD dwNumberOfBytesToMap) 1013 { 1014 dprintf(("KERNEL32: HandleManager::DeviceHandler::MapViewOfFile(%08xh,%08xh,%08xh,%08xh,%08xh)\n", 1015 pHMHandleData->hHMHandle, 1016 dwDesiredAccess, 1017 dwFileOffsetHigh, 1018 dwFileOffsetLow, 1019 dwNumberOfBytesToMap)); 1020 1021 return(NULL); 1022 } 1023 1024 1025 /***************************************************************************** 1026 * Name : DWORD HMDeviceHandler::MapViewOfFileEx 1027 * Purpose : map memory mapped file 1028 * Parameters: PHMHANDLEDATA pHMHandleData 1029 * DWORD dwDesiredAccess, 1030 * DWORD dwFileOffsetHigh, 1031 * DWORD dwFileOffsetLow, 1032 * DWORD dwNumberOfBytesToMap 1033 * LPVOID lpBaseAddress 1034 * Variables : 1035 * Result : address to memory mapped region 1036 * Remark : 1037 * Status : 1038 * 1039 * Author : Patrick Haller [Wed, 1999/06/17 20:44] 1040 *****************************************************************************/ 1041 1042 LPVOID HMDeviceHandler::MapViewOfFileEx(PHMHANDLEDATA pHMHandleData, 1043 DWORD dwDesiredAccess, 1044 DWORD dwFileOffsetHigh, 1045 DWORD dwFileOffsetLow, 1046 DWORD dwNumberOfBytesToMap, 1047 LPVOID lpBaseAddress) 1012 DWORD dwNumberOfBytesToMap, 1013 LPVOID lpBaseAddress) 1048 1014 { 1049 1015 dprintf(("KERNEL32: HandleManager::DeviceHandler::MapViewOfFileEx(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n", … … 1056 1022 return(NULL); 1057 1023 } 1058 1059 1060 /*****************************************************************************1061 * Name : DWORD HMDeviceHandler::UnmapViewOfFile1062 * Purpose : map memory mapped file1063 * Parameters: PHMHANDLEDATA pHMHandleData1064 * LPVOID lpBaseAddress1065 * Variables :1066 * Result : address to memory mapped region1067 * Remark :1068 * Status :1069 *1070 * Author : Patrick Haller [Wed, 1999/06/17 20:44]1071 *****************************************************************************/1072 1073 BOOL HMDeviceHandler::UnmapViewOfFile(PHMHANDLEDATA pHMHandleData,1074 LPVOID lpBaseAddress)1075 {1076 dprintf(("KERNEL32: HandleManager::DeviceHandler::UnmapViewOfFile(%08xh,%08xh)\n",1077 pHMHandleData->hHMHandle,1078 lpBaseAddress));1079 1080 return(FALSE);1081 }1082 1083 1084 /*****************************************************************************1085 * Name : DWORD HMDeviceHandler::FlushViewOfFile1086 * Purpose : map memory mapped file1087 * Parameters: PHMHANDLEDATA pHMHandleData1088 * LPVOID lpBaseAddress1089 * DWORD dwNumberOfBytesToFlush1090 * Variables :1091 * Result : address to memory mapped region1092 * Remark :1093 * Status :1094 *1095 * Author : Patrick Haller [Wed, 1999/06/17 20:44]1096 *****************************************************************************/1097 1098 BOOL HMDeviceHandler::FlushViewOfFile(PHMHANDLEDATA pHMHandleData,1099 LPVOID lpBaseAddress,1100 DWORD dwNumberOfBytesToFlush)1101 {1102 dprintf(("KERNEL32: HandleManager::DeviceHandler::FlushViewOfFile(%08xh,%08xh,%08xh)\n",1103 pHMHandleData->hHMHandle,1104 lpBaseAddress,1105 dwNumberOfBytesToFlush));1106 1107 return(FALSE);1108 }1109 -
trunk/src/kernel32/hmdevice.h
r673 r678 1 /* $Id: hmdevice.h,v 1. 6 1999-08-25 08:55:18 phallerExp $ */1 /* $Id: hmdevice.h,v 1.7 1999-08-25 10:28:40 sandervl Exp $ */ 2 2 3 3 /* … … 25 25 *****************************************************************************/ 26 26 27 #define HMTYPE_UNKNOWN 28 #define HMTYPE_MEMMAP 27 #define HMTYPE_UNKNOWN 0 28 #define HMTYPE_MEMMAP 1 29 29 //..... 30 30 … … 232 232 ***************************************************************************/ 233 233 234 /* this is a handler method for calls to CreateSemaphore() */234 /* this is a handler method for calls to CreateSemaphore() */ 235 235 virtual DWORD CreateSemaphore (PHMHANDLEDATA pHMHandleData, 236 236 LPSECURITY_ATTRIBUTES lpsa, … … 239 239 LPCSTR lpszSemaphoreName); 240 240 241 /* this is a handler method for calls to OpenSemaphore() */241 /* this is a handler method for calls to OpenSemaphore() */ 242 242 virtual DWORD OpenSemaphore (PHMHANDLEDATA pHMHandleData, 243 243 BOOL fInheritHandle, 244 244 LPCSTR lpszSemaphoreName); 245 245 246 /* this is a handle method for calls to ReleaseSemaphore() */246 /* this is a handle method for calls to ReleaseSemaphore() */ 247 247 virtual BOOL ReleaseSemaphore(PHMHANDLEDATA pHMHandleData, 248 248 LONG cReleaseCount, … … 260 260 /* this is a handler method for calls to OpenFileMapping() */ 261 261 virtual DWORD OpenFileMapping (PHMHANDLEDATA pHMHandleData, 262 262 DWORD access, /* [in] Access mode */ 263 263 BOOL fInherit, 264 264 LPCSTR lpName); 265 265 266 /* this is a handler method for calls to MapViewOfFile() */ 267 virtual LPVOID MapViewOfFile (PHMHANDLEDATA pHMHandleData, 268 DWORD dwDesiredAccess, 269 DWORD dwFileOffsetHigh, 270 DWORD dwFileOffsetLow, 271 DWORD dwNumberOfBytesToMap); 272 273 /* this is a handler method for calls to MapViewOfFileEx() */ 266 /* this is a handler method for calls to MapViewOfFileEx() */ 274 267 virtual LPVOID MapViewOfFileEx (PHMHANDLEDATA pHMHandleData, 275 268 DWORD dwDesiredAccess, … … 277 270 DWORD dwFileOffsetLow, 278 271 DWORD dwNumberOfBytesToMap, 279 LPVOID lpBaseAddress); 280 281 /* this is a handler method for calls to UnmapViewOfFile() */ 282 virtual BOOL UnmapViewOfFile (PHMHANDLEDATA pHMHandleData, 283 LPVOID lpBaseAddress); 284 285 /* this is a handler method for calls to FlushViewOfFile() */ 286 virtual BOOL FlushViewOfFile (PHMHANDLEDATA pHMHandleData, 287 LPVOID lpBaseAddress, 288 DWORD dwNumberOfBytesToFlush); 272 LPVOID lpBaseAddress); 289 273 290 274 }; -
trunk/src/kernel32/hmmmap.cpp
r675 r678 1 /* $Id: hmmmap.cpp,v 1. 3 1999-08-25 10:23:34 phallerExp $ */1 /* $Id: hmmmap.cpp,v 1.4 1999-08-25 10:28:40 sandervl Exp $ */ 2 2 3 3 /* … … 47 47 //****************************************************************************** 48 48 DWORD HMDeviceMemMapClass::CreateFileMapping(PHMHANDLEDATA pHMHandleData, 49 HFILE hFile, 49 HFILE hFile, 50 50 SECURITY_ATTRIBUTES *sa, /* [in] Optional security attributes*/ 51 51 DWORD protect, /* [in] Protection for mapping object */ 52 52 DWORD size_high, /* [in] High-order 32 bits of object size */ 53 53 DWORD size_low, /* [in] Low-order 32 bits of object size */ 54 LPCSTR name) /* [in] Name of file-mapping object */ 54 LPCSTR name) /* [in] Name of file-mapping object */ 55 55 { 56 Win32MemMap *map; 57 58 dprintf(("KERNEL32::HMDeviceMemMapClass::CreateFileMapping(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%s)\n", 59 pHMHandleData, 60 hFile, 61 sa, 62 protect, 63 size_high, 64 size_low, 65 name)); 56 Win32MemMap *map; 66 57 67 58 if((hFile == -1 && size_low == 0) || size_high || 68 59 protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|SEC_COMMIT|SEC_IMAGE|SEC_RESERVE|SEC_NOCACHE) || 69 ((protect & SEC_COMMIT) && (protect & SEC_RESERVE))) 60 (protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY)) == 0 || 61 (hFile == -1 && (protect & SEC_COMMIT)) || 62 ((protect & SEC_COMMIT) && (protect & SEC_RESERVE))) 70 63 { 71 64 … … 79 72 dprintf(("CreateFileMappingA: can't create Win32MemMap object!")); 80 73 return ERROR_OUTOFMEMORY; 81 } 74 } 82 75 83 76 if(map->Init(pHMHandleData->hHMHandle) == FALSE) { … … 97 90 LPCSTR name ) /* [in] Name of file-mapping object */ 98 91 { 99 Win32MemMap *map; 100 DWORD protflags; 101 102 dprintf(("KERNEL32::HMDeviceMemMapClass::OpenFileMapping(%08xh,%08xh,%08xh,%08xh\n", 103 pHMHandleData, 104 access, 105 inherit, 106 name)); 107 92 Win32MemMap *map; 93 DWORD protflags; 108 94 109 95 if(name == NULL) … … 171 157 //****************************************************************************** 172 158 //****************************************************************************** 173 LPVOID HMDeviceMemMapClass::MapViewOfFile(PHMHANDLEDATA pHMHandleData,174 DWORD dwDesiredAccess,175 DWORD dwFileOffsetHigh,176 DWORD dwFileOffsetLow,177 DWORD dwNumberOfBytesToMap)178 {179 dprintf(("KERNEL32: HMDeviceMemMapClass::MapViewOfFile(%08xh,%08xh,%08xh,%08xh,%08xh)\n",180 pHMHandleData->hHMHandle,181 dwDesiredAccess,182 dwFileOffsetHigh,183 dwFileOffsetLow,184 dwNumberOfBytesToMap));185 186 return MapViewOfFileEx(pHMHandleData,187 dwDesiredAccess,188 dwFileOffsetHigh,189 dwFileOffsetLow,190 dwNumberOfBytesToMap,191 NULL);192 }193 194 //******************************************************************************195 //******************************************************************************196 159 DWORD HMDeviceMemMapClass::CloseHandle(PHMHANDLEDATA pHMHandleData) 197 160 { 198 161 Win32MemMap *map; 199 162 200 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) 201 { 202 dprintf(("KERNEL32: HMDeviceMemMapClass:MapViewOfFileEx: invalid handle data!")); 203 return ERROR_INVALID_HANDLE; 163 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) { 164 dprintf(("MapViewOfFileEx: invalid handle data!")); 165 return ERROR_INVALID_HANDLE; 204 166 } 205 167 map = (Win32MemMap *)pHMHandleData->dwUserData; … … 210 172 //****************************************************************************** 211 173 //****************************************************************************** 212 213 214 /*****************************************************************************215 * Name : DWORD HMDeviceHandler::findByBaseAddress216 * Purpose : identify a memmap object by its base address217 * Parameters: LPVOID lpBaseAddress218 * Variables :219 * Result : PHMHANDLEDATA pHMHandleData220 * Remark :221 * Status :222 *223 * Author : Patrick Haller [Wed, 1999/06/17 20:44]224 *****************************************************************************/225 226 int HMDeviceMemMapClass::findByBaseAddress(LPVOID lpBaseAddress)227 {228 dprintf(("KERNEL32: HMDeviceMemMapClass::findByBaseAddress(%08xh) not implemented\n",229 lpBaseAddress));230 231 return -1;232 }233 234 235 /*****************************************************************************236 * Name : DWORD HMDeviceHandler::UnmapViewOfFile237 * Purpose : map memory mapped file238 * Parameters: PHMHANDLEDATA pHMHandleData239 * LPVOID lpBaseAddress240 * Variables :241 * Result : address to memory mapped region242 * Remark :243 * Status :244 *245 * Author : Patrick Haller [Wed, 1999/06/17 20:44]246 *****************************************************************************/247 248 BOOL HMDeviceMemMapClass::UnmapViewOfFile(PHMHANDLEDATA pHMHandleData,249 LPVOID lpBaseAddress)250 {251 dprintf(("KERNEL32: HMDeviceMemMapClass::UnmapViewOfFile(%08xh,%08xh) not implemented\n",252 pHMHandleData->hHMHandle,253 lpBaseAddress));254 255 return(FALSE);256 }257 258 259 /*****************************************************************************260 * Name : DWORD HMDeviceHandler::FlushViewOfFile261 * Purpose : map memory mapped file262 * Parameters: PHMHANDLEDATA pHMHandleData263 * LPVOID lpBaseAddress264 * DWORD dwNumberOfBytesToFlush265 * Variables :266 * Result : address to memory mapped region267 * Remark :268 * Status :269 *270 * Author : Patrick Haller [Wed, 1999/06/17 20:44]271 *****************************************************************************/272 273 BOOL HMDeviceMemMapClass::FlushViewOfFile(PHMHANDLEDATA pHMHandleData,274 LPVOID lpBaseAddress,275 DWORD dwNumberOfBytesToFlush)276 {277 dprintf(("KERNEL32: HMDeviceMemMapClass::FlushViewOfFile(%08xh,%08xh,%08xh) not implemented\n",278 pHMHandleData->hHMHandle,279 lpBaseAddress,280 dwNumberOfBytesToFlush));281 282 return(FALSE);283 }284 285 -
trunk/src/kernel32/hmmmap.h
r673 r678 1 /* $Id: hmmmap.h,v 1. 2 1999-08-25 08:55:19 phallerExp $ */1 /* $Id: hmmmap.h,v 1.3 1999-08-25 10:28:40 sandervl Exp $ */ 2 2 3 3 /* … … 34 34 HMDeviceMemMapClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName) {} 35 35 36 // identify a memmap object by its base address37 static int findByBaseAddress(LPVOID lpBaseAddress);38 39 40 36 /* this is a handler method for calls to CreateFileMapping() */ 41 37 virtual DWORD CreateFileMapping (PHMHANDLEDATA pHMHandleData, … … 49 45 /* this is a handler method for calls to OpenFileMapping() */ 50 46 virtual DWORD OpenFileMapping (PHMHANDLEDATA pHMHandleData, 51 47 DWORD access, /* [in] Access mode */ 52 48 BOOL fInherit, 53 49 LPCSTR lpName); 54 50 55 51 /* this is a handler method for calls to MapViewOfFile() */ 56 virtual LPVOID MapViewOfFile (PHMHANDLEDATA pHMHandleData,57 DWORD dwDesiredAccess,58 DWORD dwFileOffsetHigh,59 DWORD dwFileOffsetLow,60 DWORD dwNumberOfBytesToMap);61 62 /* this is a handler method for calls to MapViewOfFileEx() */63 52 virtual LPVOID MapViewOfFileEx (PHMHANDLEDATA pHMHandleData, 64 53 DWORD dwDesiredAccess, … … 66 55 DWORD dwFileOffsetLow, 67 56 DWORD dwNumberOfBytesToMap, 68 57 LPVOID lpBaseAddress); 69 58 70 /* this is a handler method for calls to UnmapViewOfFile() */71 virtual BOOL UnmapViewOfFile (PHMHANDLEDATA pHMHandleData,72 LPVOID lpBaseAddress);73 74 /* this is a handler method for calls to FlushViewOfFile() */75 virtual BOOL FlushViewOfFile (PHMHANDLEDATA pHMHandleData,76 LPVOID lpBaseAddress,77 DWORD dwNumberOfBytesToFlush);78 79 80 /* this is a handler method for calls to CloseHandle() */81 59 virtual DWORD CloseHandle(PHMHANDLEDATA pHMHandleData); 82 60 }; -
trunk/src/kernel32/makefile
r664 r678 1 # $Id: makefile,v 1. 29 1999-08-24 18:46:39sandervl Exp $1 # $Id: makefile,v 1.30 1999-08-25 10:28:40 sandervl Exp $ 2 2 3 3 # … … 121 121 exceptions.OBJ: \ 122 122 .\exceptions.cpp \ 123 mmap.h \ 123 124 $(PDWIN32_INCLUDE)\exceptions.h \ 124 125 exceptutil.h … … 148 149 $(PDWIN32_INCLUDE)\wprocess.h \ 149 150 console2.h \ 151 mmap.h \ 150 152 cio.h \ 151 153 os2util.h -
trunk/src/kernel32/mmap.cpp
r664 r678 1 /* $Id: mmap.cpp,v 1. 8 1999-08-24 18:46:40 sandervl Exp $ */1 /* $Id: mmap.cpp,v 1.9 1999-08-25 10:28:40 sandervl Exp $ */ 2 2 3 3 /* … … 18 18 * 19 19 * TODO: Handles returned should be usable by all apis that accept file handles 20 * TODO: Sharing memory mapped files between multiple processes 20 21 * 21 22 * Project Odin Software License can be found in LICENSE.TXT … … 115 116 //****************************************************************************** 116 117 //****************************************************************************** 118 BOOL Win32MemMap::hasReadAccess() 119 { 120 return TRUE; //should have at least this 121 } 122 //****************************************************************************** 123 //****************************************************************************** 124 BOOL Win32MemMap::hasWriteAccess() 125 { 126 return !(mProtFlags & PAGE_READONLY); 127 } 128 //****************************************************************************** 129 //Might want to add this feature for memory mapping executable & dll files in 130 //the loader (done in Win32 with the SEC_IMAGE flag?) 131 //****************************************************************************** 132 BOOL Win32MemMap::hasExecuteAccess() 133 { 134 return FALSE; 135 } 136 //****************************************************************************** 137 //****************************************************************************** 138 BOOL Win32MemMap::commitPage(LPVOID lpPageFaultAddr, ULONG nrpages) 139 { 140 DWORD pageAddr = (DWORD)lpPageFaultAddr & ~0xFFF; 141 DWORD oldProt, newProt, nrBytesRead, offset, size; 142 143 // mapMutex.enter(); 144 newProt = mProtFlags & (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY); 145 newProt |= MEM_COMMIT; 146 147 dprintf(("Win32MemMap::commitPage %x (faultaddr %x), nr of pages %d", pageAddr, lpPageFaultAddr, nrpages)); 148 if(VirtualProtect((LPVOID)pageAddr, nrpages*PAGE_SIZE, newProt, &oldProt) == FALSE) { 149 goto fail; 150 } 151 if(hMemFile != -1) { 152 offset = pageAddr - (ULONG)pMapping; 153 size = nrpages*PAGE_SIZE; 154 if(offset + size > mSize) { 155 size = mSize - offset; 156 } 157 if(SetFilePointer(hMemFile, offset, NULL, FILE_BEGIN) != offset) { 158 dprintf(("Win32MemMap::commitPage: SetFilePointer failed to set pos to %x", offset)); 159 goto fail; 160 } 161 if(ReadFile(hMemFile, (LPSTR)pageAddr, size, &nrBytesRead, NULL) == FALSE) { 162 dprintf(("Win32MemMap::commitPage: ReadFile failed for %x", pageAddr)); 163 goto fail; 164 } 165 if(nrBytesRead != size) { 166 dprintf(("Win32MemMap::commitPage: ReadFile didn't read all bytes for %x", pageAddr)); 167 goto fail; 168 } 169 } 170 171 // mapMutex.leave(); 172 return TRUE; 173 fail: 174 // mapMutex.leave(); 175 return FALSE; 176 } 177 //****************************************************************************** 178 //****************************************************************************** 117 179 BOOL Win32MemMap::unmapViewOfFile() 118 180 { … … 145 207 if(fdwAccess & FILE_MAP_COPY && !(mProtFlags & PAGE_WRITECOPY)) 146 208 goto parmfail; 147 209 210 //TODO: If committed, read file into memory 211 #if 0 148 212 if(mProtFlags & SEC_COMMIT) 149 213 fAlloc |= MEM_COMMIT; 214 else 150 215 if(mProtFlags & SEC_RESERVE) 151 216 fAlloc |= MEM_RESERVE; 217 #else 218 fAlloc = MEM_RESERVE; 219 #endif 152 220 153 221 if(fMapped == FALSE) {//if not mapped, reserve/commit entire view … … 179 247 { 180 248 MEMORY_BASIC_INFORMATION memInfo; 181 ULONG nrpages, nrBytesWritten ;249 ULONG nrpages, nrBytesWritten, offset, size; 182 250 int i; 183 251 184 mapMutex.enter();252 // mapMutex.enter(); 185 253 if(fMapped == FALSE) 186 254 goto parmfail; … … 204 272 memInfo.AllocationProtect & (PAGE_READWRITE|PAGE_WRITECOPY|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY)) 205 273 {//committed and allowed for writing? 206 if(WriteFile(hMemFile, (LPSTR)lpvBase+i*PAGE_SIZE, PAGE_SIZE, &nrBytesWritten, NULL) == FALSE) { 274 offset = (ULONG)lpvBase+i*PAGE_SIZE - (ULONG)pMapping; 275 size = PAGE_SIZE; 276 if(offset + size > mSize) { 277 size = mSize - offset; 278 } 279 dprintf(("Win32MemMap::flushView for offset %x, size %d", offset, size)); 280 281 if(SetFilePointer(hMemFile, offset, NULL, FILE_BEGIN) != offset) { 282 dprintf(("Win32MemMap::flushView: SetFilePointer failed to set pos to %x", offset)); 283 goto fail; 284 } 285 if(WriteFile(hMemFile, (LPSTR)lpvBase+i*PAGE_SIZE, size, &nrBytesWritten, NULL) == FALSE) { 207 286 dprintf(("Win32MemMap::flushView: WriteFile failed for %x", (ULONG)lpvBase+i*PAGE_SIZE)); 208 287 goto fail; 209 288 } 210 if(nrBytesWritten != PAGE_SIZE) {289 if(nrBytesWritten != size) { 211 290 dprintf(("Win32MemMap::flushView: WriteFile didn't write all bytes for %x", (ULONG)lpvBase+i*PAGE_SIZE)); 212 291 goto fail; … … 214 293 } 215 294 } 216 mapMutex.leave();295 // mapMutex.leave(); 217 296 return TRUE; 218 297 parmfail: 219 298 SetLastError(ERROR_INVALID_PARAMETER); 220 mapMutex.leave();299 // mapMutex.leave(); 221 300 return FALSE; 222 301 fail: 223 mapMutex.leave();302 // mapMutex.leave(); 224 303 return FALSE; 225 304 } … … 264 343 //****************************************************************************** 265 344 //****************************************************************************** 345 void Win32MemMap::deleteAll() 346 { 347 while(memmaps) { 348 CloseHandle(memmaps->hMemMap); 349 } 350 } 351 //****************************************************************************** 352 //****************************************************************************** 266 353 Win32MemMap *Win32MemMap::memmaps = NULL; -
trunk/src/kernel32/mmap.h
r664 r678 1 /* $Id: mmap.h,v 1. 6 1999-08-24 18:46:40sandervl Exp $ */1 /* $Id: mmap.h,v 1.7 1999-08-25 10:28:41 sandervl Exp $ */ 2 2 3 3 /* … … 37 37 void Release() { if(--referenced == 0) delete this; }; 38 38 39 BOOL hasReadAccess(); 40 BOOL hasWriteAccess(); 41 BOOL hasExecuteAccess(); 42 43 BOOL commitPage(LPVOID lpPageFaultAddr, ULONG nrpages); 44 39 45 static Win32MemMap *findMap(LPSTR lpszName); 40 46 static Win32MemMap *findMap(ULONG address); 47 48 //Should only be called in ExitProcess 49 static void deleteAll(); 41 50 42 51 protected: -
trunk/src/kernel32/virtual.cpp
r673 r678 1 /* $Id: virtual.cpp,v 1. 3 1999-08-25 08:55:19 phallerExp $ */1 /* $Id: virtual.cpp,v 1.4 1999-08-25 10:28:41 sandervl Exp $ */ 2 2 3 3 /* … … 19 19 #include <win\virtual.h> 20 20 #include <heapstring.h> 21 #include "mmap.h"22 21 #include <handlemanager.h> 23 22 … … 39 38 LPCSTR name /* [in] Name of file-mapping object */ ) 40 39 { 41 return HMCreateFileMapping(hFile, sa, protect, size_high, size_low, name);40 return HMCreateFileMapping(hFile, sa, protect, size_high, size_low, name); 42 41 } 43 42 … … 47 46 * See CreateFileMapping32A 48 47 */ 49 HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES attr, 50 DWORD protect, DWORD size_high, 48 HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES attr, 49 DWORD protect, DWORD size_high, 51 50 DWORD size_low, LPCWSTR name ) 52 51 { … … 72 71 LPCSTR name ) /* [in] Name of file-mapping object */ 73 72 { 74 return (HMOpenFileMapping(access, inherit, name)); 73 dprintf(("OpenFileMappingA: %x %d %s", access, inherit, name)); 74 return HMOpenFileMapping(access, inherit, name); 75 75 } 76 76 … … 103 103 DWORD offset_low, /* [in] Low-order 32 bits of file offset */ 104 104 DWORD count /* [in] Number of bytes to map */ 105 ) 106 { 107 return HMMapViewOfFile( mapping, access, offset_high,108 offset_low, count);105 ) 106 { 107 return MapViewOfFileEx( mapping, access, offset_high, 108 offset_low, count, NULL ); 109 109 } 110 110 … … 125 125 DWORD count, /* [in] Number of bytes to map */ 126 126 LPVOID addr /* [in] Suggested starting address for mapped view */ 127 ) 128 { 129 return HMMapViewOfFileEx( handle, access, offset_high, 130 offset_low, count, addr); 127 ) 128 { 129 return HMMapViewOfFileEx(handle, access, offset_high, offset_low, count, addr); 131 130 } 132 131 … … 143 142 LPCVOID base, /* [in] Start address of byte range to flush */ 144 143 DWORD cbFlush /* [in] Number of bytes in range */ 145 ) 146 { 147 return HMFlushViewOfFile( (LPVOID)base, cbFlush); 144 ) 145 { 146 dprintf(("FlushViewOfFile: NOT IMPLEMENTED")); 147 return TRUE; 148 148 } 149 149 … … 161 161 */ 162 162 BOOL WINAPI UnmapViewOfFile(LPVOID addr /* [in] Address where mapped view begins */ 163 ) 164 { 165 return HMUnmapViewOfFile( addr ); 166 } 167 163 ) 164 { 165 if (!addr) 166 { 167 SetLastError( ERROR_INVALID_PARAMETER ); 168 return FALSE; 169 } 170 return TRUE; 171 } 168 172 169 173 /*********************************************************************** … … 171 175 * 172 176 * Helper function to map a file to memory: 173 * name - file name 177 * name - file name 174 178 * [RETURN] ptr - pointer to mapped file 175 179 */ … … 179 183 LPVOID ptr = NULL; 180 184 181 hFile = CreateFileW( name, GENERIC_READ, FILE_SHARE_READ, NULL, 185 hFile = CreateFileW( name, GENERIC_READ, FILE_SHARE_READ, NULL, 182 186 OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0); 183 187 if (hFile != INVALID_HANDLE_VALUE) … … 198 202 * 199 203 * Helper function to map a file to memory: 200 * name - file name 204 * name - file name 201 205 * [RETURN] ptr - pointer to mapped file 202 206 */ … … 206 210 LPVOID ptr = NULL; 207 211 208 hFile = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, NULL, 212 hFile = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, NULL, 209 213 OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0); 210 214 if (hFile != INVALID_HANDLE_VALUE) … … 220 224 return ptr; 221 225 } 222 -
trunk/src/kernel32/wprocess.cpp
r669 r678 1 /* $Id: wprocess.cpp,v 1.2 7 1999-08-24 23:32:24 phallerExp $ */1 /* $Id: wprocess.cpp,v 1.28 1999-08-25 10:28:41 sandervl Exp $ */ 2 2 3 3 /* … … 30 30 #include "versionos2.h" /*PLF Wed 98-03-18 02:36:51*/ 31 31 #include <wprocess.h> 32 #include "mmap.h" 32 33 33 34 BOOL fExeStarted = FALSE; … … 331 332 SetOS2ExceptionChain(-1); 332 333 334 //Flush and delete all open memory mapped files 335 Win32MemMap::deleteAll(); 336 337 Win32DllExitList(0); 338 333 339 //Restore original OS/2 TIB selector 334 340 DestroyTIB(); … … 340 346 if (iConsoleIsActive()) 341 347 iConsoleWaitClose(); 342 343 Win32DllExitList(0);344 348 345 349 O32_ExitProcess(exitcode); … … 605 609 } 606 610 //****************************************************************************** 607 //NOTE: GetModuleHandleA does NOT support files with multiple dots (i.e. 611 //NOTE: GetModuleHandleA does NOT support files with multiple dots (i.e. 608 612 // very.weird.exe) 609 613 //****************************************************************************** … … 626 630 else { 627 631 if(!strstr(szModule, ".")) { 628 //if there's no extension or trainling dot, we 632 //if there's no extension or trainling dot, we 629 633 //assume it's a dll (see Win32 SDK docs) 630 634 fDllModule = TRUE;
Note:
See TracChangeset
for help on using the changeset viewer.