- Timestamp:
- Jul 1, 2000, 11:50:55 AM (25 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmfile.cpp
r3765 r3782 1 /* $Id: hmfile.cpp,v 1. 7 2000-06-28 18:08:34 sandervl Exp $ */1 /* $Id: hmfile.cpp,v 1.8 2000-07-01 09:50:54 sandervl Exp $ */ 2 2 3 3 /* … … 425 425 //SvL: DosRead doesn't like writing to memory addresses returned by 426 426 // DosAliasMem -> search for original memory mapped pointer and use 427 // that one 428 map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_ READ);427 // that one + commit pages if not already present 428 map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_WRITE); 429 429 if(map) { 430 430 lpRealBuf = (LPVOID)((ULONG)map->getMappingAddr() + offset); … … 432 432 if(offset & 0xfff) 433 433 nrpages++; 434 else435 434 if(nNumberOfBytesToRead & 0xfff) 436 435 nrpages++; … … 519 518 LPOVERLAPPED lpOverlapped) 520 519 { 521 BOOL bRC; 520 LPVOID lpRealBuf; 521 Win32MemMap *map; 522 DWORD offset; 523 BOOL bRC; 522 524 523 525 dprintfl(("KERNEL32: HMDeviceFileClass::WriteFile %s(%08x,%08x,%08x,%08x,%08x) - stub?\n", … … 538 540 } 539 541 542 //SvL: DosWrite doesn't like reading from memory addresses returned by 543 // DosAliasMem -> search for original memory mapped pointer and use 544 // that one + commit pages if not already present 545 map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_READ); 546 if(map) { 547 lpRealBuf = (LPVOID)((ULONG)map->getMappingAddr() + offset); 548 DWORD nrpages = nNumberOfBytesToWrite/4096; 549 if(offset & 0xfff) 550 nrpages++; 551 if(nNumberOfBytesToWrite & 0xfff) 552 nrpages++; 553 554 map->commitPage(offset & ~0xfff, TRUE, nrpages); 555 } 556 else lpRealBuf = (LPVOID)lpBuffer; 557 540 558 if(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) { 541 559 dprintf(("ERROR: Overlapped IO not yet implememented!!")); … … 543 561 // else { 544 562 bRC = OSLibDosWrite(pHMHandleData->hHMHandle, 545 (PVOID)lp Buffer,563 (PVOID)lpRealBuf, 546 564 nNumberOfBytesToWrite, 547 565 lpNumberOfBytesWritten); -
trunk/src/kernel32/mmap.cpp
r3609 r3782 1 /* $Id: mmap.cpp,v 1.4 1 2000-05-26 18:42:55 sandervl Exp $ */1 /* $Id: mmap.cpp,v 1.42 2000-07-01 09:50:55 sandervl Exp $ */ 2 2 3 3 /* … … 197 197 198 198 dprintf(("Win32MemMap::commitPage %x (faultaddr %x)", pageAddr, lpPageFaultAddr)); 199 if(hMemFile != -1) { 200 // for(i=0;i<nrpages;i++) { 199 if(hMemFile != -1) 200 { 201 int faultsize = nrpages*PAGE_SIZE; 202 203 offset = pageAddr - (ULONG)pMapping; 204 if(offset + faultsize > mSize) { 205 faultsize = mSize - offset; 206 } 207 208 while(faultsize) { 201 209 if(VirtualQuery((LPSTR)pageAddr, &memInfo, sizeof(MEMORY_BASIC_INFORMATION)) == 0) { 202 210 dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, nrpages*PAGE_SIZE)); 203 211 goto fail; 204 212 } 205 memInfo.RegionSize = min(memInfo.RegionSize, nrpages*PAGE_SIZE);213 memInfo.RegionSize = min(memInfo.RegionSize, faultsize); 206 214 //Only changes the state of the pages with the same attribute flags 207 215 //(returned in memInfo.RegionSize) 208 216 //If it's smaller than the mNrPages, it simply means one or more of the 209 217 //other pages have already been committed 210 if(memInfo.State & MEM_COMMIT) 211 {//if it's already committed, then the app tried to write to it 212 if(!fWriteAccess) { 213 dprintf(("Win32MemMap::commitPage: Huh? Already committed and not trying to write (%x,%x) failed for %x", pageAddr, memInfo.RegionSize)); 214 goto fail; 215 } 216 if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) { 217 dprintf(("Win32MemMap::commitPage: Failed to set write flag on page (%x,%x) failed for %x", pageAddr, memInfo.RegionSize)); 218 goto fail; 219 } 220 } 221 else { 218 if(!(memInfo.State & MEM_COMMIT)) 219 { 222 220 if(VirtualAlloc((LPVOID)pageAddr, memInfo.RegionSize, MEM_COMMIT, PAGE_READWRITE) == FALSE) { 223 221 goto fail; … … 243 241 } 244 242 } 245 if( mProtFlags!= PAGE_READWRITE) {243 if(newProt != PAGE_READWRITE) { 246 244 if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) { 247 245 goto fail; … … 249 247 } 250 248 } 251 // pageAddr += PAGE_SIZE; 252 // } 249 faultsize -= memInfo.RegionSize; 250 pageAddr += memInfo.RegionSize; 251 } 253 252 } 254 253 else { 255 254 ULONG sizeleft = nrpages*PAGE_SIZE; 256 while(sizeleft) {257 255 while(sizeleft) 256 { 258 257 if(VirtualQuery((LPSTR)pageAddr, &memInfo, sizeof(MEMORY_BASIC_INFORMATION)) == 0) { 259 258 dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed", pageAddr, sizeleft));
Note:
See TracChangeset
for help on using the changeset viewer.