- Timestamp:
- Aug 27, 1999, 6:51:01 PM (26 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/KERNEL32.DEF
r690 r712 1 ; $Id: KERNEL32.DEF,v 1.3 0 1999-08-25 14:27:06sandervl Exp $1 ; $Id: KERNEL32.DEF,v 1.31 1999-08-27 16:51:00 sandervl Exp $ 2 2 3 3 ;Created by BLAST for IBM's compiler … … 16 16 _DosQueryModFromEIP = DOSCALLS.360 17 17 DosQueryModFromEIP = DOSCALLS.360 18 DosAliasMem = DOSCALLS.298 19 _DosAliasMem = DOSCALLS.298 18 20 19 21 -
trunk/src/kernel32/exceptions.cpp
r710 r712 1 /* $Id: exceptions.cpp,v 1.1 6 1999-08-27 10:44:21 phallerExp $ */1 /* $Id: exceptions.cpp,v 1.17 1999-08-27 16:50:59 sandervl Exp $ */ 2 2 3 3 /* … … 868 868 PVOID p) 869 869 { 870 /*********************************871 * Internally handled exceptions *872 *********************************/873 874 /* Access violation at a known location */875 if (pERepRec->ExceptionNum == XCPT_ACCESS_VIOLATION)876 {877 Win32MemMap *map;878 BOOL fWriteAccess = FALSE;879 880 if(pERepRec->ExceptionInfo[1] == 0 &&881 pERepRec->ExceptionInfo[1] == XCPT_DATA_UNKNOWN)882 goto continueFail;883 884 map = Win32MemMap::findMap(pERepRec->ExceptionInfo[1]);885 if(map == NULL)886 goto continueFail;887 888 switch(pERepRec->ExceptionInfo[0])889 {890 case XCPT_READ_ACCESS:891 if(map->hasReadAccess() == FALSE)892 goto continueFail;893 break;894 895 case XCPT_WRITE_ACCESS:896 if(map->hasWriteAccess() == FALSE)897 goto continueFail;898 fWriteAccess = TRUE;899 break;900 901 case XCPT_EXECUTE_ACCESS:902 if(map->hasExecuteAccess() == FALSE)903 goto continueFail;904 break;905 906 default:907 goto continueFail;908 }909 910 //Might want to consider mapping more than one page if access is at911 //a high offset in the page912 //@@@PH: mapping 16k or 32k might be significally faster in terms of transfer speed913 if(map->commitPage((LPVOID)pERepRec->ExceptionInfo[1], 1, fWriteAccess) == TRUE)914 return (XCPT_CONTINUE_EXECUTION);915 916 //no break;917 }918 continueFail:919 920 921 /************************922 * Pass-thru exceptions *923 ************************/924 925 870 // pERegRec->prev_structure = 0; 926 871 dprintfException(pERepRec, pERegRec, pCtxRec, p); … … 929 874 switch(pERepRec->ExceptionNum) 930 875 { 931 932 933 934 935 936 937 938 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")); 939 884 pCtxRec->ctx_env[0] |= 0x1F; 940 885 pCtxRec->ctx_stack[0].losig = 0; 941 886 pCtxRec->ctx_stack[0].hisig = 0; 942 887 pCtxRec->ctx_stack[0].signexp = 0; 943 return (XCPT_CONTINUE_EXECUTION); 944 945 case XCPT_PROCESS_TERMINATE: 946 case XCPT_ASYNC_PROCESS_TERMINATE: 947 SetExceptionChain((ULONG)0); 948 return (XCPT_CONTINUE_SEARCH); 949 950 case XCPT_ACCESS_VIOLATION: 951 case XCPT_BREAKPOINT: 952 case XCPT_ARRAY_BOUNDS_EXCEEDED: 953 case XCPT_DATATYPE_MISALIGNMENT: 954 case XCPT_ILLEGAL_INSTRUCTION: 955 case XCPT_PRIVILEGED_INSTRUCTION: 956 case XCPT_INVALID_LOCK_SEQUENCE: 957 case XCPT_INTEGER_DIVIDE_BY_ZERO: 958 case XCPT_INTEGER_OVERFLOW: 959 case XCPT_SINGLE_STEP: 960 case XCPT_GUARD_PAGE_VIOLATION: 961 case XCPT_UNABLE_TO_GROW_STACK: 962 case XCPT_IN_PAGE_ERROR: 963 case XCPT_SIGNAL: 964 dprintf(("KERNEL32: OS2ExceptionHandler: Continue and kill\n")); 965 pCtxRec->ctx_RegEip = (ULONG)KillWin32Process; 966 pCtxRec->ctx_RegEsp = pCtxRec->ctx_RegEsp + 0x10; 967 pCtxRec->ctx_RegEax = pERepRec->ExceptionNum; 968 pCtxRec->ctx_RegEbx = pCtxRec->ctx_RegEip; 969 return (XCPT_CONTINUE_EXECUTION); 970 971 default: //non-continuable exceptions 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); 895 896 case XCPT_ACCESS_VIOLATION: 897 { 898 Win32MemMap *map; 899 BOOL fWriteAccess = FALSE; 900 ULONG offset, accessflag; 901 902 if(pERepRec->ExceptionInfo[1] == 0 && pERepRec->ExceptionInfo[1] == XCPT_DATA_UNKNOWN) { 903 goto continueFail; 904 } 905 switch(pERepRec->ExceptionInfo[0]) { 906 case XCPT_READ_ACCESS: 907 accessflag = MEMMAP_ACCESS_READ; 908 break; 909 case XCPT_WRITE_ACCESS: 910 accessflag = MEMMAP_ACCESS_WRITE; 911 fWriteAccess = TRUE; 912 break; 913 case XCPT_EXECUTE_ACCESS: 914 accessflag = MEMMAP_ACCESS_EXECUTE; 915 break; 916 default: 917 goto continueFail; 918 } 919 920 map = Win32MemMapView::findMapByView(pERepRec->ExceptionInfo[1], &offset, accessflag); 921 if(map == NULL) { 922 goto continueFail; 923 } 924 if(map->commitPage(offset, fWriteAccess) == TRUE) 925 return (XCPT_CONTINUE_EXECUTION); 926 927 //no break; 928 } 929 continueFail: 930 931 case XCPT_BREAKPOINT: 932 case XCPT_ARRAY_BOUNDS_EXCEEDED: 933 case XCPT_DATATYPE_MISALIGNMENT: 934 case XCPT_ILLEGAL_INSTRUCTION: 935 case XCPT_PRIVILEGED_INSTRUCTION: 936 case XCPT_INVALID_LOCK_SEQUENCE: 937 case XCPT_INTEGER_DIVIDE_BY_ZERO: 938 case XCPT_INTEGER_OVERFLOW: 939 case XCPT_SINGLE_STEP: 940 case XCPT_GUARD_PAGE_VIOLATION: 941 case XCPT_UNABLE_TO_GROW_STACK: 942 case XCPT_IN_PAGE_ERROR: 943 case XCPT_SIGNAL: 944 dprintf(("KERNEL32: OS2ExceptionHandler: Continue and kill\n")); 945 pCtxRec->ctx_RegEip = (ULONG)KillWin32Process; 946 pCtxRec->ctx_RegEsp = pCtxRec->ctx_RegEsp + 0x10; 947 pCtxRec->ctx_RegEax = pERepRec->ExceptionNum; 948 pCtxRec->ctx_RegEbx = pCtxRec->ctx_RegEip; 949 return (XCPT_CONTINUE_EXECUTION); 950 951 default: //non-continuable exceptions 972 952 return (XCPT_CONTINUE_SEARCH); 973 953 } … … 1019 999 USHORT sel = GetFS(); 1020 1000 1021 SetExceptionChain(val); 1001 SetExceptionChain(val); 1022 1002 SetFS(sel); 1023 1003 } -
trunk/src/kernel32/hmmmap.cpp
r690 r712 1 /* $Id: hmmmap.cpp,v 1. 5 1999-08-25 14:27:06sandervl Exp $ */1 /* $Id: hmmmap.cpp,v 1.6 1999-08-27 16:51:00 sandervl Exp $ */ 2 2 3 3 /* … … 67 67 } 68 68 69 map = new Win32MemMap(hFile, size_low, protect, (LPSTR)name); 70 if(map == NULL) { 71 dprintf(("CreateFileMappingA: can't create Win32MemMap object!")); 72 return ERROR_OUTOFMEMORY; 73 } 69 map = Win32MemMap::findMap((LPSTR)name); 70 if(map != NULL) { 71 dprintf(("CreateFileMappingA: duplicating map %s!", name)); 74 72 75 if(map->Init(pHMHandleData->hHMHandle) == FALSE) { 76 delete map; 77 return ERROR_GEN_FAILURE; 73 DWORD protflags = map->getProtFlags(); 74 switch(protect) { 75 case FILE_MAP_WRITE: 76 if(!(protflags & PAGE_WRITECOPY)) 77 dprintf(("Different flags for duplicate!")); 78 break; 79 case FILE_MAP_READ: 80 if(!(protflags & (PAGE_READWRITE | PAGE_READONLY))) 81 dprintf(("Different flags for duplicate!")); 82 break; 83 case FILE_MAP_COPY: 84 if(!(protflags & PAGE_WRITECOPY)) 85 dprintf(("Different flags for duplicate!")); 86 break; 87 } 88 //TODO: 89 //Is it allowed to open an existing view with different flags? 90 //(i.e. write access to readonly object) 91 } 92 else { 93 map = new Win32MemMap(hFile, size_low, protect, (LPSTR)name); 94 95 if(map == NULL) { 96 dprintf(("CreateFileMappingA: can't create Win32MemMap object!")); 97 return ERROR_OUTOFMEMORY; 98 } 99 100 if(map->Init(pHMHandleData->hHMHandle) == FALSE) { 101 delete map; 102 return ERROR_GEN_FAILURE; 103 } 78 104 } 79 105 map->AddRef(); -
trunk/src/kernel32/mmap.cpp
r708 r712 1 /* $Id: mmap.cpp,v 1.1 6 1999-08-26 17:56:25sandervl Exp $ */1 /* $Id: mmap.cpp,v 1.17 1999-08-27 16:51:00 sandervl Exp $ */ 2 2 3 3 /* 4 * Win32 Memory mapped file class4 * Win32 Memory mapped file & view classes 5 5 * 6 6 * Copyright 1999 Sander van Leeuwen (sandervl@xs4all.nl) … … 28 28 #include <handlemanager.h> 29 29 #include "mmap.h" 30 #include "oslibdos.h" 30 31 31 32 VMutex globalmapMutex; 33 VMutex globalviewMutex; 32 34 33 35 //****************************************************************************** … … 35 37 //****************************************************************************** 36 38 Win32MemMap::Win32MemMap(HFILE hfile, ULONG size, ULONG fdwProtect, LPSTR lpszName) 37 : fMapped(FALSE), pMapping(NULL), mMapAccess(0), referenced(0)39 : nrMappings(0), pMapping(NULL), mMapAccess(0), referenced(0) 38 40 { 39 41 globalmapMutex.enter(); … … 72 74 } 73 75 } 76 77 dprintf(("CreateFileMappingA for file %x, prot %x size %d, name %s", hMemFile, mProtFlags, mSize, lpszMapName)); 74 78 this->hMemMap = hMemMap; 75 79 mapMutex.leave(); … … 83 87 Win32MemMap::~Win32MemMap() 84 88 { 85 unmapViewOfFile(); 89 for(int i=0;i<nrMappings;i++) { 90 Win32MemMapView::deleteView(this); //delete all views of our memory mapped file 91 } 92 mapMutex.enter(); 86 93 if(lpszMapName) { 87 94 free(lpszMapName); 88 95 } 89 mapMutex.enter();90 96 if(pMapping) { 91 97 VirtualFree(pMapping, mSize, MEM_RELEASE); … … 118 124 } 119 125 //****************************************************************************** 120 //******************************************************************************121 BOOL Win32MemMap::hasReadAccess()122 {123 return TRUE; //should have at least this124 }125 //******************************************************************************126 //******************************************************************************127 BOOL Win32MemMap::hasWriteAccess()128 {129 return !(mProtFlags & PAGE_READONLY);130 }131 //******************************************************************************132 //Might want to add this feature for memory mapping executable & dll files in133 //the loader (done in Win32 with the SEC_IMAGE flag?)134 //******************************************************************************135 BOOL Win32MemMap::hasExecuteAccess()136 {137 return FALSE;138 }139 //******************************************************************************140 126 //We determine whether a page has been modified by checking it's protection flags 141 127 //If the write flag is set, this means commitPage had to enable this due to a pagefault 142 128 //(all pages are readonly until the app tries to write to it) 143 129 //****************************************************************************** 144 BOOL Win32MemMap::commitPage( LPVOID lpPageFaultAddr, ULONG nrpages, BOOL fWriteAccess)130 BOOL Win32MemMap::commitPage(ULONG offset, BOOL fWriteAccess) 145 131 { 146 132 MEMORY_BASIC_INFORMATION memInfo; 147 DWORD pageAddr = (DWORD)lpPageFaultAddr & ~0xFFF; 148 DWORD oldProt, newProt, nrBytesRead, offset, size; 149 133 LPVOID lpPageFaultAddr = (LPVOID)((ULONG)pMapping + offset); 134 DWORD pageAddr = (DWORD)lpPageFaultAddr & ~0xFFF; 135 DWORD oldProt, newProt, nrBytesRead, size; 136 150 137 // mapMutex.enter(); 138 151 139 newProt = mProtFlags & (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY); 152 140 153 dprintf(("Win32MemMap::commitPage %x (faultaddr %x) , nr of pages %d", pageAddr, lpPageFaultAddr, nrpages));141 dprintf(("Win32MemMap::commitPage %x (faultaddr %x)", pageAddr, lpPageFaultAddr)); 154 142 if(hMemFile != -1) { 155 if(VirtualQuery((LPSTR)pageAddr, &memInfo, nrpages*PAGE_SIZE) == 0) { 156 dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, nrpages*PAGE_SIZE)); 157 goto fail; 158 } 143 if(VirtualQuery((LPSTR)pageAddr, &memInfo, NRPAGES_TOCOMMIT*PAGE_SIZE) == 0) { 144 dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, NRPAGES_TOCOMMIT*PAGE_SIZE)); 145 goto fail; 146 } 147 //Only changes the state of the pages with the same attribute flags 148 //(returned in memInfo.RegionSize) 149 //If it's smaller than the mNrPages, it simply means one or more of the 150 //other pages have already been committed 159 151 if(memInfo.State & MEM_COMMIT) 160 152 {//if it's already committed, then the app tried to write to it 161 153 if(!fWriteAccess) { 162 dprintf(("Win32MemMap::commitPage: Huh? Already committed and not trying to write (%x,%x) failed for %x", pageAddr, nrpages*PAGE_SIZE));163 goto fail; 164 } 165 if(VirtualProtect((LPVOID)pageAddr, nrpages*PAGE_SIZE, newProt, &oldProt) == FALSE) {166 dprintf(("Win32MemMap::commitPage: Failed to set write flag on page (%x,%x) failed for %x", pageAddr, nrpages*PAGE_SIZE));154 dprintf(("Win32MemMap::commitPage: Huh? Already committed and not trying to write (%x,%x) failed for %x", pageAddr, memInfo.RegionSize)); 155 goto fail; 156 } 157 if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) { 158 dprintf(("Win32MemMap::commitPage: Failed to set write flag on page (%x,%x) failed for %x", pageAddr, memInfo.RegionSize)); 167 159 goto fail; 168 160 } 169 161 } 170 162 else { 171 if(VirtualAlloc((LPVOID)pageAddr, nrpages*PAGE_SIZE, MEM_COMMIT, PAGE_READWRITE) == FALSE) {163 if(VirtualAlloc((LPVOID)pageAddr, memInfo.RegionSize, MEM_COMMIT, PAGE_READWRITE) == FALSE) { 172 164 goto fail; 173 165 } 174 166 offset = pageAddr - (ULONG)pMapping; 175 size = nrpages*PAGE_SIZE;167 size = memInfo.RegionSize; 176 168 if(offset + size > mSize) { 169 dprintf(("Adjusting size from %d to %d", size, mSize - offset)); 177 170 size = mSize - offset; 178 171 } … … 190 183 } 191 184 if(mProtFlags & PAGE_READONLY) { 192 if(VirtualProtect((LPVOID)pageAddr, nrpages*PAGE_SIZE, newProt, &oldProt) == FALSE) {185 if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) { 193 186 goto fail; 194 187 } … … 197 190 } 198 191 else { 199 if(VirtualAlloc((LPVOID)pageAddr, nrpages*PAGE_SIZE, MEM_COMMIT, newProt) == FALSE) { 192 if(VirtualQuery((LPSTR)pageAddr, &memInfo, NRPAGES_TOCOMMIT*PAGE_SIZE) == 0) { 193 dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, NRPAGES_TOCOMMIT*PAGE_SIZE)); 194 goto fail; 195 } 196 if(VirtualAlloc((LPVOID)pageAddr, memInfo.RegionSize, MEM_COMMIT, newProt) == FALSE) { 200 197 goto fail; 201 198 } … … 209 206 } 210 207 //****************************************************************************** 211 //****************************************************************************** 212 BOOL Win32MemMap::unmapViewOfFile() 213 { 214 if(fMapped == FALSE) 215 return FALSE; 216 217 flushView(pMapping, mSize); 208 //todo: unalias memory 209 //****************************************************************************** 210 BOOL Win32MemMap::unmapViewOfFile(Win32MemMapView *view) 211 { 218 212 mapMutex.enter(); 219 if(pMapping) { 213 214 if(nrMappings == 0) 215 goto fail; 216 217 delete view; 218 219 if(--nrMappings) { 220 220 VirtualFree(pMapping, mSize, MEM_RELEASE); 221 } 222 pMapping = NULL; 223 fMapped = FALSE; 221 pMapping = NULL; 222 } 224 223 mapMutex.leave(); 225 224 return TRUE; 225 fail: 226 mapMutex.leave(); 227 return FALSE; 226 228 } 227 229 //****************************************************************************** … … 232 234 ULONG memFlags = (mProtFlags & (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY)); 233 235 ULONG fAlloc = 0; 234 LPVOID mapview; 235 236 Win32MemMapView *mapview; 237 238 if(fdwAccess & ~(FILE_MAP_WRITE|FILE_MAP_READ|FILE_MAP_COPY)) 239 goto parmfail; 236 240 if((fdwAccess & FILE_MAP_WRITE) && !(mProtFlags & PAGE_READWRITE)) 237 241 goto parmfail; … … 240 244 if((fdwAccess & FILE_MAP_COPY) && !(mProtFlags & PAGE_WRITECOPY)) 241 245 goto parmfail; 246 if(offset+size > mSize) 247 goto parmfail; 242 248 243 249 //TODO: If committed, read file into memory 244 #if 0 250 #if 0 245 251 if(mProtFlags & SEC_COMMIT) 246 252 fAlloc |= MEM_COMMIT; … … 252 258 #endif 253 259 254 if( fMapped == FALSE) {//if not mapped, reserve/commit entire view260 if(nrMappings == 0) {//if not mapped, reserve/commit entire view 255 261 //SvL: Always read/write access or else ReadFile will crash once we 256 // start decommitting pages.262 // start committing pages. 257 263 // This is most likely an OS/2 bug and doesn't happen in Aurora 258 264 // when allocating memory with the PAG_ANY bit set. (without this … … 263 269 goto fail; 264 270 } 265 fMapped = TRUE; 266 } 267 mapview = (LPVOID)((ULONG)pMapping + offset); 268 mapMutex.leave(); 269 return mapview; 271 } 272 mapview = new Win32MemMapView(this, offset, (size == 0) ? mSize : size, fdwAccess); 273 if(mapview == NULL) { 274 goto fail; 275 } 276 if(mapview->everythingOk() == FALSE) { 277 delete mapview; 278 goto fail; 279 } 280 nrMappings++; 281 mapMutex.leave(); 282 return mapview->getViewAddr(); 270 283 271 284 parmfail: … … 279 292 //We determine whether a page has been modified by checking it's protection flags 280 293 //If the write flag is set, this means commitPage had to enable this due to a pagefault 281 //(all pages are readonly until the app tries to modify it)294 //(all pages are readonly until the app tries to modify the contents of the page) 282 295 // 283 296 //TODO: Are apps allowed to change the protection flags of memory mapped pages? 284 297 // I'm assuming they aren't for now. 285 298 //****************************************************************************** 286 BOOL Win32MemMap::flushView(LPVOID lpvBase, ULONG cbFlush) 287 { 299 BOOL Win32MemMap::flushView(ULONG offset, ULONG cbFlush) 300 { 301 LPVOID lpvBase = (LPVOID)((ULONG)pMapping+offset); 288 302 MEMORY_BASIC_INFORMATION memInfo; 289 ULONG nr pages, nrBytesWritten, offset, size;303 ULONG nrBytesWritten, size; 290 304 int i; 291 305 292 // mapMutex.enter();293 306 dprintf(("Win32MemMap::flushView: %x %x", lpvBase, cbFlush)); 294 if( fMapped == FALSE)307 if(nrMappings == 0) 295 308 goto parmfail; 296 309 … … 307 320 goto success; //TODO: Return an error here? 308 321 309 nrpages = cbFlush/PAGE_SIZE; 310 if(cbFlush & 0xFFF) nrpages++; 311 312 for(i=0;i<nrpages;i++) { 313 if(VirtualQuery((LPSTR)lpvBase+i*PAGE_SIZE, &memInfo, PAGE_SIZE) == 0) { 322 while(cbFlush) { 323 if(VirtualQuery((LPSTR)lpvBase, &memInfo, cbFlush) == 0) { 314 324 dprintf(("Win32MemMap::flushView: VirtualQuery (%x,%x) failed for %x", lpvBase, cbFlush, (ULONG)lpvBase+i*PAGE_SIZE)); 315 325 goto fail; 316 326 } 317 //If a page is reserved or write protected, we won't bother flushing it to disk 327 //If a page (or range of pages) is reserved or write protected, we 328 //won't bother flushing it to disk 318 329 if(memInfo.State & MEM_COMMIT && 319 330 memInfo.AllocationProtect & (PAGE_READWRITE|PAGE_WRITECOPY|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY)) 320 331 {//committed and allowed for writing? 321 offset = (ULONG)lpvBase +i*PAGE_SIZE- (ULONG)pMapping;322 size = PAGE_SIZE;323 if( offset + size > mSize) {324 size = mSize - offset;332 offset = (ULONG)lpvBase - (ULONG)pMapping; 333 size = memInfo.RegionSize; 334 if(size > cbFlush) { 335 size = cbFlush; 325 336 } 326 337 dprintf(("Win32MemMap::flushView for offset %x, size %d", offset, size)); … … 330 341 goto fail; 331 342 } 332 if(WriteFile(hMemFile, (LPSTR)lpvBase +i*PAGE_SIZE, size, &nrBytesWritten, NULL) == FALSE) {333 dprintf(("Win32MemMap::flushView: WriteFile failed for %x", (ULONG)lpvBase +i*PAGE_SIZE));343 if(WriteFile(hMemFile, (LPSTR)lpvBase, size, &nrBytesWritten, NULL) == FALSE) { 344 dprintf(("Win32MemMap::flushView: WriteFile failed for %x", (ULONG)lpvBase)); 334 345 goto fail; 335 346 } 336 347 if(nrBytesWritten != size) { 337 dprintf(("Win32MemMap::flushView: WriteFile didn't write all bytes for %x", (ULONG)lpvBase+i*PAGE_SIZE)); 338 goto fail; 339 } 340 } 348 dprintf(("Win32MemMap::flushView: WriteFile didn't write all bytes for %x", (ULONG)lpvBase)); 349 goto fail; 350 } 351 } 352 lpvBase = (LPVOID)((ULONG)lpvBase + memInfo.RegionSize); 353 354 if(cbFlush < memInfo.RegionSize) 355 break; 356 357 cbFlush -= memInfo.RegionSize; 341 358 } 342 359 success: 343 // mapMutex.leave();344 360 return TRUE; 345 361 parmfail: 346 362 SetLastError(ERROR_INVALID_PARAMETER); 347 // mapMutex.leave();348 363 return FALSE; 349 364 fail: 350 // mapMutex.leave();351 365 return FALSE; 352 366 } … … 390 404 } 391 405 //****************************************************************************** 406 //Assumes mutex has been acquired 392 407 //****************************************************************************** 393 408 void Win32MemMap::deleteAll() … … 400 415 //****************************************************************************** 401 416 Win32MemMap *Win32MemMap::memmaps = NULL; 417 418 //****************************************************************************** 419 //****************************************************************************** 420 Win32MemMapView::Win32MemMapView(Win32MemMap *map, ULONG offset, ULONG size, 421 ULONG fdwAccess) 422 { 423 LPVOID viewaddr = (LPVOID)((ULONG)map->getMappingAddr()+offset); 424 ULONG accessAttr = 0; 425 Win32MemMapView *tmpview = mapviews; 426 427 errorState = 0; 428 mParentMap = map; 429 mSize = size; 430 mOffset = offset; 431 432 switch(fdwAccess) { 433 case FILE_MAP_READ: 434 accessAttr = PAG_READ; 435 mfAccess = MEMMAP_ACCESS_READ; 436 break; 437 case FILE_MAP_WRITE: 438 case FILE_MAP_COPY: 439 accessAttr = (PAG_READ|PAG_WRITE); 440 mfAccess = MEMMAP_ACCESS_WRITE; 441 break; 442 } 443 if(OSLibDosAliasMem(viewaddr, size, &pMapView, accessAttr) != OSLIB_NOERROR) { 444 dprintf(("new OSLibDosAliasMem FAILED")); 445 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 446 errorState = 1; 447 return; 448 } 449 450 dprintf(("Win32MemMapView::Win32MemMapView: created %x (alias for %x), size %d", pMapView, viewaddr, size)); 451 452 globalviewMutex.enter(); 453 if(tmpview == NULL || tmpview->getViewAddr() > pMapView) { 454 next = mapviews; 455 mapviews = this; 456 } 457 else { 458 while(tmpview->next) { 459 if(tmpview->next->getViewAddr() > pMapView) { 460 break; 461 } 462 tmpview = tmpview->next; 463 } 464 next = tmpview->next; 465 tmpview->next = this; 466 } 467 globalviewMutex.leave(); 468 } 469 //****************************************************************************** 470 //****************************************************************************** 471 Win32MemMapView::~Win32MemMapView() 472 { 473 if(errorState != 0) 474 return; 475 476 if(mfAccess != MEMMAP_ACCESS_READ) 477 mParentMap->flushView(mOffset, mSize); 478 479 OSLibDosFreeMem(pMapView); 480 481 globalviewMutex.enter(); 482 Win32MemMapView *view = mapviews; 483 484 if(view == this) { 485 mapviews = next; 486 } 487 else { 488 while(view->next) { 489 if(view->next == this) 490 break; 491 view = view->next; 492 } 493 if(view->next) { 494 view->next = next; 495 } 496 else dprintf(("Win32MemMapView::~Win32MemMapView: map not found!! (%x)", this)); 497 } 498 globalviewMutex.leave(); 499 } 500 //****************************************************************************** 501 //****************************************************************************** 502 void Win32MemMapView::deleteView(Win32MemMap *map) 503 { 504 globalviewMutex.enter(); 505 Win32MemMapView *view = mapviews; 506 507 if(view != NULL) { 508 while(view) { 509 if(view->getParentMap() == map) 510 { 511 globalviewMutex.leave(); 512 delete view; 513 return; 514 } 515 view = view->next; 516 } 517 } 518 globalviewMutex.leave(); 519 } 520 //****************************************************************************** 521 //****************************************************************************** 522 Win32MemMap *Win32MemMapView::findMapByView(ULONG address, ULONG *offset, 523 ULONG accessType, 524 Win32MemMapView **pView) 525 { 526 globalviewMutex.enter(); 527 Win32MemMapView *view = mapviews; 528 529 *offset = 0; 530 531 if(view != NULL) { 532 while(view && (ULONG)view->getViewAddr() <= address) { 533 if((ULONG)view->getViewAddr() <= address && 534 (ULONG)view->getViewAddr() + view->getSize() >= address && 535 view->getAccessFlags() >= accessType) 536 { 537 *offset = view->getOffset() + (address - (ULONG)view->getViewAddr()); 538 goto success; 539 } 540 view = view->next; 541 } 542 //failure if we get here 543 view = NULL; 544 } 545 success: 546 globalviewMutex.leave(); 547 if(pView) *pView = view; 548 return (view) ? view->getParentMap() : NULL; 549 } 550 //****************************************************************************** 551 //****************************************************************************** 552 Win32MemMapView *Win32MemMapView::findView(LPVOID address) 553 { 554 Win32MemMapView *view = mapviews; 555 556 if(view != NULL) { 557 while(view) { 558 if(view->getViewAddr() == address) 559 { 560 break; 561 } 562 view = view->next; 563 } 564 } 565 return view; 566 } 567 //****************************************************************************** 568 //****************************************************************************** 569 Win32MemMapView *Win32MemMapView::mapviews = NULL; 570 -
trunk/src/kernel32/mmap.h
r699 r712 1 /* $Id: mmap.h,v 1. 8 1999-08-25 17:05:57sandervl Exp $ */1 /* $Id: mmap.h,v 1.9 1999-08-27 16:51:00 sandervl Exp $ */ 2 2 3 3 /* … … 19 19 #endif 20 20 21 //commit 4 pages at once when the app accesses it 22 #define NRPAGES_TOCOMMIT 200 23 24 #define MEMMAP_ACCESS_READ 1 25 #define MEMMAP_ACCESS_WRITE 2 26 #define MEMMAP_ACCESS_EXECUTE 4 27 28 class Win32MemMapView; 29 30 //****************************************************************************** 31 //****************************************************************************** 21 32 class Win32MemMap 22 33 { … … 26 37 27 38 BOOL Init(HANDLE hMemMap); 28 BOOL flushView( LPVOID lpvBase, ULONG cbFlush);39 BOOL flushView(ULONG offset, ULONG cbFlush); 29 40 LPVOID mapViewOfFile(ULONG size, ULONG offset, ULONG fdwAccess); 30 BOOL unmapViewOfFile( );41 BOOL unmapViewOfFile(Win32MemMapView *view); 31 42 32 43 HFILE getMapHandle() { return hMemMap; }; 33 44 LPSTR getMemName() { return lpszMapName; }; 34 45 DWORD getProtFlags() { return mProtFlags; }; 46 LPVOID getMappingAddr() { return pMapping; }; 35 47 36 48 void AddRef() { ++referenced; }; 37 49 void Release() { if(--referenced == 0) delete this; }; 38 50 39 BOOL hasReadAccess(); 40 BOOL hasWriteAccess(); 41 BOOL hasExecuteAccess(); 42 43 BOOL commitPage(LPVOID lpPageFaultAddr, ULONG nrpages, BOOL fWriteAccess); 51 BOOL commitPage(ULONG offset, BOOL fWriteAccess); 44 52 45 53 static Win32MemMap *findMap(LPSTR lpszName); … … 56 64 LPSTR lpszMapName; 57 65 void *pMapping; 58 BOOL fMapped; 66 67 ULONG nrMappings; 59 68 60 69 ULONG referenced; … … 66 75 Win32MemMap *next; 67 76 }; 77 //****************************************************************************** 78 //Memory mapped file View Class 79 //****************************************************************************** 80 class Win32MemMapView 81 { 82 public: 83 Win32MemMapView(Win32MemMap *map, ULONG offset, ULONG size, ULONG fdwAccess); 84 ~Win32MemMapView(); 85 86 DWORD getAccessFlags() { return mfAccess; }; 87 DWORD getSize() { return mSize; }; 88 LPVOID getViewAddr() { return pMapView; }; 89 ULONG getOffset() { return mOffset; }; 90 91 BOOL everythingOk() { return errorState == 0; }; 92 93 Win32MemMap *getParentMap() { return mParentMap;}; 94 95 static void deleteView(Win32MemMap *map); 96 static Win32MemMap *findMapByView(ULONG address, ULONG *offset, ULONG accessType, Win32MemMapView **pView=NULL); 97 static Win32MemMapView *findView(LPVOID address); 98 99 protected: 100 ULONG mSize, errorState; 101 ULONG mfAccess, mOffset; 102 void *pMapView; 103 104 Win32MemMap *mParentMap; 105 106 private: 107 static Win32MemMapView *mapviews; 108 Win32MemMapView *next; 109 110 friend class Win32MemMap; 111 }; 112 //****************************************************************************** 113 //****************************************************************************** 68 114 69 115 #endif //__MMAP_H__ -
trunk/src/kernel32/oslibdos.cpp
r707 r712 1 /* $Id: oslibdos.cpp,v 1. 2 1999-08-26 15:05:14sandervl Exp $ */1 /* $Id: oslibdos.cpp,v 1.3 1999-08-27 16:51:00 sandervl Exp $ */ 2 2 3 3 /* … … 23 23 #include "oslibdos.h" 24 24 25 APIRET APIENTRY DosAliasMem(PVOID pb, ULONG cb, PPVOID ppbAlias, ULONG fl); 26 27 //****************************************************************************** 28 //****************************************************************************** 29 DWORD OSLibDosAliasMem(LPVOID pb, ULONG cb, LPVOID *ppbAlias, ULONG fl) 30 { 31 return DosAliasMem(pb, cb, ppbAlias, fl); 32 } 25 33 //****************************************************************************** 26 34 //****************************************************************************** 27 35 DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD size, DWORD flags) 28 36 { 29 // return DosAllocMem(lplpMemAddr, size, flags | flAllocMem); 30 return DosAllocMem(lplpMemAddr, size, flags); 37 return DosAllocMem(lplpMemAddr, size, flags | flAllocMem); 31 38 } 32 39 //****************************************************************************** -
trunk/src/kernel32/oslibdos.h
r707 r712 1 /* $Id: oslibdos.h,v 1. 2 1999-08-26 15:05:14sandervl Exp $ */1 /* $Id: oslibdos.h,v 1.3 1999-08-27 16:51:00 sandervl Exp $ */ 2 2 3 3 /* … … 14 14 15 15 16 DWORD OSLibDosAliasMem(LPVOID pb, ULONG cb, LPVOID *ppbAlias, ULONG fl); 16 17 DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD size, DWORD flags); 17 18 DWORD OSLibDosFreeMem(LPVOID lpMemAddr); -
trunk/src/kernel32/virtual.cpp
r708 r712 1 /* $Id: virtual.cpp,v 1.1 0 1999-08-26 17:56:26sandervl Exp $ */1 /* $Id: virtual.cpp,v 1.11 1999-08-27 16:51:01 sandervl Exp $ */ 2 2 3 3 /* … … 149 149 { 150 150 Win32MemMap *map; 151 DWORD offset; 151 152 152 153 if (!base) … … 155 156 return FALSE; 156 157 } 157 map = Win32MemMap ::findMap((ULONG)base);158 map = Win32MemMapView::findMapByView((ULONG)base, &offset, MEMMAP_ACCESS_READ); 158 159 if(map == NULL) { 159 160 SetLastError( ERROR_FILE_NOT_FOUND ); 160 161 return FALSE; 161 162 } 162 return map->flushView( (LPVOID)base, cbFlush);163 return map->flushView(offset, cbFlush); 163 164 } 164 165 … … 179 180 { 180 181 Win32MemMap *map; 182 Win32MemMapView *view; 183 184 DWORD offset; 181 185 182 186 if (!addr) … … 185 189 return FALSE; 186 190 } 187 map = Win32MemMap ::findMap((ULONG)addr);191 map = Win32MemMapView::findMapByView((ULONG)addr, &offset, MEMMAP_ACCESS_READ, &view); 188 192 if(map == NULL) { 189 193 SetLastError( ERROR_FILE_NOT_FOUND ); 190 194 return FALSE; 191 195 } 192 return map->unmapViewOfFile( );196 return map->unmapViewOfFile(view); 193 197 } 194 198 … … 461 465 return 0; 462 466 } 463 cbRangeSize = cbLength; 467 468 cbRangeSize = cbLength & ~0xFFF; 469 if(cbLength & 0xFFF) { 470 cbRangeSize += PAGE_SIZE; 471 } 464 472 rc = OSLibDosQueryMem((LPVOID)lpvAddress, &cbRangeSize, &dAttr); 465 473 if(rc) { -
trunk/src/kernel32/windll.cpp
r705 r712 1 /* $Id: windll.cpp,v 1.1 6 1999-08-26 12:55:37sandervl Exp $ */1 /* $Id: windll.cpp,v 1.17 1999-08-27 16:51:01 sandervl Exp $ */ 2 2 3 3 /* … … 32 32 #include "vmutex.h" 33 33 #include "oslibmisc.h" 34 #include "oslibdos.h" 34 35 35 36 VMutex dlllistmutex; //protects linked lists of heaps … … 165 166 char modname[CCHMAXPATH]; 166 167 char *syspath; 167 FILE *dllfile;168 HFILE dllfile; 168 169 APIRET rc; 169 170 BOOL fRet; … … 175 176 strcat(szFileName,".DLL"); 176 177 } 177 dllfile = fopen(szFileName, "r");178 dllfile = OSLibDosOpen(szFileName, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE); 178 179 if(dllfile == NULL) {//search in libpath for dll 179 180 syspath = getenv("WIN32LIBPATH"); … … 187 188 } 188 189 } 189 else fclose(dllfile);190 else OSLibDosClose(dllfile); 190 191 if(isPEImage(szFileName) == TRUE) { 191 192 fRet = Win32Image::init(0); -
trunk/src/kernel32/winimage.cpp
r705 r712 1 /* $Id: winimage.cpp,v 1.1 7 1999-08-26 12:55:37sandervl Exp $ */1 /* $Id: winimage.cpp,v 1.18 1999-08-27 16:51:01 sandervl Exp $ */ 2 2 3 3 /* … … 200 200 IMAGE_TLS_DIRECTORY *tlsDir = NULL; 201 201 int nSections, i; 202 char szFullPath[CCHMAXPATH] = ""; 202 203 203 204 fImgMapping = VIRTUAL_MapFileA(szFileName, &win32file); … … 207 208 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE); 208 209 goto failure; 210 } 211 212 if(DosQueryPathInfo(szFileName, FIL_QUERYFULLNAME, szFullPath, sizeof(szFullPath)) == 0) { 213 setFullPath(szFullPath); 209 214 } 210 215 … … 425 430 } 426 431 } 427 428 if(processImports((char *)win32file) == FALSE) {429 fout << "Failed to process imports!" << endl;430 goto failure;431 }432 433 432 if(fh.Characteristics & IMAGE_FILE_DLL) { 434 433 if(processExports((char *)win32file) == FALSE) { … … 437 436 } 438 437 } 438 439 if(processImports((char *)win32file) == FALSE) { 440 fout << "Failed to process imports!" << endl; 441 goto failure; 442 } 443 439 444 IMAGE_SECTION_HEADER sh; 440 445 if(GetSectionHdrByName (win32file, &sh, ".rsrc")) { … … 797 802 apiaddr = WinDll->getApi(ordinal); 798 803 if(apiaddr == 0) { 799 fout << "--->>> NOT FOUND!";800 *import = (ULONG)MissingApi;804 fout << "--->>> NOT FOUND!"; 805 *import = (ULONG)MissingApi; 801 806 } 802 807 else *import = apiaddr; … … 812 817 apiaddr = WinDll->getApi(impname); 813 818 if(apiaddr == 0) { 814 fout << "--->>> NOT FOUND!";815 *import = (ULONG)MissingApi;819 fout << "--->>> NOT FOUND!"; 820 *import = (ULONG)MissingApi; 816 821 } 817 822 else *import = apiaddr; -
trunk/src/kernel32/wprocess.cpp
r705 r712 1 /* $Id: wprocess.cpp,v 1. 29 1999-08-26 12:55:38sandervl Exp $ */1 /* $Id: wprocess.cpp,v 1.30 1999-08-27 16:51:01 sandervl Exp $ */ 2 2 3 3 /* … … 234 234 winexe->setTLSCallBackAddr(TlsCallbackAddr); 235 235 236 char *modname = getenv("WIN32MODULE");237 238 if(modname != NULL)239 {240 dprintf(("Set full path for exe to %s", modname));241 winexe->setFullPath(modname);242 }243 236 winexe->start(); 244 237 }
Note:
See TracChangeset
for help on using the changeset viewer.