- Timestamp:
- Aug 25, 1999, 10:57:14 AM (26 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/HandleManager.cpp
r664 r673 1 /* $Id: HandleManager.cpp,v 1.1 3 1999-08-24 18:46:38 sandervlExp $ */1 /* $Id: HandleManager.cpp,v 1.14 1999-08-25 08:55:17 phaller 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 : HMMapViewOfFile 2297 * Purpose : router function for MapViewOfFile 2298 * 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 */ 2292 2333 } 2293 2334 … … 2335 2376 } 2336 2377 2378 2379 /***************************************************************************** 2380 * Name : HMUnmapViewOfFile 2381 * Purpose : router function for UnmapViewOfFile 2382 * 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 : HMFlushViewOfFile 2414 * Purpose : router function for FlushViewOfFile 2415 * 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 2337 2448 /***************************************************************************** 2338 2449 * Name : HMWaitForMultipleObjects -
trunk/src/kernel32/hmdevice.cpp
r664 r673 1 /* $Id: hmdevice.cpp,v 1. 4 1999-08-24 18:46:39 sandervlExp $ */1 /* $Id: hmdevice.cpp,v 1.5 1999-08-25 08:55:18 phaller 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 Ex(PHMHANDLEDATA pHMHandleData,1008 LPVOID HMDeviceHandler::MapViewOfFile(PHMHANDLEDATA pHMHandleData, 1009 1009 DWORD dwDesiredAccess, 1010 1010 DWORD dwFileOffsetHigh, 1011 1011 DWORD dwFileOffsetLow, 1012 DWORD dwNumberOfBytesToMap, 1013 LPVOID lpBaseAddress) 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) 1014 1048 { 1015 1049 dprintf(("KERNEL32: HandleManager::DeviceHandler::MapViewOfFileEx(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n", … … 1022 1056 return(NULL); 1023 1057 } 1058 1059 1060 /***************************************************************************** 1061 * Name : DWORD HMDeviceHandler::UnmapViewOfFile 1062 * Purpose : map memory mapped file 1063 * Parameters: PHMHANDLEDATA pHMHandleData 1064 * LPVOID lpBaseAddress 1065 * Variables : 1066 * Result : address to memory mapped region 1067 * 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::FlushViewOfFile 1086 * Purpose : map memory mapped file 1087 * Parameters: PHMHANDLEDATA pHMHandleData 1088 * LPVOID lpBaseAddress 1089 * DWORD dwNumberOfBytesToFlush 1090 * Variables : 1091 * Result : address to memory mapped region 1092 * 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
r664 r673 1 /* $Id: hmdevice.h,v 1. 5 1999-08-24 18:46:39 sandervlExp $ */1 /* $Id: hmdevice.h,v 1.6 1999-08-25 08:55:18 phaller 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 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 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 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 MapViewOfFileEx() */ 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() */ 267 274 virtual LPVOID MapViewOfFileEx (PHMHANDLEDATA pHMHandleData, 268 275 DWORD dwDesiredAccess, … … 270 277 DWORD dwFileOffsetLow, 271 278 DWORD dwNumberOfBytesToMap, 272 LPVOID lpBaseAddress); 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); 273 289 274 290 }; -
trunk/src/kernel32/hmmmap.cpp
r664 r673 1 /* $Id: hmmmap.cpp,v 1. 1 1999-08-24 18:47:33 sandervlExp $ */1 /* $Id: hmmmap.cpp,v 1.2 1999-08-25 08:55:18 phaller 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 56 Win32MemMap *map; … … 58 58 if((hFile == -1 && size_low == 0) || size_high || 59 59 protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|SEC_COMMIT|SEC_IMAGE|SEC_RESERVE|SEC_NOCACHE) || 60 ((protect & SEC_COMMIT) && (protect & SEC_RESERVE))) 60 ((protect & SEC_COMMIT) && (protect & SEC_RESERVE))) 61 61 { 62 62 … … 70 70 dprintf(("CreateFileMappingA: can't create Win32MemMap object!")); 71 71 return ERROR_OUTOFMEMORY; 72 } 72 } 73 73 74 74 if(map->Init(pHMHandleData->hHMHandle) == FALSE) { … … 155 155 //****************************************************************************** 156 156 //****************************************************************************** 157 LPVOID HMDeviceMemMapClass::MapViewOfFile(PHMHANDLEDATA pHMHandleData, 158 DWORD dwDesiredAccess, 159 DWORD dwFileOffsetHigh, 160 DWORD dwFileOffsetLow, 161 DWORD dwNumberOfBytesToMap) 162 { 163 dprintf(("KERNEL32: HMDeviceMemMapClass::MapViewOfFile(%08xh,%08xh,%08xh,%08xh,%08xh)\n", 164 pHMHandleData->hHMHandle, 165 dwDesiredAccess, 166 dwFileOffsetHigh, 167 dwFileOffsetLow, 168 dwNumberOfBytesToMap)); 169 170 return MapViewOfFileEx(pHMHandleData, 171 dwDesiredAccess, 172 dwFileOffsetHigh, 173 dwFileOffsetLow, 174 dwNumberOfBytesToMap, 175 NULL); 176 } 177 178 //****************************************************************************** 179 //****************************************************************************** 157 180 DWORD HMDeviceMemMapClass::CloseHandle(PHMHANDLEDATA pHMHandleData) 158 181 { … … 170 193 //****************************************************************************** 171 194 //****************************************************************************** 195 196 197 /***************************************************************************** 198 * Name : DWORD HMDeviceHandler::findByBaseAddress 199 * Purpose : identify a memmap object by its base address 200 * Parameters: LPVOID lpBaseAddress 201 * Variables : 202 * Result : PHMHANDLEDATA pHMHandleData 203 * Remark : 204 * Status : 205 * 206 * Author : Patrick Haller [Wed, 1999/06/17 20:44] 207 *****************************************************************************/ 208 209 int HMDeviceMemMapClass::findByBaseAddress(LPVOID lpBaseAddress) 210 { 211 dprintf(("KERNEL32: HandleManager::MemMap::findByBaseAddress(%08xh) not implemented\n", 212 lpBaseAddress)); 213 214 return -1; 215 } 216 217 218 /***************************************************************************** 219 * Name : DWORD HMDeviceHandler::UnmapViewOfFile 220 * Purpose : map memory mapped file 221 * Parameters: PHMHANDLEDATA pHMHandleData 222 * LPVOID lpBaseAddress 223 * Variables : 224 * Result : address to memory mapped region 225 * Remark : 226 * Status : 227 * 228 * Author : Patrick Haller [Wed, 1999/06/17 20:44] 229 *****************************************************************************/ 230 231 BOOL HMDeviceMemMapClass::UnmapViewOfFile(PHMHANDLEDATA pHMHandleData, 232 LPVOID lpBaseAddress) 233 { 234 dprintf(("KERNEL32: HandleManager::MemMap::UnmapViewOfFile(%08xh,%08xh) not implemented\n", 235 pHMHandleData->hHMHandle, 236 lpBaseAddress)); 237 238 return(FALSE); 239 } 240 241 242 /***************************************************************************** 243 * Name : DWORD HMDeviceHandler::FlushViewOfFile 244 * Purpose : map memory mapped file 245 * Parameters: PHMHANDLEDATA pHMHandleData 246 * LPVOID lpBaseAddress 247 * DWORD dwNumberOfBytesToFlush 248 * Variables : 249 * Result : address to memory mapped region 250 * Remark : 251 * Status : 252 * 253 * Author : Patrick Haller [Wed, 1999/06/17 20:44] 254 *****************************************************************************/ 255 256 BOOL HMDeviceMemMapClass::FlushViewOfFile(PHMHANDLEDATA pHMHandleData, 257 LPVOID lpBaseAddress, 258 DWORD dwNumberOfBytesToFlush) 259 { 260 dprintf(("KERNEL32: HandleManager::MemMap::FlushViewOfFile(%08xh,%08xh,%08xh) not implemented\n", 261 pHMHandleData->hHMHandle, 262 lpBaseAddress, 263 dwNumberOfBytesToFlush)); 264 265 return(FALSE); 266 } 267 268 -
trunk/src/kernel32/hmmmap.h
r664 r673 1 /* $Id: hmmmap.h,v 1. 1 1999-08-24 18:47:33 sandervlExp $ */1 /* $Id: hmmmap.h,v 1.2 1999-08-25 08:55:19 phaller Exp $ */ 2 2 3 3 /* … … 34 34 HMDeviceMemMapClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName) {} 35 35 36 // identify a memmap object by its base address 37 static int findByBaseAddress(LPVOID lpBaseAddress); 38 39 36 40 /* this is a handler method for calls to CreateFileMapping() */ 37 41 virtual DWORD CreateFileMapping (PHMHANDLEDATA pHMHandleData, … … 45 49 /* this is a handler method for calls to OpenFileMapping() */ 46 50 virtual DWORD OpenFileMapping (PHMHANDLEDATA pHMHandleData, 47 51 DWORD access, /* [in] Access mode */ 48 52 BOOL fInherit, 49 53 LPCSTR lpName); 50 54 51 55 /* 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() */ 52 63 virtual LPVOID MapViewOfFileEx (PHMHANDLEDATA pHMHandleData, 53 64 DWORD dwDesiredAccess, … … 55 66 DWORD dwFileOffsetLow, 56 67 DWORD dwNumberOfBytesToMap, 57 68 LPVOID lpBaseAddress); 58 69 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() */ 59 81 virtual DWORD CloseHandle(PHMHANDLEDATA pHMHandleData); 60 82 }; -
trunk/src/kernel32/os2native.cpp
r657 r673 1 /* $Id: os2native.cpp,v 1. 6 1999-08-24 12:23:24 sandervlExp $ */1 /* $Id: os2native.cpp,v 1.7 1999-08-25 08:57:14 phaller Exp $ */ 2 2 3 3 /* … … 20 20 #define INCL_DOSMEMMGR 21 21 #define INCL_DOSPROCESS 22 #include <os2wrap.h> 22 #include <os2wrap.h> //Odin32 OS/2 api wrappers 23 23 #include <stdlib.h> 24 24 #include <stdio.h> … … 80 80 if (cbSize > 0x7fc00000) /* 2Gb - 4Mb */ 81 81 { 82 82 dprintf(("VirtualAlloc: size too large")); 83 83 // SetLastError( ERROR_OUTOFMEMORY ); 84 84 return NULL; … … 88 88 (fdwAllocationType & ~(MEM_COMMIT | MEM_RESERVE))) 89 89 { 90 90 dprintf(("VirtualAlloc: Invalid parameter")); 91 91 // SetLastError( ERROR_INVALID_PARAMETER ); 92 92 return NULL; … … 103 103 if(fdwProtect & PAGE_EXECUTE_READWRITE) flag |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 104 104 if(fdwProtect & PAGE_EXECUTE_READ) flag |= (PAG_EXECUTE | PAG_READ); 105 if(fdwProtect & PAGE_EXECUTE) 105 if(fdwProtect & PAGE_EXECUTE) flag |= PAG_EXECUTE; 106 106 107 107 if(fdwProtect & PAGE_GUARD) flag |= PAG_GUARD; 108 108 109 109 //just do this if other options are used 110 if(!(flag & (PAG_READ | PAG_WRITE | PAG_EXECUTE)) || flag == 0) { 111 dprintf(("VirtualAlloc: Unknown protection flags, default to read/write")); 112 flag |= PAG_READ | PAG_WRITE; 113 } 114 115 if(fdwAllocationType & MEM_COMMIT && lpvAddress != NULL) { 116 Address = lpvAddress; 117 118 rc = DosSetMem(lpvAddress, cbSize, flag); 110 if(!(flag & (PAG_READ | PAG_WRITE | PAG_EXECUTE)) || flag == 0) 111 { 112 dprintf(("VirtualAlloc: Unknown protection flags, default to read/write")); 113 flag |= PAG_READ | PAG_WRITE; 114 } 115 116 if(fdwAllocationType & MEM_COMMIT && lpvAddress != NULL) 117 { 118 Address = lpvAddress; 119 120 rc = DosSetMem(lpvAddress, cbSize, flag); 119 121 //might try to commit larger part with same base address 120 if(rc == ERROR_ACCESS_DENIED && cbSize > 4096 ) {//knut: AND more than one page 121 char *newbase = (char *)lpvAddress + ((cbSize-1) & 0xFFFFF000); //knut: lets not start after the last page! 122 ULONG size, os2flags; 123 124 while(newbase >= (char *)lpvAddress) { //knut: should check first page to!! 125 size = 4096; 126 os2flags = 0; 127 rc = DosQueryMem(newbase, &size, &os2flags); 128 if(rc) break; 129 if(os2flags & PAG_COMMIT) { 130 newbase += 4096; 131 break; 132 } 133 newbase -= 4096; 134 } 135 if(rc == 0) { 136 //In case it wants to commit bytes that fall into the last 137 //page of the previous commit command 138 if(cbSize > ((int)newbase - (int)lpvAddress)) { 139 rc = DosSetMem(newbase, cbSize - ((int)newbase - (int)lpvAddress), flag); 140 } 141 } 142 else return(NULL); 122 if(rc == ERROR_ACCESS_DENIED && cbSize > 4096 ) 123 { //knut: AND more than one page 124 char *newbase = (char *)lpvAddress + ((cbSize-1) & 0xFFFFF000); //knut: lets not start after the last page! 125 ULONG size, os2flags; 126 127 while(newbase >= (char *)lpvAddress) 128 { //knut: should check first page to!! 129 size = 4096; 130 os2flags = 0; 131 rc = DosQueryMem(newbase, &size, &os2flags); 132 if(rc) 133 break; 134 135 if(os2flags & PAG_COMMIT) 136 { 137 newbase += 4096; 138 break; 143 139 } 144 else 145 { 146 if(rc == ERROR_INVALID_ADDRESS) 147 { 148 rc = DosAllocMem(&Address, cbSize, flag | flAllocMem ); 149 } 150 else 151 if(rc) dprintf(("Unexpected DosSetMem error %x", rc)); 152 } 153 } 154 else { 140 newbase -= 4096; 141 } 142 143 if(rc == 0) 144 { 145 //In case it wants to commit bytes that fall into the last 146 //page of the previous commit command 147 if(cbSize > ((int)newbase - (int)lpvAddress)) 148 rc = DosSetMem(newbase, cbSize - ((int)newbase - (int)lpvAddress), flag); 149 } 150 else 151 return(NULL); 152 153 } 154 else 155 { 156 if(rc == ERROR_INVALID_ADDRESS) 157 rc = DosAllocMem(&Address, cbSize, flag | flAllocMem ); 158 else 159 if(rc) 160 dprintf(("Unexpected DosSetMem error %x", rc)); 161 } 162 } 163 else 164 { 155 165 /*knut: flAllocMem */ 156 166 rc = DosAllocMem(&Address, cbSize, flag | flAllocMem ); … … 158 168 159 169 //TODO: Set last error in case rc != 0 160 if(rc) { 161 dprintf(("DosSetMem returned %d\n", rc)); 170 if(rc) 171 { 172 dprintf(("DosSetMem returned %d\n", rc)); 162 173 // SetLastError( ERROR_OUTOFMEMORY ); 163 174 return(NULL); 164 175 } 165 176 … … 265 276 266 277 if(lpvAddress == NULL || pmbiBuffer == NULL || cbLength == 0) { 267 278 return 0; 268 279 } 269 280 cbRangeSize = cbLength; 270 281 rc = DosQueryMem(lpvAddress, &cbRangeSize, &dAttr); 271 282 if(rc) { 272 273 283 dprintf(("VirtualQuery - DosQueryMem %x %x returned %d\n", lpvAddress, cbLength, rc)); 284 return 0; 274 285 } 275 286 memset(pmbiBuffer, 0, sizeof(MEMORY_BASIC_INFORMATION)); … … 291 302 292 303 if(dAttr & PAG_FREE) 293 304 pmbiBuffer->State = MEM_FREE; 294 305 else 295 306 if(dAttr & PAG_COMMIT) 296 297 else 298 307 pmbiBuffer->State = MEM_COMMIT; 308 else pmbiBuffer->State = MEM_RESERVE; 309 299 310 if(!(dAttr & PAG_SHARED)) 300 311 pmbiBuffer->Type = MEM_PRIVATE; 301 312 302 313 //TODO: This is not correct: AllocationProtect should contain the protection … … 304 315 pmbiBuffer->AllocationProtect = pmbiBuffer->Protect; 305 316 if(dAttr & PAG_BASE) { 306 317 pmbiBuffer->AllocationBase = lpvAddress; 307 318 } 308 319 else { 309 310 311 312 313 314 315 316 317 318 319 320 320 while(lpvAddress > 0) { 321 rc = DosQueryMem(lpvAddress, &cbRangeSize, &dAttr); 322 if(rc) { 323 dprintf(("VirtualQuery - DosQueryMem %x %x returned %d\n", lpvAddress, cbLength, rc)); 324 break; 325 } 326 if(dAttr & PAG_BASE) { 327 pmbiBuffer->AllocationBase = lpvAddress; 328 break; 329 } 330 lpvAddress = (LPVOID)((ULONG)lpvAddress - PAGE_SIZE); 331 } 321 332 } 322 333 return sizeof(MEMORY_BASIC_INFORMATION); -
trunk/src/kernel32/virtual.cpp
r657 r673 1 /* $Id: virtual.cpp,v 1. 2 1999-08-24 12:23:25 sandervlExp $ */1 /* $Id: virtual.cpp,v 1.3 1999-08-25 08:55:19 phaller Exp $ */ 2 2 3 3 /* … … 20 20 #include <heapstring.h> 21 21 #include "mmap.h" 22 #include <handlemanager.h> 22 23 23 24 /*********************************************************************** … … 38 39 LPCSTR name /* [in] Name of file-mapping object */ ) 39 40 { 40 HANDLE dupHandle; 41 42 if((hFile == -1 && size_low == 0) || size_high || 43 protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|SEC_COMMIT|SEC_IMAGE|SEC_RESERVE|SEC_NOCACHE) || 44 ((protect & SEC_COMMIT) && (protect & SEC_RESERVE))) 45 { 46 47 dprintf(("CreateFileMappingA: invalid parameter (combination)!")); 48 SetLastError(ERROR_INVALID_PARAMETER); 49 return 0; 50 } 51 if(DuplicateHandle(GetCurrentProcess(), hFile, GetCurrentProcess(), 52 &dupHandle, 0, FALSE, DUPLICATE_SAME_ACCESS) == FALSE) 53 { 54 dprintf(("CreateFileMappingA: DuplicateHandle failed!")); 55 return 0; 56 } 57 return dupHandle; 41 return HMCreateFileMapping(hFile, sa, protect, size_high, size_low, name); 58 42 } 59 43 … … 63 47 * See CreateFileMapping32A 64 48 */ 65 HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES attr, 66 DWORD protect, DWORD size_high, 49 HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES attr, 50 DWORD protect, DWORD size_high, 67 51 DWORD size_low, LPCWSTR name ) 68 52 { … … 88 72 LPCSTR name ) /* [in] Name of file-mapping object */ 89 73 { 90 dprintf(("OpenFileMappingA: NOT IMPLEMENTED")); 91 return 0; 74 return (HMOpenFileMapping(access, inherit, name)); 92 75 } 93 76 … … 120 103 DWORD offset_low, /* [in] Low-order 32 bits of file offset */ 121 104 DWORD count /* [in] Number of bytes to map */ 122 ) 123 { 124 return MapViewOfFileEx( mapping, access, offset_high,125 offset_low, count, NULL);105 ) 106 { 107 return HMMapViewOfFile( mapping, access, offset_high, 108 offset_low, count); 126 109 } 127 110 … … 142 125 DWORD count, /* [in] Number of bytes to map */ 143 126 LPVOID addr /* [in] Suggested starting address for mapped view */ 144 ) 145 { 146 DWORD filesize, bytesread; 147 LPSTR lpBuffer; 148 149 filesize = GetFileSize(handle, 0); 150 if(filesize == 0) { 151 dprintf(("MapViewOfFileEx: filesize = 0!")); 152 return 0; 153 } 154 lpBuffer = (LPSTR)VirtualAlloc(0, filesize, MEM_COMMIT, PAGE_READWRITE); 155 if(lpBuffer == 0) { 156 dprintf(("MapViewOfFileEx: VirtualAlloc failed (%d bytes)!", filesize)); 157 return 0; 158 } 159 if(ReadFile(handle, lpBuffer, filesize, &bytesread, NULL) == FALSE) { 160 dprintf(("MapViewOfFileEx: ReadFile failed (%d bytes)!", filesize)); 161 VirtualFree(lpBuffer, 0, MEM_RELEASE); 162 return 0; 163 } 164 return lpBuffer; 127 ) 128 { 129 return HMMapViewOfFileEx( handle, access, offset_high, 130 offset_low, count, addr); 165 131 } 166 132 … … 177 143 LPCVOID base, /* [in] Start address of byte range to flush */ 178 144 DWORD cbFlush /* [in] Number of bytes in range */ 179 ) 180 { 181 dprintf(("FlushViewOfFile: NOT IMPLEMENTED")); 182 return TRUE; 145 ) 146 { 147 return HMFlushViewOfFile( (LPVOID)base, cbFlush); 183 148 } 184 149 … … 196 161 */ 197 162 BOOL WINAPI UnmapViewOfFile(LPVOID addr /* [in] Address where mapped view begins */ 198 ) 199 { 200 if (!addr) 201 { 202 SetLastError( ERROR_INVALID_PARAMETER ); 203 return FALSE; 204 } 205 return VirtualFree(addr, 0, MEM_RELEASE); 206 } 163 ) 164 { 165 return HMUnmapViewOfFile( addr ); 166 } 167 207 168 208 169 /*********************************************************************** … … 210 171 * 211 172 * Helper function to map a file to memory: 212 * name - file name 173 * name - file name 213 174 * [RETURN] ptr - pointer to mapped file 214 175 */ … … 218 179 LPVOID ptr = NULL; 219 180 220 hFile = CreateFileW( name, GENERIC_READ, FILE_SHARE_READ, NULL, 181 hFile = CreateFileW( name, GENERIC_READ, FILE_SHARE_READ, NULL, 221 182 OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0); 222 183 if (hFile != INVALID_HANDLE_VALUE) … … 237 198 * 238 199 * Helper function to map a file to memory: 239 * name - file name 200 * name - file name 240 201 * [RETURN] ptr - pointer to mapped file 241 202 */ … … 245 206 LPVOID ptr = NULL; 246 207 247 hFile = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, NULL, 208 hFile = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, NULL, 248 209 OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0); 249 210 if (hFile != INVALID_HANDLE_VALUE) … … 259 220 return ptr; 260 221 } 222
Note:
See TracChangeset
for help on using the changeset viewer.