Ignore:
Timestamp:
Aug 24, 1999, 2:23:54 PM (26 years ago)
Author:
sandervl
Message:

VirtualQuery implemented + preliminary memory mapped code

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:10 sandervl Exp $ */
     1/* $Id: os2native.cpp,v 1.6 1999-08-24 12:23:24 sandervl Exp $ */
    22
    33/*
     
    88 * Copyright 1998 Peter FitzSimmons
    99 *
     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)
    1014 *
    1115 * Project Odin Software License can be found in LICENSE.TXT
     
    3741#define PAGE_GUARD            0x100
    3842#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
    4462
    4563extern ULONG flAllocMem;    /* Tue 03.03.1998: knut */
     
    8199  if(fdwProtect & PAGE_READONLY)     flag |= PAG_READ;
    82100  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
    84107  if(fdwProtect & PAGE_GUARD)        flag |= PAG_GUARD;
    85108
    86109  //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"));
    88112        flag |= PAG_READ | PAG_WRITE;
     113  }
    89114
    90115  if(fdwAllocationType & MEM_COMMIT && lpvAddress != NULL) {
     
    168193//******************************************************************************
    169194BOOL WIN32API VirtualProtect(LPVOID lpvAddress, DWORD cbSize, DWORD fdwNewProtect,
    170                                 DWORD *pfdwOldProtect)
     195                             DWORD *pfdwOldProtect)
    171196{
    172197 APIRET rc;
     
    188213  if(pageFlags & PAG_READ && !(pageFlags & PAG_WRITE))
    189214        *pfdwOldProtect |= PAGE_READONLY;
    190   if(pageFlags & (PAG_READ | PAG_WRITE))
     215  if(pageFlags & (PAG_WRITE))
    191216        *pfdwOldProtect |= PAGE_READWRITE;
     217
     218  if(pageFlags & (PAG_WRITE | PAG_EXECUTE))
     219        *pfdwOldProtect |= PAGE_EXECUTE_READWRITE;
     220  else
    192221  if(pageFlags & PAG_EXECUTE)
    193222        *pfdwOldProtect |= PAGE_EXECUTE_READ;
     223
    194224  if(pageFlags & PAG_GUARD)
    195225        *pfdwOldProtect |= PAGE_GUARD;
     
    198228  if(fdwNewProtect & PAGE_READONLY)     pageFlags |= PAG_READ;
    199229  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);
    201232  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);
    203236  if(fdwNewProtect & PAGE_GUARD)        pageFlags |= PAG_GUARD;
    204237//Not supported in OS/2??
     
    224257}
    225258//******************************************************************************
    226 #define PMEMORY_BASIC_INFORMATION void *
    227259//******************************************************************************
    228260DWORD 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);
    233323}
    234324//******************************************************************************
     
    307397                                  LPDWORD pfdwOldProtect)
    308398{
    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",
    310400           hProcess,
    311401           lpvAddress,
     
    314404           pfdwOldProtect));
    315405
    316   return (FALSE);
     406  return VirtualProtect(lpvAddress, cbSize, fdwNewProtect, pfdwOldProtect);
    317407}
    318408
     
    339429                                 DWORD   cbLength)
    340430{
    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",
    342432           hProcess,
    343433           lpvAddress,
     
    345435           cbLength));
    346436
    347   return (0);
    348 }
    349 
     437  return VirtualQuery(lpvAddress, pmbiBuffer, cbLength);
     438}
     439
Note: See TracChangeset for help on using the changeset viewer.