Changeset 678 for trunk/src


Ignore:
Timestamp:
Aug 25, 1999, 12:28:41 PM (26 years ago)
Author:
sandervl
Message:

Put back handlemanager changes + memory mapped file changes

Location:
trunk/src/kernel32
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/HandleManager.cpp

    r673 r678  
    1 /* $Id: HandleManager.cpp,v 1.14 1999-08-25 08:55:17 phaller Exp $ */
     1/* $Id: HandleManager.cpp,v 1.15 1999-08-25 10:28:39 sandervl Exp $ */
    22
    33/*
     
    22792279                                                  /* call the device handler */
    22802280  rc = pDeviceHandler->OpenFileMapping(&TabWin32Handles[iIndexNew].hmHandleData,
    2281                                        fdwAccess,
     2281                                       fdwAccess,
    22822282                                       fInherit,
    22832283                                       lpName);
     
    22902290
    22912291  return iIndexNew;                                   /* return valid handle */
    2292 }
    2293 
    2294 
    2295 /*****************************************************************************
    2296  * Name      : HMMapViewOfFile
    2297  * Purpose   : router function for MapViewOfFile
    2298  * Parameters:
    2299  * Variables :
    2300  * Result    :
    2301  * Remark    :
    2302  * Status    :
    2303  *
    2304  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    2305  *****************************************************************************/
    2306 
    2307 LPVOID HMMapViewOfFile(HANDLE hFileMappingObject,
    2308                        DWORD  dwDesiredAccess,
    2309                        DWORD  dwFileOffsetHigh,
    2310                        DWORD  dwFileOffsetLow,
    2311                        DWORD  dwNumberOfBytesToMap)
    2312 {
    2313   int       iIndex;                           /* index into the handle table */
    2314   LPVOID    lpResult;                /* result from the device handler's API */
    2315   PHMHANDLE pHMHandle;       /* pointer to the handle structure in the table */
    2316 
    2317                                                           /* validate handle */
    2318   iIndex = _HMHandleQuery(hFileMappingObject);              /* get the index */
    2319   if (-1 == iIndex)                                               /* error ? */
    2320   {
    2321     SetLastError(ERROR_INVALID_HANDLE);       /* set win32 error information */
    2322     return (NULL);                                         /* signal failure */
    2323   }
    2324 
    2325   pHMHandle = &TabWin32Handles[iIndex];               /* call device handler */
    2326   lpResult = pHMHandle->pDeviceHandler->MapViewOfFile(&pHMHandle->hmHandleData,
    2327                                                       dwDesiredAccess,
    2328                                                       dwFileOffsetHigh,
    2329                                                       dwFileOffsetLow,
    2330                                                       dwNumberOfBytesToMap);
    2331 
    2332   return (lpResult);                                  /* deliver return code */
    23332292}
    23342293
     
    23762335}
    23772336
    2378 
    2379 /*****************************************************************************
    2380  * Name      : HMUnmapViewOfFile
    2381  * Purpose   : router function for UnmapViewOfFile
    2382  * Parameters:
    2383  * Variables :
    2384  * Result    :
    2385  * Remark    :
    2386  * Status    :
    2387  *
    2388  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    2389  *****************************************************************************/
    2390 
    2391 BOOL HMUnmapViewOfFile(LPVOID lpBaseAddress)
    2392 {
    2393   int       iIndex;                           /* index into the handle table */
    2394   BOOL      bResult;                 /* result from the device handler's API */
    2395   PHMHANDLE pHMHandle;       /* pointer to the handle structure in the table */
    2396 
    2397                                                           /* validate handle */
    2398   iIndex = HMDeviceMemMapClass::findByBaseAddress(lpBaseAddress);
    2399   if (-1 == iIndex)                                               /* error ? */
    2400   {
    2401     SetLastError(ERROR_INVALID_HANDLE);       /* set win32 error information */
    2402     return (NULL);                                         /* signal failure */
    2403   }
    2404 
    2405   bResult = pHMHandle->pDeviceHandler->UnmapViewOfFile(&pHMHandle->hmHandleData,
    2406                                                        lpBaseAddress);
    2407 
    2408   return (bResult);                                   /* deliver return code */
    2409 }
    2410 
    2411 
    2412 /*****************************************************************************
    2413  * Name      : HMFlushViewOfFile
    2414  * Purpose   : router function for FlushViewOfFile
    2415  * Parameters:
    2416  * Variables :
    2417  * Result    :
    2418  * Remark    :
    2419  * Status    :
    2420  *
    2421  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    2422  *****************************************************************************/
    2423 
    2424 BOOL HMFlushViewOfFile(LPVOID lpBaseAddress,
    2425                        DWORD  dwNumberOfBytesToFlush)
    2426 {
    2427   int       iIndex;                           /* index into the handle table */
    2428   BOOL      bResult;                 /* result from the device handler's API */
    2429   PHMHANDLE pHMHandle;       /* pointer to the handle structure in the table */
    2430 
    2431                                                           /* validate handle */
    2432   iIndex = HMDeviceMemMapClass::findByBaseAddress(lpBaseAddress);
    2433   if (-1 == iIndex)                                               /* error ? */
    2434   {
    2435     SetLastError(ERROR_INVALID_HANDLE);       /* set win32 error information */
    2436     return (NULL);                                         /* signal failure */
    2437   }
    2438 
    2439   bResult = pHMHandle->pDeviceHandler->FlushViewOfFile(&pHMHandle->hmHandleData,
    2440                                                        lpBaseAddress,
    2441                                                        dwNumberOfBytesToFlush);
    2442 
    2443   return (bResult);                                  /* deliver return code */
    2444 }
    2445 
    2446 
    2447 
    24482337/*****************************************************************************
    24492338 * Name      : HMWaitForMultipleObjects
  • trunk/src/kernel32/exceptions.cpp

    r634 r678  
    1 /* $Id: exceptions.cpp,v 1.11 1999-08-22 22:11:21 sandervl Exp $ */
     1/* $Id: exceptions.cpp,v 1.12 1999-08-25 10:28:40 sandervl Exp $ */
    22
    33/*
     
    5656#include "exceptions.h"
    5757#include "exceptutil.h"
    58 #include "misc.h"
     58#include <misc.h>
     59#include "mmap.h"
    5960
    6061//Global Process Unhandled exception filter
     
    873874  switch(pERepRec->ExceptionNum)
    874875  {
    875     case XCPT_FLOAT_DENORMAL_OPERAND:
    876     case XCPT_FLOAT_DIVIDE_BY_ZERO:
    877     case XCPT_FLOAT_INEXACT_RESULT:
    878     case XCPT_FLOAT_INVALID_OPERATION:
    879     case XCPT_FLOAT_OVERFLOW:
    880     case XCPT_FLOAT_STACK_CHECK:
    881     case XCPT_FLOAT_UNDERFLOW:
    882       dprintf(("KERNEL32: OS2ExceptionHandler: FPU exception, fix and continue\n"));
    883                pCtxRec->ctx_env[0] |= 0x1F;
    884                pCtxRec->ctx_stack[0].losig = 0;
    885                pCtxRec->ctx_stack[0].hisig = 0;
    886                pCtxRec->ctx_stack[0].signexp = 0;
    887 
    888       return (XCPT_CONTINUE_EXECUTION);
    889 
    890     case XCPT_PROCESS_TERMINATE:
    891     case XCPT_ASYNC_PROCESS_TERMINATE:
    892       SetExceptionChain((ULONG)0);
    893       return (XCPT_CONTINUE_SEARCH);
     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"));
     884        pCtxRec->ctx_env[0] |= 0x1F;
     885        pCtxRec->ctx_stack[0].losig = 0;
     886        pCtxRec->ctx_stack[0].hisig = 0;
     887        pCtxRec->ctx_stack[0].signexp = 0;
     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);
    894895
    895896  case XCPT_ACCESS_VIOLATION:
     897  {     
     898   Win32MemMap *map;
     899 
     900        if(pERepRec->ExceptionInfo[1] == 0 && pERepRec->ExceptionInfo[1] == XCPT_DATA_UNKNOWN) {
     901                goto continueFail;
     902        }
     903        map = Win32MemMap::findMap(pERepRec->ExceptionInfo[0]);
     904        if(map == NULL) {
     905                goto continueFail;
     906        }
     907        switch(pERepRec->ExceptionInfo[0]) {
     908        case XCPT_READ_ACCESS:
     909                if(map->hasReadAccess() == FALSE) {
     910                        goto continueFail;
     911                }
     912                break;
     913        case XCPT_WRITE_ACCESS:
     914                if(map->hasWriteAccess() == FALSE) {
     915                        goto continueFail;
     916                }
     917                break;
     918        case XCPT_EXECUTE_ACCESS:
     919                if(map->hasExecuteAccess() == FALSE) {
     920                        goto continueFail;
     921                }
     922                break;
     923        default:
     924                goto continueFail;
     925        }
     926        //Might want to consider mapping more than one page if access is at
     927        //a high offset in the page
     928        if(map->commitPage((LPVOID)pERepRec->ExceptionInfo[1], 1) == TRUE)
     929                return (XCPT_CONTINUE_EXECUTION);
     930
     931        //no break;
     932  }
     933continueFail:
     934
    896935  case XCPT_BREAKPOINT:
    897936  case XCPT_ARRAY_BOUNDS_EXCEEDED:
     
    907946  case XCPT_IN_PAGE_ERROR:
    908947  case XCPT_SIGNAL:
    909     dprintf(("KERNEL32: OS2ExceptionHandler: Continue and kill\n"));
    910     pCtxRec->ctx_RegEip = (ULONG)KillWin32Process;
    911     pCtxRec->ctx_RegEsp = pCtxRec->ctx_RegEsp + 0x10;
    912     pCtxRec->ctx_RegEax = pERepRec->ExceptionNum;
    913     pCtxRec->ctx_RegEbx = pCtxRec->ctx_RegEip;
    914     return (XCPT_CONTINUE_EXECUTION);
     948        dprintf(("KERNEL32: OS2ExceptionHandler: Continue and kill\n"));
     949        pCtxRec->ctx_RegEip = (ULONG)KillWin32Process;
     950        pCtxRec->ctx_RegEsp = pCtxRec->ctx_RegEsp + 0x10;
     951        pCtxRec->ctx_RegEax = pERepRec->ExceptionNum;
     952        pCtxRec->ctx_RegEbx = pCtxRec->ctx_RegEip;
     953        return (XCPT_CONTINUE_EXECUTION);
    915954
    916955  default: //non-continuable exceptions
  • trunk/src/kernel32/hmdevice.cpp

    r673 r678  
    1 /* $Id: hmdevice.cpp,v 1.5 1999-08-25 08:55:18 phaller Exp $ */
     1/* $Id: hmdevice.cpp,v 1.6 1999-08-25 10:28:40 sandervl Exp $ */
    22
    33/*
     
    983983  dprintf(("KERNEL32: HandleManager::DeviceHandler::OpenFileMapping(%08xh,%08xh,%08xh,%08xh)\n",
    984984           pHMHandleData->hHMHandle,
    985            fdwAccess,
     985           fdwAccess,
    986986           fInherit,
    987987           lpName));
     
    10061006 *****************************************************************************/
    10071007
    1008 LPVOID HMDeviceHandler::MapViewOfFile(PHMHANDLEDATA pHMHandleData,
     1008LPVOID HMDeviceHandler::MapViewOfFileEx(PHMHANDLEDATA pHMHandleData,
    10091009                                      DWORD         dwDesiredAccess,
    10101010                                      DWORD         dwFileOffsetHigh,
    10111011                                      DWORD         dwFileOffsetLow,
    1012                                       DWORD         dwNumberOfBytesToMap)
    1013 {
    1014   dprintf(("KERNEL32: HandleManager::DeviceHandler::MapViewOfFile(%08xh,%08xh,%08xh,%08xh,%08xh)\n",
    1015            pHMHandleData->hHMHandle,
    1016            dwDesiredAccess,
    1017            dwFileOffsetHigh,
    1018            dwFileOffsetLow,
    1019            dwNumberOfBytesToMap));
    1020 
    1021   return(NULL);
    1022 }
    1023 
    1024 
    1025 /*****************************************************************************
    1026  * Name      : DWORD HMDeviceHandler::MapViewOfFileEx
    1027  * Purpose   : map memory mapped file
    1028  * Parameters: PHMHANDLEDATA pHMHandleData
    1029  *             DWORD         dwDesiredAccess,
    1030  *             DWORD         dwFileOffsetHigh,
    1031  *             DWORD         dwFileOffsetLow,
    1032  *             DWORD         dwNumberOfBytesToMap
    1033  *             LPVOID        lpBaseAddress
    1034  * Variables :
    1035  * Result    : address to memory mapped region
    1036  * Remark    :
    1037  * Status    :
    1038  *
    1039  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    1040  *****************************************************************************/
    1041 
    1042 LPVOID HMDeviceHandler::MapViewOfFileEx(PHMHANDLEDATA pHMHandleData,
    1043                                         DWORD         dwDesiredAccess,
    1044                                         DWORD         dwFileOffsetHigh,
    1045                                         DWORD         dwFileOffsetLow,
    1046                                         DWORD         dwNumberOfBytesToMap,
    1047                                         LPVOID        lpBaseAddress)
     1012                                      DWORD         dwNumberOfBytesToMap,
     1013                                      LPVOID        lpBaseAddress)
    10481014{
    10491015  dprintf(("KERNEL32: HandleManager::DeviceHandler::MapViewOfFileEx(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
     
    10561022  return(NULL);
    10571023}
    1058 
    1059 
    1060 /*****************************************************************************
    1061  * Name      : DWORD HMDeviceHandler::UnmapViewOfFile
    1062  * Purpose   : map memory mapped file
    1063  * Parameters: PHMHANDLEDATA pHMHandleData
    1064  *             LPVOID        lpBaseAddress
    1065  * Variables :
    1066  * Result    : address to memory mapped region
    1067  * Remark    :
    1068  * Status    :
    1069  *
    1070  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    1071  *****************************************************************************/
    1072 
    1073 BOOL HMDeviceHandler::UnmapViewOfFile(PHMHANDLEDATA pHMHandleData,
    1074                                       LPVOID        lpBaseAddress)
    1075 {
    1076   dprintf(("KERNEL32: HandleManager::DeviceHandler::UnmapViewOfFile(%08xh,%08xh)\n",
    1077            pHMHandleData->hHMHandle,
    1078            lpBaseAddress));
    1079 
    1080   return(FALSE);
    1081 }
    1082 
    1083 
    1084 /*****************************************************************************
    1085  * Name      : DWORD HMDeviceHandler::FlushViewOfFile
    1086  * Purpose   : map memory mapped file
    1087  * Parameters: PHMHANDLEDATA pHMHandleData
    1088  *             LPVOID        lpBaseAddress
    1089  *             DWORD         dwNumberOfBytesToFlush
    1090  * Variables :
    1091  * Result    : address to memory mapped region
    1092  * Remark    :
    1093  * Status    :
    1094  *
    1095  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    1096  *****************************************************************************/
    1097 
    1098 BOOL HMDeviceHandler::FlushViewOfFile(PHMHANDLEDATA pHMHandleData,
    1099                                       LPVOID        lpBaseAddress,
    1100                                       DWORD         dwNumberOfBytesToFlush)
    1101 {
    1102   dprintf(("KERNEL32: HandleManager::DeviceHandler::FlushViewOfFile(%08xh,%08xh,%08xh)\n",
    1103            pHMHandleData->hHMHandle,
    1104            lpBaseAddress,
    1105            dwNumberOfBytesToFlush));
    1106 
    1107   return(FALSE);
    1108 }
    1109 
  • trunk/src/kernel32/hmdevice.h

    r673 r678  
    1 /* $Id: hmdevice.h,v 1.6 1999-08-25 08:55:18 phaller Exp $ */
     1/* $Id: hmdevice.h,v 1.7 1999-08-25 10:28:40 sandervl Exp $ */
    22
    33/*
     
    2525 *****************************************************************************/
    2626
    27 #define HMTYPE_UNKNOWN                   0
    28 #define HMTYPE_MEMMAP                    1
     27#define HMTYPE_UNKNOWN  0
     28#define HMTYPE_MEMMAP   1
    2929//.....
    3030
     
    232232   ***************************************************************************/
    233233
    234                   /* this is a handler method for calls to CreateSemaphore() */
     234                     /* this is a handler method for calls to CreateSemaphore() */
    235235  virtual DWORD CreateSemaphore (PHMHANDLEDATA         pHMHandleData,
    236236                                 LPSECURITY_ATTRIBUTES lpsa,
     
    239239                                 LPCSTR                lpszSemaphoreName);
    240240
    241                     /* this is a handler method for calls to OpenSemaphore() */
     241                       /* this is a handler method for calls to OpenSemaphore() */
    242242  virtual DWORD OpenSemaphore   (PHMHANDLEDATA         pHMHandleData,
    243243                                 BOOL                  fInheritHandle,
    244244                                 LPCSTR                lpszSemaphoreName);
    245245
    246                   /* this is a handle method for calls to ReleaseSemaphore() */
     246                     /* this is a handle method for calls to ReleaseSemaphore() */
    247247  virtual BOOL  ReleaseSemaphore(PHMHANDLEDATA pHMHandleData,
    248248                                 LONG          cReleaseCount,
     
    260260                  /* this is a handler method for calls to OpenFileMapping() */
    261261  virtual DWORD OpenFileMapping     (PHMHANDLEDATA              pHMHandleData,
    262                                      DWORD access,   /* [in] Access mode */
     262                                     DWORD access,   /* [in] Access mode */
    263263                                     BOOL                       fInherit,
    264264                                     LPCSTR                     lpName);
    265265
    266                     /* this is a handler method for calls to MapViewOfFile() */
    267   virtual LPVOID MapViewOfFile      (PHMHANDLEDATA              pHMHandleData,
    268                                      DWORD                      dwDesiredAccess,
    269                                      DWORD                      dwFileOffsetHigh,
    270                                      DWORD                      dwFileOffsetLow,
    271                                      DWORD                      dwNumberOfBytesToMap);
    272 
    273                   /* this is a handler method for calls to MapViewOfFileEx() */
     266                    /* this is a handler method for calls to MapViewOfFileEx() */
    274267  virtual LPVOID MapViewOfFileEx    (PHMHANDLEDATA              pHMHandleData,
    275268                                     DWORD                      dwDesiredAccess,
     
    277270                                     DWORD                      dwFileOffsetLow,
    278271                                     DWORD                      dwNumberOfBytesToMap,
    279                                      LPVOID                     lpBaseAddress);
    280 
    281                   /* this is a handler method for calls to UnmapViewOfFile() */
    282   virtual BOOL   UnmapViewOfFile    (PHMHANDLEDATA              pHMHandleData,
    283                                      LPVOID                     lpBaseAddress);
    284 
    285                   /* this is a handler method for calls to FlushViewOfFile() */
    286   virtual BOOL   FlushViewOfFile    (PHMHANDLEDATA              pHMHandleData,
    287                                      LPVOID                     lpBaseAddress,
    288                                      DWORD                      dwNumberOfBytesToFlush);
     272                                     LPVOID                     lpBaseAddress);
    289273
    290274};
  • trunk/src/kernel32/hmmmap.cpp

    r675 r678  
    1 /* $Id: hmmmap.cpp,v 1.3 1999-08-25 10:23:34 phaller Exp $ */
     1/* $Id: hmmmap.cpp,v 1.4 1999-08-25 10:28:40 sandervl Exp $ */
    22
    33/*
     
    4747//******************************************************************************
    4848DWORD HMDeviceMemMapClass::CreateFileMapping(PHMHANDLEDATA         pHMHandleData,
    49                                              HFILE hFile,
     49                                             HFILE hFile, 
    5050                                             SECURITY_ATTRIBUTES *sa, /* [in] Optional security attributes*/
    5151                                             DWORD protect,   /* [in] Protection for mapping object */
    5252                                             DWORD size_high, /* [in] High-order 32 bits of object size */
    5353                                             DWORD size_low,  /* [in] Low-order 32 bits of object size */
    54                                              LPCSTR name)     /* [in] Name of file-mapping object */
     54                                             LPCSTR name)     /* [in] Name of file-mapping object */ 
    5555{
    56   Win32MemMap *map;
    57 
    58   dprintf(("KERNEL32::HMDeviceMemMapClass::CreateFileMapping(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%s)\n",
    59            pHMHandleData,
    60            hFile,
    61            sa,
    62            protect,
    63            size_high,
    64            size_low,
    65            name));
     56 Win32MemMap *map;
    6657
    6758  if((hFile == -1 && size_low == 0) || size_high ||
    6859     protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|SEC_COMMIT|SEC_IMAGE|SEC_RESERVE|SEC_NOCACHE) ||
    69      ((protect & SEC_COMMIT) && (protect & SEC_RESERVE)))
     60     (protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY)) == 0 ||
     61     (hFile == -1 && (protect & SEC_COMMIT)) ||
     62     ((protect & SEC_COMMIT) && (protect & SEC_RESERVE)))
    7063  {
    7164
     
    7972        dprintf(("CreateFileMappingA: can't create Win32MemMap object!"));
    8073        return ERROR_OUTOFMEMORY;
    81   }
     74  } 
    8275
    8376  if(map->Init(pHMHandleData->hHMHandle) == FALSE) {
     
    9790                                           LPCSTR name )   /* [in] Name of file-mapping object */
    9891{
    99   Win32MemMap *map;
    100   DWORD        protflags;
    101 
    102   dprintf(("KERNEL32::HMDeviceMemMapClass::OpenFileMapping(%08xh,%08xh,%08xh,%08xh\n",
    103            pHMHandleData,
    104            access,
    105            inherit,
    106            name));
    107 
     92 Win32MemMap *map;
     93 DWORD        protflags;
    10894
    10995  if(name == NULL)
     
    171157//******************************************************************************
    172158//******************************************************************************
    173 LPVOID HMDeviceMemMapClass::MapViewOfFile(PHMHANDLEDATA pHMHandleData,
    174                                       DWORD         dwDesiredAccess,
    175                                       DWORD         dwFileOffsetHigh,
    176                                       DWORD         dwFileOffsetLow,
    177                                       DWORD         dwNumberOfBytesToMap)
    178 {
    179   dprintf(("KERNEL32: HMDeviceMemMapClass::MapViewOfFile(%08xh,%08xh,%08xh,%08xh,%08xh)\n",
    180            pHMHandleData->hHMHandle,
    181            dwDesiredAccess,
    182            dwFileOffsetHigh,
    183            dwFileOffsetLow,
    184            dwNumberOfBytesToMap));
    185 
    186   return MapViewOfFileEx(pHMHandleData,
    187                          dwDesiredAccess,
    188                          dwFileOffsetHigh,
    189                          dwFileOffsetLow,
    190                          dwNumberOfBytesToMap,
    191                          NULL);
    192 }
    193 
    194 //******************************************************************************
    195 //******************************************************************************
    196159DWORD HMDeviceMemMapClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
    197160{
    198161 Win32MemMap *map;
    199162
    200   if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP)
    201   {     
    202     dprintf(("KERNEL32: HMDeviceMemMapClass:MapViewOfFileEx: invalid handle data!"));
    203     return ERROR_INVALID_HANDLE;
     163  if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
     164        dprintf(("MapViewOfFileEx: invalid handle data!"));
     165        return ERROR_INVALID_HANDLE;
    204166  }
    205167  map = (Win32MemMap *)pHMHandleData->dwUserData;
     
    210172//******************************************************************************
    211173//******************************************************************************
    212 
    213 
    214 /*****************************************************************************
    215  * Name      : DWORD HMDeviceHandler::findByBaseAddress
    216  * Purpose   : identify a memmap object by its base address
    217  * Parameters: LPVOID        lpBaseAddress
    218  * Variables :
    219  * Result    : PHMHANDLEDATA pHMHandleData
    220  * Remark    :
    221  * Status    :
    222  *
    223  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    224  *****************************************************************************/
    225 
    226 int HMDeviceMemMapClass::findByBaseAddress(LPVOID lpBaseAddress)
    227 {
    228   dprintf(("KERNEL32: HMDeviceMemMapClass::findByBaseAddress(%08xh) not implemented\n",
    229            lpBaseAddress));
    230 
    231   return -1;
    232 }
    233 
    234 
    235 /*****************************************************************************
    236  * Name      : DWORD HMDeviceHandler::UnmapViewOfFile
    237  * Purpose   : map memory mapped file
    238  * Parameters: PHMHANDLEDATA pHMHandleData
    239  *             LPVOID        lpBaseAddress
    240  * Variables :
    241  * Result    : address to memory mapped region
    242  * Remark    :
    243  * Status    :
    244  *
    245  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    246  *****************************************************************************/
    247 
    248 BOOL HMDeviceMemMapClass::UnmapViewOfFile(PHMHANDLEDATA pHMHandleData,
    249                                           LPVOID        lpBaseAddress)
    250 {
    251   dprintf(("KERNEL32: HMDeviceMemMapClass::UnmapViewOfFile(%08xh,%08xh) not implemented\n",
    252            pHMHandleData->hHMHandle,
    253            lpBaseAddress));
    254 
    255   return(FALSE);
    256 }
    257 
    258 
    259 /*****************************************************************************
    260  * Name      : DWORD HMDeviceHandler::FlushViewOfFile
    261  * Purpose   : map memory mapped file
    262  * Parameters: PHMHANDLEDATA pHMHandleData
    263  *             LPVOID        lpBaseAddress
    264  *             DWORD         dwNumberOfBytesToFlush
    265  * Variables :
    266  * Result    : address to memory mapped region
    267  * Remark    :
    268  * Status    :
    269  *
    270  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    271  *****************************************************************************/
    272 
    273 BOOL HMDeviceMemMapClass::FlushViewOfFile(PHMHANDLEDATA pHMHandleData,
    274                                           LPVOID        lpBaseAddress,
    275                                           DWORD         dwNumberOfBytesToFlush)
    276 {
    277   dprintf(("KERNEL32: HMDeviceMemMapClass::FlushViewOfFile(%08xh,%08xh,%08xh) not implemented\n",
    278            pHMHandleData->hHMHandle,
    279            lpBaseAddress,
    280            dwNumberOfBytesToFlush));
    281 
    282   return(FALSE);
    283 }
    284 
    285 
  • trunk/src/kernel32/hmmmap.h

    r673 r678  
    1 /* $Id: hmmmap.h,v 1.2 1999-08-25 08:55:19 phaller Exp $ */
     1/* $Id: hmmmap.h,v 1.3 1999-08-25 10:28:40 sandervl Exp $ */
    22
    33/*
     
    3434  HMDeviceMemMapClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName) {}
    3535
    36   // identify a memmap object by its base address
    37   static int findByBaseAddress(LPVOID lpBaseAddress);
    38 
    39 
    4036  /* this is a handler method for calls to CreateFileMapping() */
    4137  virtual DWORD CreateFileMapping   (PHMHANDLEDATA              pHMHandleData,
     
    4945  /* this is a handler method for calls to OpenFileMapping() */
    5046  virtual DWORD OpenFileMapping     (PHMHANDLEDATA              pHMHandleData,
    51                                      DWORD access,   /* [in] Access mode */
     47                                     DWORD access,   /* [in] Access mode */
    5248                                     BOOL                       fInherit,
    5349                                     LPCSTR                     lpName);
    5450
    5551  /* this is a handler method for calls to MapViewOfFile() */
    56   virtual LPVOID MapViewOfFile      (PHMHANDLEDATA              pHMHandleData,
    57                                      DWORD                      dwDesiredAccess,
    58                                      DWORD                      dwFileOffsetHigh,
    59                                      DWORD                      dwFileOffsetLow,
    60                                      DWORD                      dwNumberOfBytesToMap);
    61 
    62   /* this is a handler method for calls to MapViewOfFileEx() */
    6352  virtual LPVOID MapViewOfFileEx    (PHMHANDLEDATA              pHMHandleData,
    6453                                     DWORD                      dwDesiredAccess,
     
    6655                                     DWORD                      dwFileOffsetLow,
    6756                                     DWORD                      dwNumberOfBytesToMap,
    68                                      LPVOID                     lpBaseAddress);
     57                                     LPVOID                     lpBaseAddress);
    6958
    70                   /* this is a handler method for calls to UnmapViewOfFile() */
    71   virtual BOOL   UnmapViewOfFile    (PHMHANDLEDATA              pHMHandleData,
    72                                      LPVOID                     lpBaseAddress);
    73 
    74                   /* this is a handler method for calls to FlushViewOfFile() */
    75   virtual BOOL   FlushViewOfFile    (PHMHANDLEDATA              pHMHandleData,
    76                                      LPVOID                     lpBaseAddress,
    77                                      DWORD                      dwNumberOfBytesToFlush);
    78 
    79 
    80                   /* this is a handler method for calls to CloseHandle() */
    8159  virtual DWORD  CloseHandle(PHMHANDLEDATA pHMHandleData);
    8260};
  • trunk/src/kernel32/makefile

    r664 r678  
    1 # $Id: makefile,v 1.29 1999-08-24 18:46:39 sandervl Exp $
     1# $Id: makefile,v 1.30 1999-08-25 10:28:40 sandervl Exp $
    22
    33#
     
    121121exceptions.OBJ: \
    122122    .\exceptions.cpp \
     123    mmap.h \
    123124    $(PDWIN32_INCLUDE)\exceptions.h \
    124125    exceptutil.h
     
    148149    $(PDWIN32_INCLUDE)\wprocess.h \
    149150    console2.h \
     151    mmap.h \
    150152    cio.h \
    151153    os2util.h
  • trunk/src/kernel32/mmap.cpp

    r664 r678  
    1 /* $Id: mmap.cpp,v 1.8 1999-08-24 18:46:40 sandervl Exp $ */
     1/* $Id: mmap.cpp,v 1.9 1999-08-25 10:28:40 sandervl Exp $ */
    22
    33/*
     
    1818 *
    1919 * TODO: Handles returned should be usable by all apis that accept file handles
     20 * TODO: Sharing memory mapped files between multiple processes
    2021 *
    2122 * Project Odin Software License can be found in LICENSE.TXT
     
    115116//******************************************************************************
    116117//******************************************************************************
     118BOOL Win32MemMap::hasReadAccess()
     119{
     120  return TRUE; //should have at least this
     121}
     122//******************************************************************************
     123//******************************************************************************
     124BOOL Win32MemMap::hasWriteAccess()
     125{
     126  return !(mProtFlags & PAGE_READONLY);
     127}
     128//******************************************************************************
     129//Might want to add this feature for memory mapping executable & dll files in
     130//the loader (done in Win32 with the SEC_IMAGE flag?)
     131//******************************************************************************
     132BOOL Win32MemMap::hasExecuteAccess()
     133{
     134  return FALSE;
     135}
     136//******************************************************************************
     137//******************************************************************************
     138BOOL Win32MemMap::commitPage(LPVOID lpPageFaultAddr, ULONG nrpages)
     139{
     140 DWORD pageAddr = (DWORD)lpPageFaultAddr & ~0xFFF;
     141 DWORD oldProt, newProt, nrBytesRead, offset, size;
     142 
     143//  mapMutex.enter();
     144  newProt  = mProtFlags & (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY);
     145  newProt |= MEM_COMMIT;
     146
     147  dprintf(("Win32MemMap::commitPage %x (faultaddr %x), nr of pages %d", pageAddr, lpPageFaultAddr, nrpages));
     148  if(VirtualProtect((LPVOID)pageAddr, nrpages*PAGE_SIZE, newProt, &oldProt) == FALSE) {
     149        goto fail;
     150  }
     151  if(hMemFile != -1) {
     152        offset = pageAddr - (ULONG)pMapping;
     153        size   = nrpages*PAGE_SIZE;
     154        if(offset + size > mSize) {
     155                size = mSize - offset;
     156        }
     157        if(SetFilePointer(hMemFile, offset, NULL, FILE_BEGIN) != offset) {
     158                dprintf(("Win32MemMap::commitPage: SetFilePointer failed to set pos to %x", offset));
     159                goto fail;
     160        }
     161        if(ReadFile(hMemFile, (LPSTR)pageAddr, size, &nrBytesRead, NULL) == FALSE) {
     162                dprintf(("Win32MemMap::commitPage: ReadFile failed for %x", pageAddr));
     163                goto fail;
     164        }
     165        if(nrBytesRead != size) {
     166                dprintf(("Win32MemMap::commitPage: ReadFile didn't read all bytes for %x", pageAddr));
     167                goto fail;
     168        }
     169  }
     170
     171//  mapMutex.leave();
     172  return TRUE;
     173fail:
     174//  mapMutex.leave();
     175  return FALSE;
     176}
     177//******************************************************************************
     178//******************************************************************************
    117179BOOL Win32MemMap::unmapViewOfFile()
    118180{
     
    145207  if(fdwAccess & FILE_MAP_COPY && !(mProtFlags & PAGE_WRITECOPY))
    146208        goto parmfail;
    147  
     209
     210//TODO: If committed, read file into memory
     211#if 0 
    148212  if(mProtFlags & SEC_COMMIT)
    149213        fAlloc |= MEM_COMMIT;
     214  else
    150215  if(mProtFlags & SEC_RESERVE)
    151216        fAlloc |= MEM_RESERVE;
     217#else
     218  fAlloc = MEM_RESERVE;
     219#endif
    152220
    153221  if(fMapped == FALSE) {//if not mapped, reserve/commit entire view
     
    179247{
    180248 MEMORY_BASIC_INFORMATION memInfo;
    181  ULONG nrpages, nrBytesWritten;
     249 ULONG nrpages, nrBytesWritten, offset, size;
    182250 int   i;
    183251
    184   mapMutex.enter();
     252//  mapMutex.enter();
    185253  if(fMapped == FALSE)
    186254        goto parmfail;
     
    204272           memInfo.AllocationProtect & (PAGE_READWRITE|PAGE_WRITECOPY|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY))
    205273        {//committed and allowed for writing?
    206                 if(WriteFile(hMemFile, (LPSTR)lpvBase+i*PAGE_SIZE, PAGE_SIZE, &nrBytesWritten, NULL) == FALSE) {
     274                offset = (ULONG)lpvBase+i*PAGE_SIZE - (ULONG)pMapping;
     275                size   = PAGE_SIZE;
     276                if(offset + size > mSize) {
     277                        size = mSize - offset;
     278                }
     279                dprintf(("Win32MemMap::flushView for offset %x, size %d", offset, size));
     280
     281                if(SetFilePointer(hMemFile, offset, NULL, FILE_BEGIN) != offset) {
     282                        dprintf(("Win32MemMap::flushView: SetFilePointer failed to set pos to %x", offset));
     283                        goto fail;
     284                }
     285                if(WriteFile(hMemFile, (LPSTR)lpvBase+i*PAGE_SIZE, size, &nrBytesWritten, NULL) == FALSE) {
    207286                        dprintf(("Win32MemMap::flushView: WriteFile failed for %x", (ULONG)lpvBase+i*PAGE_SIZE));
    208287                        goto fail;
    209288                }
    210                 if(nrBytesWritten != PAGE_SIZE) {
     289                if(nrBytesWritten != size) {
    211290                        dprintf(("Win32MemMap::flushView: WriteFile didn't write all bytes for %x", (ULONG)lpvBase+i*PAGE_SIZE));
    212291                        goto fail;
     
    214293        }
    215294  }
    216   mapMutex.leave();
     295//  mapMutex.leave();
    217296  return TRUE;
    218297parmfail:
    219298  SetLastError(ERROR_INVALID_PARAMETER);
    220   mapMutex.leave();
     299//  mapMutex.leave();
    221300  return FALSE;
    222301fail:
    223   mapMutex.leave();
     302//  mapMutex.leave();
    224303  return FALSE;
    225304}
     
    264343//******************************************************************************
    265344//******************************************************************************
     345void Win32MemMap::deleteAll()
     346{
     347  while(memmaps) {
     348        CloseHandle(memmaps->hMemMap);
     349  }
     350}
     351//******************************************************************************
     352//******************************************************************************
    266353Win32MemMap *Win32MemMap::memmaps = NULL;
  • trunk/src/kernel32/mmap.h

    r664 r678  
    1 /* $Id: mmap.h,v 1.6 1999-08-24 18:46:40 sandervl Exp $ */
     1/* $Id: mmap.h,v 1.7 1999-08-25 10:28:41 sandervl Exp $ */
    22
    33/*
     
    3737   void   Release()                      { if(--referenced == 0) delete this; };
    3838
     39   BOOL   hasReadAccess();
     40   BOOL   hasWriteAccess();
     41   BOOL   hasExecuteAccess();
     42 
     43   BOOL   commitPage(LPVOID lpPageFaultAddr, ULONG nrpages);
     44
    3945static Win32MemMap *findMap(LPSTR lpszName);
    4046static Win32MemMap *findMap(ULONG address);
     47
     48//Should only be called in ExitProcess
     49static void deleteAll();
    4150
    4251protected:
  • trunk/src/kernel32/virtual.cpp

    r673 r678  
    1 /* $Id: virtual.cpp,v 1.3 1999-08-25 08:55:19 phaller Exp $ */
     1/* $Id: virtual.cpp,v 1.4 1999-08-25 10:28:41 sandervl Exp $ */
    22
    33/*
     
    1919#include <win\virtual.h>
    2020#include <heapstring.h>
    21 #include "mmap.h"
    2221#include <handlemanager.h>
    2322
     
    3938                LPCSTR name      /* [in] Name of file-mapping object */ )
    4039{
    41   return HMCreateFileMapping(hFile, sa, protect, size_high, size_low, name);
     40   return HMCreateFileMapping(hFile, sa, protect, size_high, size_low, name);
    4241}
    4342
     
    4746 * See CreateFileMapping32A
    4847 */
    49 HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES attr,
    50                                       DWORD protect, DWORD size_high,
     48HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES attr, 
     49                                      DWORD protect, DWORD size_high, 
    5150                                      DWORD size_low, LPCWSTR name )
    5251{
     
    7271                LPCSTR name )   /* [in] Name of file-mapping object */
    7372{
    74   return (HMOpenFileMapping(access, inherit, name));
     73    dprintf(("OpenFileMappingA: %x %d %s", access, inherit, name));
     74    return HMOpenFileMapping(access, inherit, name);
    7575}
    7676
     
    103103              DWORD offset_low,  /* [in] Low-order 32 bits of file offset */
    104104              DWORD count        /* [in] Number of bytes to map */
    105 )
    106 {
    107   return HMMapViewOfFile( mapping, access, offset_high,
    108                           offset_low, count);
     105) 
     106{
     107    return MapViewOfFileEx( mapping, access, offset_high,
     108                            offset_low, count, NULL );
    109109}
    110110
     
    125125              DWORD count,       /* [in] Number of bytes to map */
    126126              LPVOID addr        /* [in] Suggested starting address for mapped view */
    127 )
    128 {
    129   return HMMapViewOfFileEx( handle, access, offset_high,
    130                             offset_low, count, addr);
     127)
     128{
     129  return HMMapViewOfFileEx(handle, access, offset_high, offset_low, count, addr);
    131130}
    132131
     
    143142              LPCVOID base, /* [in] Start address of byte range to flush */
    144143              DWORD cbFlush /* [in] Number of bytes in range */
    145 )
    146 {
    147   return HMFlushViewOfFile( (LPVOID)base, cbFlush);
     144)
     145{
     146    dprintf(("FlushViewOfFile: NOT IMPLEMENTED"));
     147    return TRUE;
    148148}
    149149
     
    161161 */
    162162BOOL WINAPI UnmapViewOfFile(LPVOID addr /* [in] Address where mapped view begins */
    163 )
    164 {
    165   return HMUnmapViewOfFile( addr );
    166 }
    167 
     163)
     164{
     165    if (!addr)
     166    {
     167        SetLastError( ERROR_INVALID_PARAMETER );
     168        return FALSE;
     169    }
     170    return TRUE;
     171}
    168172
    169173/***********************************************************************
     
    171175 *
    172176 * Helper function to map a file to memory:
    173  *  name                        -       file name
     177 *  name                        -       file name 
    174178 *  [RETURN] ptr                -       pointer to mapped file
    175179 */
     
    179183    LPVOID ptr = NULL;
    180184
    181     hFile = CreateFileW( name, GENERIC_READ, FILE_SHARE_READ, NULL,
     185    hFile = CreateFileW( name, GENERIC_READ, FILE_SHARE_READ, NULL, 
    182186                           OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0);
    183187    if (hFile != INVALID_HANDLE_VALUE)
     
    198202 *
    199203 * Helper function to map a file to memory:
    200  *  name                        -       file name
     204 *  name                        -       file name 
    201205 *  [RETURN] ptr                -       pointer to mapped file
    202206 */
     
    206210    LPVOID ptr = NULL;
    207211
    208     hFile = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, NULL,
     212    hFile = CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, NULL, 
    209213                        OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0);
    210214    if (hFile != INVALID_HANDLE_VALUE)
     
    220224    return ptr;
    221225}
    222 
  • trunk/src/kernel32/wprocess.cpp

    r669 r678  
    1 /* $Id: wprocess.cpp,v 1.27 1999-08-24 23:32:24 phaller Exp $ */
     1/* $Id: wprocess.cpp,v 1.28 1999-08-25 10:28:41 sandervl Exp $ */
    22
    33/*
     
    3030#include "versionos2.h"    /*PLF Wed  98-03-18 02:36:51*/
    3131#include <wprocess.h>
     32#include "mmap.h"
    3233
    3334BOOL      fExeStarted = FALSE;
     
    331332  SetOS2ExceptionChain(-1);
    332333
     334  //Flush and delete all open memory mapped files
     335  Win32MemMap::deleteAll();
     336
     337  Win32DllExitList(0);
     338
    333339  //Restore original OS/2 TIB selector
    334340  DestroyTIB();
     
    340346  if (iConsoleIsActive())
    341347    iConsoleWaitClose();
    342 
    343   Win32DllExitList(0);
    344348
    345349  O32_ExitProcess(exitcode);
     
    605609}
    606610//******************************************************************************
    607 //NOTE: GetModuleHandleA does NOT support files with multiple dots (i.e.
     611//NOTE: GetModuleHandleA does NOT support files with multiple dots (i.e. 
    608612//      very.weird.exe)
    609613//******************************************************************************
     
    626630        else {
    627631                if(!strstr(szModule, ".")) {
    628                         //if there's no extension or trainling dot, we
     632                        //if there's no extension or trainling dot, we 
    629633                        //assume it's a dll (see Win32 SDK docs)
    630634                        fDllModule = TRUE;
Note: See TracChangeset for help on using the changeset viewer.