Changeset 657 for trunk/src


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

VirtualQuery implemented + preliminary memory mapped code

Location:
trunk/src/kernel32
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/makefile

    r646 r657  
    1 # $Id: makefile,v 1.26 1999-08-23 13:54:43 sandervl Exp $
     1# $Id: makefile,v 1.27 1999-08-24 12:23:24 sandervl Exp $
    22
    33#
     
    2020
    2121OBJS = KERNEL32.OBJ KOBJECTS.OBJ CONSOLE.OBJ CONIN.OBJ CONBUFFER.OBJ \
    22        CONOUT.OBJ UNICODE.OBJ network.OBJ DEVIO.OBJ profile.obj \
    23        THREAD.OBJ virtual.obj THUNK.OBJ OBSOLETE.OBJ COMM.OBJ \
    24        MESSAGE.OBJ RESOURCE.OBJ NAMEID.OBJ WINRES.OBJ WINMOD.OBJ \
    25        OS2NATIVE.OBJ EXCEPTIONS.OBJ LFILE.OBJ NPIPE.OBJ \
    26        MISC.OBJ EXCEPTUTIL.OBJ LANG.OBJ ICCIO.OBJ MAP.OBJ \
    27        WIN32UTIL.OBJ heap.OBJ heapstring.obj os2heap.OBJ \
    28        vmutex.OBJ initterm.OBJ os2util.OBJ handlemanager.OBJ \
    29        hmdevice.obj hmopen32.obj hmobjects.obj hmevent.obj \
    30        hmmutex.obj hmsemaphore.obj wprocess.OBJ conprop.OBJ \
    31        winimage.OBJ windll.OBJ winexe.OBJ time.obj \
    32        pefile.OBJ winimgres.OBJ wintls.obj async.OBJ fileio.obj \
    33        atom.obj disk.obj directory.obj cvtbitmap.obj \
    34        cvtmenu.obj cvtaccel.obj cvticon.obj cvticongrp.obj \
    35        cvtcursor.obj cvtcursorgrp.obj stubs.obj
     22 CONOUT.OBJ UNICODE.OBJ network.OBJ DEVIO.OBJ profile.obj \
     23 THREAD.OBJ virtual.obj THUNK.OBJ OBSOLETE.OBJ COMM.OBJ \
     24 MESSAGE.OBJ RESOURCE.OBJ NAMEID.OBJ WINRES.OBJ WINMOD.OBJ \
     25 OS2NATIVE.OBJ EXCEPTIONS.OBJ LFILE.OBJ NPIPE.OBJ \
     26 MISC.OBJ EXCEPTUTIL.OBJ LANG.OBJ ICCIO.OBJ MAP.OBJ \
     27 WIN32UTIL.OBJ heap.OBJ heapstring.obj os2heap.OBJ \
     28 vmutex.OBJ initterm.OBJ os2util.OBJ handlemanager.OBJ \
     29 hmdevice.obj hmopen32.obj hmobjects.obj hmevent.obj \
     30 hmmutex.obj hmsemaphore.obj wprocess.OBJ conprop.OBJ \
     31 winimage.OBJ windll.OBJ winexe.OBJ time.obj mmap.obj \
     32 pefile.OBJ winimgres.OBJ wintls.obj async.OBJ fileio.obj \
     33 atom.obj disk.obj directory.obj cvtbitmap.obj \
     34 cvtmenu.obj cvtaccel.obj cvticon.obj cvticongrp.obj \
     35 cvtcursor.obj cvtcursorgrp.obj stubs.obj
    3636
    3737
     
    296296        $(PDWIN32_INCLUDE)\unicode.h
    297297
    298 virtual.obj:   virtual.cpp $(PDWIN32_INCLUDE)\win\virtual.h
     298virtual.obj:   virtual.cpp $(PDWIN32_INCLUDE)\win\virtual.h mmap.h
     299mmap.obj:      mmap.cpp mmap.h $(PDWIN32_INCLUDE)\vmutex.h
    299300
    300301pefile.OBJ:    pefile.cpp $(PDWIN32_INCLUDE)\pefile.h
  • 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
  • trunk/src/kernel32/virtual.cpp

    r607 r657  
    1 /* $Id: virtual.cpp,v 1.1 1999-08-21 16:30:31 sandervl Exp $ */
     1/* $Id: virtual.cpp,v 1.2 1999-08-24 12:23:25 sandervl Exp $ */
    22
    33/*
    44 * Win32 virtual memory functions
    55 *
    6  * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl) (OS/2 Port)
    7  *
    8  * NOTE: Quick 'n dirty implementation (read entire file in memory)
    9  *       Not tested, nor complete (write mapping & protection)
    10  *
    11  * Based on Wine code (memory\virtual.c):
     6 * Copyright 1999 Sander van Leeuwen (sandervl@xs4all.nl)
     7 *
     8 * Parts (VIRTUAL_MapFileA/W) based on Wine code (memory\virtual.c):
    129 *
    1310 * Copyright 1997 Alexandre Julliard
     
    2219#include <win\virtual.h>
    2320#include <heapstring.h>
    24 
     21#include "mmap.h"
    2522
    2623/***********************************************************************
     
    4340 HANDLE dupHandle;
    4441
    45      if(DuplicateHandle(GetCurrentProcess(), hFile, GetCurrentProcess(),
     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(),
    4652                        &dupHandle, 0, FALSE, DUPLICATE_SAME_ACCESS) == FALSE)
    47      {
    48                 dprintf(("CreateFileMappingA: DuplicateHandle failed!"));
    49                 return 0;
    50      }
    51      return     dupHandle;
     53   {
     54        dprintf(("CreateFileMappingA: DuplicateHandle failed!"));
     55        return 0;
     56   }
     57   return dupHandle;
    5258}
    5359
     
    239245    LPVOID ptr = NULL;
    240246
    241     hFile = CreateFileA( name, GENERIC_READ, FILE_SHARE_READ, NULL,
    242                            OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0);
     247    hFile = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, NULL,
     248                        OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0);
    243249    if (hFile != INVALID_HANDLE_VALUE)
    244250    {
  • trunk/src/kernel32/vmutex.cpp

    r120 r657  
    1 /* $Id: vmutex.cpp,v 1.4 1999-06-19 10:54:43 sandervl Exp $ */
     1/* $Id: vmutex.cpp,v 1.5 1999-08-24 12:23:25 sandervl Exp $ */
    22
    3 /*
    4  *
    5  * Project Odin Software License can be found in LICENSE.TXT
    6  *
    7  */
    83/*
    94 * Mutex class
    105 *
    116 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
     7 *
     8 *
     9 * Project Odin Software License can be found in LICENSE.TXT
    1210 *
    1311 */
     
    2018/******************************************************************************/
    2119/******************************************************************************/
    22 _Export VMutex::VMutex() : waiting(0)
     20VMutex::VMutex() : waiting(0)
    2321{
    2422 APIRET rc;
     
    3230/******************************************************************************/
    3331/******************************************************************************/
    34 _Export VMutex::~VMutex()
     32VMutex::~VMutex()
    3533{
    3634 int i;
     
    4543/******************************************************************************/
    4644/******************************************************************************/
    47 void _Export VMutex::enter(ULONG timeout)
     45void VMutex::enter(ULONG timeout)
    4846{
    4947  if(sem_handle) {
     
    5553/******************************************************************************/
    5654/******************************************************************************/
    57 void _Export VMutex::leave()
     55void VMutex::leave()
    5856{
    5957  DosReleaseMutexSem(sem_handle);
Note: See TracChangeset for help on using the changeset viewer.