Changeset 657 for trunk/src/kernel32/os2native.cpp
- Timestamp:
- Aug 24, 1999, 2:23:54 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/os2native.cpp
r617 r657 1 /* $Id: os2native.cpp,v 1. 5 1999-08-22 11:11:10sandervl Exp $ */1 /* $Id: os2native.cpp,v 1.6 1999-08-24 12:23:24 sandervl Exp $ */ 2 2 3 3 /* … … 8 8 * Copyright 1998 Peter FitzSimmons 9 9 * 10 * 11 * TODO: VirtualProtectEx/VirtualQueryEx don't work for different processes! 12 * TODO: SetLastError should be called! 13 * TODO: WRITECOPY type not properly supported (never return as flag when queried) 10 14 * 11 15 * Project Odin Software License can be found in LICENSE.TXT … … 37 41 #define PAGE_GUARD 0x100 38 42 #define PAGE_NOCACHE 0x200 39 #define MEM_COMMIT 0x1000 40 #define MEM_RESERVE 0x2000 41 #define MEM_DECOMMIT 0x4000 42 #define MEM_RELEASE 0x8000 43 #define MEM_TOP_DOWN 0x100000 //Ignored 43 44 #define MEM_COMMIT 0x00001000 45 #define MEM_RESERVE 0x00002000 46 #define MEM_DECOMMIT 0x00004000 47 #define MEM_RELEASE 0x00008000 48 #define MEM_FREE 0x00010000 49 #define MEM_PRIVATE 0x00020000 50 #define MEM_MAPPED 0x00040000 51 #define MEM_TOP_DOWN 0x00100000 52 53 #define SEC_FILE 0x00800000 54 #define SEC_IMAGE 0x01000000 55 #define SEC_RESERVE 0x04000000 56 #define SEC_COMMIT 0x08000000 57 #define SEC_NOCACHE 0x10000000 58 59 #ifndef PAGE_SIZE 60 #define PAGE_SIZE 4096 61 #endif 44 62 45 63 extern ULONG flAllocMem; /* Tue 03.03.1998: knut */ … … 81 99 if(fdwProtect & PAGE_READONLY) flag |= PAG_READ; 82 100 if(fdwProtect & PAGE_READWRITE) flag |= (PAG_READ | PAG_WRITE); 83 if(fdwProtect & PAGE_EXECUTE_READ) flag |= PAG_EXECUTE; 101 if(fdwProtect & PAGE_WRITECOPY) flag |= (PAG_READ | PAG_WRITE); 102 103 if(fdwProtect & PAGE_EXECUTE_READWRITE) flag |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 104 if(fdwProtect & PAGE_EXECUTE_READ) flag |= (PAG_EXECUTE | PAG_READ); 105 if(fdwProtect & PAGE_EXECUTE) flag |= PAG_EXECUTE; 106 84 107 if(fdwProtect & PAGE_GUARD) flag |= PAG_GUARD; 85 108 86 109 //just do this if other options are used 87 if(!(flag & (PAG_READ | PAG_WRITE | PAG_EXECUTE)) || flag == 0) 110 if(!(flag & (PAG_READ | PAG_WRITE | PAG_EXECUTE)) || flag == 0) { 111 dprintf(("VirtualAlloc: Unknown protection flags, default to read/write")); 88 112 flag |= PAG_READ | PAG_WRITE; 113 } 89 114 90 115 if(fdwAllocationType & MEM_COMMIT && lpvAddress != NULL) { … … 168 193 //****************************************************************************** 169 194 BOOL WIN32API VirtualProtect(LPVOID lpvAddress, DWORD cbSize, DWORD fdwNewProtect, 170 195 DWORD *pfdwOldProtect) 171 196 { 172 197 APIRET rc; … … 188 213 if(pageFlags & PAG_READ && !(pageFlags & PAG_WRITE)) 189 214 *pfdwOldProtect |= PAGE_READONLY; 190 if(pageFlags & (PAG_ READ | PAG_WRITE))215 if(pageFlags & (PAG_WRITE)) 191 216 *pfdwOldProtect |= PAGE_READWRITE; 217 218 if(pageFlags & (PAG_WRITE | PAG_EXECUTE)) 219 *pfdwOldProtect |= PAGE_EXECUTE_READWRITE; 220 else 192 221 if(pageFlags & PAG_EXECUTE) 193 222 *pfdwOldProtect |= PAGE_EXECUTE_READ; 223 194 224 if(pageFlags & PAG_GUARD) 195 225 *pfdwOldProtect |= PAGE_GUARD; … … 198 228 if(fdwNewProtect & PAGE_READONLY) pageFlags |= PAG_READ; 199 229 if(fdwNewProtect & PAGE_READWRITE) pageFlags |= (PAG_READ | PAG_WRITE); 200 if(fdwNewProtect & PAGE_EXECUTE_READ) pageFlags |= PAG_EXECUTE; 230 if(fdwNewProtect & PAGE_WRITECOPY) pageFlags |= (PAG_READ | PAG_WRITE); 231 if(fdwNewProtect & PAGE_EXECUTE_READ) pageFlags |= (PAG_EXECUTE | PAG_READ); 201 232 if(fdwNewProtect & PAGE_EXECUTE_READWRITE) 202 pageFlags |= (PAG_EXECUTE | PAG_WRITE); 233 pageFlags |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 234 if(fdwNewProtect & PAGE_EXECUTE_WRITECOPY) 235 pageFlags |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 203 236 if(fdwNewProtect & PAGE_GUARD) pageFlags |= PAG_GUARD; 204 237 //Not supported in OS/2?? … … 224 257 } 225 258 //****************************************************************************** 226 #define PMEMORY_BASIC_INFORMATION void *227 259 //****************************************************************************** 228 260 DWORD WIN32API VirtualQuery(LPVOID lpvAddress, PMEMORY_BASIC_INFORMATION pmbiBuffer, 229 DWORD cbLength) 230 { 231 dprintf(("VirtualQuery - stub\n")); 232 return(0); 261 DWORD cbLength) 262 { 263 ULONG cbRangeSize, dAttr; 264 APIRET rc; 265 266 if(lpvAddress == NULL || pmbiBuffer == NULL || cbLength == 0) { 267 return 0; 268 } 269 cbRangeSize = cbLength; 270 rc = DosQueryMem(lpvAddress, &cbRangeSize, &dAttr); 271 if(rc) { 272 dprintf(("VirtualQuery - DosQueryMem %x %x returned %d\n", lpvAddress, cbLength, rc)); 273 return 0; 274 } 275 memset(pmbiBuffer, 0, sizeof(MEMORY_BASIC_INFORMATION)); 276 pmbiBuffer->BaseAddress = lpvAddress; 277 pmbiBuffer->RegionSize = cbRangeSize; 278 if(dAttr & PAG_READ && !(dAttr & PAG_WRITE)) 279 pmbiBuffer->Protect |= PAGE_READONLY; 280 if(dAttr & PAG_WRITE) 281 pmbiBuffer->Protect |= PAGE_READWRITE; 282 283 if(dAttr & (PAG_WRITE | PAG_EXECUTE)) 284 pmbiBuffer->Protect |= PAGE_EXECUTE_READWRITE; 285 else 286 if(dAttr & PAG_EXECUTE) 287 pmbiBuffer->Protect |= PAGE_EXECUTE_READ; 288 289 if(dAttr & PAG_GUARD) 290 pmbiBuffer->Protect |= PAGE_GUARD; 291 292 if(dAttr & PAG_FREE) 293 pmbiBuffer->State = MEM_FREE; 294 else 295 if(dAttr & PAG_COMMIT) 296 pmbiBuffer->State = MEM_COMMIT; 297 else pmbiBuffer->State = MEM_RESERVE; 298 299 if(!(dAttr & PAG_SHARED)) 300 pmbiBuffer->Type = MEM_PRIVATE; 301 302 //TODO: This is not correct: AllocationProtect should contain the protection 303 // flags used in the initial call to VirtualAlloc 304 pmbiBuffer->AllocationProtect = pmbiBuffer->Protect; 305 if(dAttr & PAG_BASE) { 306 pmbiBuffer->AllocationBase = lpvAddress; 307 } 308 else { 309 while(lpvAddress > 0) { 310 rc = DosQueryMem(lpvAddress, &cbRangeSize, &dAttr); 311 if(rc) { 312 dprintf(("VirtualQuery - DosQueryMem %x %x returned %d\n", lpvAddress, cbLength, rc)); 313 break; 314 } 315 if(dAttr & PAG_BASE) { 316 pmbiBuffer->AllocationBase = lpvAddress; 317 break; 318 } 319 lpvAddress = (LPVOID)((ULONG)lpvAddress - PAGE_SIZE); 320 } 321 } 322 return sizeof(MEMORY_BASIC_INFORMATION); 233 323 } 234 324 //****************************************************************************** … … 307 397 LPDWORD pfdwOldProtect) 308 398 { 309 dprintf(("KERNEL32: VirtualProtectEx(%08x,%08xh,%08xh,%08xh,%08xh) not implemented .\n",399 dprintf(("KERNEL32: VirtualProtectEx(%08x,%08xh,%08xh,%08xh,%08xh) not implemented for different processes.\n", 310 400 hProcess, 311 401 lpvAddress, … … 314 404 pfdwOldProtect)); 315 405 316 return (FALSE);406 return VirtualProtect(lpvAddress, cbSize, fdwNewProtect, pfdwOldProtect); 317 407 } 318 408 … … 339 429 DWORD cbLength) 340 430 { 341 dprintf(("KERNEL32: VirtualQueryEx(%08x,%08xh,%08xh,%08xh) not implemented .\n",431 dprintf(("KERNEL32: VirtualQueryEx(%08x,%08xh,%08xh,%08xh) not implemented for different processes.\n", 342 432 hProcess, 343 433 lpvAddress, … … 345 435 cbLength)); 346 436 347 return (0);348 } 349 437 return VirtualQuery(lpvAddress, pmbiBuffer, cbLength); 438 } 439
Note:
See TracChangeset
for help on using the changeset viewer.