Changeset 9748 for trunk/src


Ignore:
Timestamp:
Feb 4, 2003, 12:29:03 PM (23 years ago)
Author:
sandervl
Message:

Support DuplicateHandle for threads; cleaned up semaphore code

Location:
trunk/src/kernel32
Files:
18 edited

Legend:

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

    r9660 r9748  
    1 /* $Id: HandleManager.cpp,v 1.93 2003-01-10 15:19:53 sandervl Exp $ */
     1/* $Id: HandleManager.cpp,v 1.94 2003-02-04 11:28:55 sandervl Exp $ */
    22
    33/*
     
    959959  TabWin32Handles[iIndexNew].pDeviceHandler         = pDeviceHandler;
    960960                                                  /* call the device handler */
    961   rc = pDeviceHandler->DuplicateHandle(&TabWin32Handles[iIndexNew].hmHandleData,
     961  rc = pDeviceHandler->DuplicateHandle(srchandle,
     962                                       &TabWin32Handles[iIndexNew].hmHandleData,
    962963                                       srcprocess,
    963964                                       &TabWin32Handles[srchandle].hmHandleData,
     
    42854286}
    42864287/*****************************************************************************
     4288 * Name      : HMGetThreadTimes
     4289 * Purpose   : router function for HMGetThreadTimes
     4290 * Parameters:
     4291 * Variables :
     4292 * Result    :
     4293 * Remark    :
     4294 * Status    :
     4295 *
     4296 * Author    : SvL
     4297 *****************************************************************************/
     4298BOOL HMGetThreadTimes(HANDLE hThread, LPFILETIME lpCreationTime,
     4299                      LPFILETIME lpExitTime, LPFILETIME lpKernelTime,
     4300                      LPFILETIME lpUserTime)
     4301{
     4302  int       iIndex;                           /* index into the handle table */
     4303  BOOL      lpResult;                /* result from the device handler's API */
     4304  PHMHANDLE pHMHandle;       /* pointer to the handle structure in the table */
     4305
     4306  SetLastError(ERROR_SUCCESS);
     4307                                                          /* validate handle */
     4308  iIndex = _HMHandleQuery(hThread);              /* get the index */
     4309  if (-1 == iIndex)                                               /* error ? */
     4310  {
     4311    SetLastError(ERROR_INVALID_HANDLE);       /* set win32 error information */
     4312    return FALSE;                                         /* signal failure */
     4313  }
     4314
     4315  pHMHandle = &TabWin32Handles[iIndex];               /* call device handler */
     4316  lpResult = pHMHandle->pDeviceHandler->GetThreadTimes(hThread, &TabWin32Handles[iIndex].hmHandleData,
     4317                                                       lpCreationTime, lpExitTime,
     4318                                                       lpKernelTime, lpUserTime);
     4319
     4320  return (lpResult);                                  /* deliver return code */
     4321}
     4322/*****************************************************************************
    42874323 * Name      : HMTerminateThread
    42884324 * Purpose   : router function for TerminateThread
  • trunk/src/kernel32/hmdevice.cpp

    r9653 r9748  
    1 /* $Id: hmdevice.cpp,v 1.33 2003-01-10 12:57:12 sandervl Exp $ */
     1/* $Id: hmdevice.cpp,v 1.34 2003-02-04 11:28:56 sandervl Exp $ */
    22
    33/*
     
    135135 * Author    : Patrick Haller [Wed, 1998/02/11 20:44]
    136136 *****************************************************************************/
    137 BOOL HMDeviceHandler::DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
     137BOOL HMDeviceHandler::DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    138138                               PHMHANDLEDATA pHMSrcHandle,
    139139                               HANDLE  destprocess,
     
    15071507  return FALSE;
    15081508}
     1509/*****************************************************************************
     1510 * Name      : DWORD HMDeviceHandler::SetThreadContext
     1511 * Purpose   :
     1512 * Variables :
     1513 * Result    :
     1514 * Remark    :
     1515 * Status    :
     1516 *
     1517 * Author    : SvL
     1518 *****************************************************************************/
     1519BOOL HMDeviceHandler::GetThreadTimes(HANDLE        hThread,
     1520                                     PHMHANDLEDATA pHMHandleData,
     1521                                     LPFILETIME lpCreationTime,
     1522                                     LPFILETIME lpExitTime,
     1523                                     LPFILETIME lpKernelTime,
     1524                                     LPFILETIME lpUserTime)
     1525{
     1526  dprintf(("Kernel32: ERROR: GetThreadTimes(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
     1527           hThread,
     1528           lpCreationTime,
     1529           lpExitTime,
     1530           lpKernelTime,
     1531           lpUserTime));
     1532
     1533  return FALSE;
     1534}
     1535
    15091536/*****************************************************************************
    15101537 * Name      : DWORD HMDeviceHandler::TerminateThread
  • trunk/src/kernel32/hmdevice.h

    r9653 r9748  
    1 /* $Id: hmdevice.h,v 1.33 2003-01-10 12:57:13 sandervl Exp $ */
     1/* $Id: hmdevice.h,v 1.34 2003-02-04 11:28:56 sandervl Exp $ */
    22
    33/*
     
    9292                                 ULONG         arg4);
    9393
    94   virtual BOOL DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
     94  virtual BOOL DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    9595                               PHMHANDLEDATA pHMSrcHandle,
    9696                               HANDLE  destprocess,
     
    397397 virtual BOOL   GetThreadContext(HANDLE hThread, PHMHANDLEDATA pHMHandleData, PCONTEXT lpContext);
    398398 virtual BOOL   SetThreadContext(HANDLE hThread, PHMHANDLEDATA pHMHandleData, const CONTEXT *lpContext);
     399 virtual BOOL   GetThreadTimes(HANDLE hThread, PHMHANDLEDATA pHMHandleData,
     400                               FILETIME *lpCreationTime, FILETIME *lpExitTime,
     401                               FILETIME *lpKernelTime, FILETIME *lpUserTime);
    399402
    400403 virtual BOOL   TerminateThread(HANDLE hThread, PHMHANDLEDATA pHMHandleData, DWORD exitcode);
  • trunk/src/kernel32/hmevent.cpp

    r6084 r9748  
    1 /* $Id: hmevent.cpp,v 1.8 2001-06-23 16:59:27 sandervl Exp $ */
     1/* $Id: hmevent.cpp,v 1.9 2003-02-04 11:28:57 sandervl Exp $ */
    22
    33/*
     
    3030 *****************************************************************************/
    3131
    32 #ifdef USE_OS2SEMAPHORES
    33 #define INCL_DOSSEMAPHORES
    34 #define INCL_DOSERRORS
    35 #include <os2wrap.h>
    36 #include <win32type.h>
    37 #include <win32api.h>
    38 #include <winconst.h>
    39 #else
    4032#include <os2win.h>
    41 #endif
    4233
    4334#include <stdlib.h>
     
    5344#define DBG_LOCALLOG    DBG_hmevent
    5445#include "dbglocal.h"
    55 
    56 #ifndef DCE_AUTORESET
    57 #define DCE_AUTORESET   0x1000  /* DosCreateEventSem option to auto-reset  */
    58                                 /* event semaphore on post.                */
    59 #define DCE_POSTONE     0x0800  /* DosCreateEventSem option to post only   */
    60                                 /* waiter and auto-reset the semaphore when*/
    61                                 /* there are multiple waiters.             */
    62 #endif
    6346
    6447/*****************************************************************************
     
    9376                                      LPCTSTR               lpszEventName)
    9477{
    95 #ifdef USE_OS2SEMAPHORES
    96   APIRET rc;
    97   HEV hev;
    98   char szSemName[CCHMAXPATH];
    99 
    100   dprintf(("KERNEL32: HandleManager::Event::CreateEvent(%08xh,%08xh,%08xh,%08xh,%s)\n",
    101            pHMHandleData,
    102            lpsa,
    103            fManualReset,
    104            fInitialState,
    105            lpszEventName));
    106 
    107   if(lpszEventName) {
    108       strcpy(szSemName, "\\SEM32\\");
    109       strcat(szSemName, lpszEventName);
    110       lpszEventName = szSemName;
    111       FixSemName((char *)lpszEventName);
    112   }
    113   //Manual reset means all threads waiting on the event semaphore will be
    114   //unblocked and the app must manually reset the event semaphore
    115   //Automatic reset -> only one waiting thread unblocked & state reset
    116   rc = DosCreateEventSem(lpszEventName, &hev, (fManualReset) ? 0 : (DCE_POSTONE|DCE_AUTORESET), fInitialState);
    117 
    118   if(rc) {
    119       dprintf(("DosCreateEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    120       pHMHandleData->hHMHandle = 0;
    121       return error2WinError(rc);
    122   }
    123   pHMHandleData->dwAccess  = EVENT_ALL_ACCESS_W;
    124   pHMHandleData->dwFlags   = fManualReset;
    125   pHMHandleData->hHMHandle = hev;
    126   pHMHandleData->dwInternalType = HMTYPE_EVENTSEM;
    127   return ERROR_SUCCESS_W;
    128 #else
    12978  HANDLE hOpen32;
    13079
     
    14796  }
    14897  else
    149     return (O32_GetLastError());
    150 #endif
     98    return (GetLastError());
    15199}
    152100
     
    168116                                    LPCTSTR               lpszEventName)
    169117{
    170 #ifdef USE_OS2SEMAPHORES
    171   HEV    hev;
    172   APIRET rc;
    173   char szSemName[CCHMAXPATH];
    174 
    175   dprintf(("KERNEL32: HandleManager::Event::OpenEvent(%08xh,%08xh,%s)\n",
    176            pHMHandleData,
    177            fInheritHandle,
    178            lpszEventName));
    179 
    180   if(lpszEventName == NULL) {
    181       pHMHandleData->hHMHandle = 0;
    182       return ERROR_INVALID_PARAMETER_W;
    183   }
    184 
    185   strcpy(szSemName, "\\SEM32\\");
    186   strcat(szSemName, lpszEventName);
    187   FixSemName(szSemName);
    188   rc = DosOpenEventSem(szSemName, &hev);
    189   if(rc) {
    190       dprintf(("DosOpenEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    191       pHMHandleData->hHMHandle = 0;
    192       return error2WinError(rc);
    193   }
    194   pHMHandleData->dwInternalType = HMTYPE_EVENTSEM;
    195   pHMHandleData->hHMHandle = hev;
    196   return ERROR_SUCCESS_W;
    197 #else
    198118  HANDLE hOpen32;
    199119
     
    213133  }
    214134  else
    215     return (O32_GetLastError());
    216 #endif
     135    return (GetLastError());
    217136}
    218 
    219 /*****************************************************************************
    220  * Name      : HMDeviceEventClass::CloseHandle
    221  * Purpose   : close the handle
    222  * Parameters: PHMHANDLEDATA pHMHandleData
    223  * Variables :
    224  * Result    : API returncode
    225  * Remark    :
    226  * Status    :
    227  *
    228  * Author    :
    229  *****************************************************************************/
    230 
    231 #ifdef USE_OS2SEMAPHORES
    232 BOOL HMDeviceEventClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
    233 {
    234   APIRET rc;
    235 
    236   if(pHMHandleData->hHMHandle) {
    237       rc = DosCloseEventSem((HEV)pHMHandleData->hHMHandle);
    238       if(rc) {
    239           dprintf(("DosCloseEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    240           SetLastError(error2WinError(rc));
    241           return FALSE;
    242       }
    243   }
    244   return TRUE;
    245 }
    246 #endif
    247 
    248 /*****************************************************************************
    249  * Name      : HMDeviceEventClass::DuplicateHandle
    250  * Purpose   :
    251  * Parameters:
    252  *             various parameters as required
    253  * Variables :
    254  * Result    :
    255  * Remark    : the standard behaviour is to return an error code for non-
    256  *             existant request codes
    257  * Status    :
    258  *
    259  * Author    :
    260  *****************************************************************************/
    261 #ifdef USE_OS2SEMAPHORES
    262 BOOL HMDeviceEventClass::DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    263                                PHMHANDLEDATA pHMSrcHandle,
    264                                HANDLE  destprocess,
    265                                PHANDLE desthandle,
    266                                DWORD   fdwAccess,
    267                                BOOL    fInherit,
    268                                DWORD   fdwOptions,
    269                                DWORD   fdwOdinOptions)
    270 {
    271   APIRET rc;
    272   HEV hev;
    273  
    274   dprintf(("KERNEL32:HandleManager::DuplicateHandle %s(%08x,%08x,%08x,%08x,%08x) - NOT IMPLEMENTED!!!!!!!!\n",
    275            lpHMDeviceName,
    276            pHMHandleData,
    277            srcprocess, pHMSrcHandle, destprocess, desthandle));
    278 
    279   if(srcprocess != destprocess) {
    280       DebugInt3();
    281       SetLastError(ERROR_ACCESS_DENIED_W);
    282       return FALSE;
    283   }
    284   hev = (HEV)pHMSrcHandle->hHMHandle;
    285   rc = DosOpenEventSem(NULL, &hev);
    286   if(rc) {
    287       dprintf(("DosOpenEventSem %x failed with rc %d", pHMSrcHandle->hHMHandle, rc));
    288       pHMHandleData->hHMHandle = 0;
    289       SetLastError(error2WinError(rc));
    290       return FALSE;
    291   }
    292   pHMHandleData->dwAccess  = fdwAccess;
    293   pHMHandleData->dwFlags   = pHMSrcHandle->dwFlags; //fManualReset
    294   pHMHandleData->hHMHandle = hev;
    295   pHMHandleData->dwInternalType = HMTYPE_EVENTSEM;
    296   SetLastError(ERROR_SUCCESS_W);
    297   return TRUE;
    298 }
    299 #endif
    300 
    301 #ifdef USE_OS2SEMAPHORES
    302 /*****************************************************************************
    303  * Name      : DWORD HMDeviceEventClass::WaitForSingleObject
    304  * Purpose   : object synchronization
    305  * Parameters: PHMHANDLEDATA pHMHandleData
    306  *             DWORD dwTimeout
    307  * Variables :
    308  * Result    : API returncode
    309  * Remark    :
    310  * Status    :
    311  *
    312  * Author    : SvL
    313  *****************************************************************************/
    314 
    315 DWORD HMDeviceEventClass::WaitForSingleObject(PHMHANDLEDATA pHMHandleData,
    316                                               DWORD         dwTimeout)
    317 {
    318  DWORD rc;
    319 
    320   dprintf2(("KERNEL32: HMDeviceEventClass::WaitForSingleObject(%08xh %08xh)",
    321             pHMHandleData->hHMHandle, dwTimeout));
    322 
    323   if(!(pHMHandleData->dwAccess & SYNCHRONIZE_W) )
    324   {
    325       dprintf(("ERROR: Access denied!!"));
    326       SetLastError(ERROR_ACCESS_DENIED_W);
    327       return WAIT_FAILED_W;
    328   }
    329 
    330   rc = DosWaitEventSem(pHMHandleData->hHMHandle, dwTimeout);
    331   if(rc && rc != ERROR_INTERRUPT && rc != ERROR_TIMEOUT && rc != ERROR_SEM_OWNER_DIED) {
    332       dprintf(("DosWaitEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    333       SetLastError(error2WinError(rc));
    334       return WAIT_FAILED_W;
    335   }
    336   SetLastError(ERROR_SUCCESS_W);
    337   if(rc == ERROR_INTERRUPT || rc == ERROR_SEM_OWNER_DIED) {
    338       return WAIT_ABANDONED_W;
    339   }
    340   else
    341   if(rc == ERROR_TIMEOUT) {
    342       return WAIT_TIMEOUT_W;
    343   }
    344   return WAIT_OBJECT_0_W;
    345 }
    346 #endif
    347 
    348 #ifdef USE_OS2SEMAPHORES
    349 /*****************************************************************************
    350  * Name      : DWORD HMDeviceEventClass::WaitForSingleObjectEx
    351  * Purpose   : object synchronization
    352  * Parameters: PHMHANDLEDATA pHMHandleData
    353  *             DWORD dwTimeout
    354  *             BOOL  fAlertable
    355  * Variables :
    356  * Result    : API returncode
    357  * Remark    :
    358  * Status    :
    359  *
    360  * Author    : SvL
    361  *****************************************************************************/
    362 
    363 DWORD HMDeviceEventClass::WaitForSingleObjectEx(PHMHANDLEDATA pHMHandleData,
    364                                                 DWORD         dwTimeout,
    365                                                 BOOL          fAlertable)
    366 {
    367   dprintf2(("KERNEL32: HMDeviceEventClass::WaitForSingleObjectEx(%08xh,%08h,%08xh) not implemented correctly.\n",
    368             pHMHandleData->hHMHandle, dwTimeout, fAlertable));
    369 
    370   if(!(pHMHandleData->dwAccess & SYNCHRONIZE_W) )
    371   {
    372       dprintf(("ERROR: Access denied!!"));
    373       SetLastError(ERROR_ACCESS_DENIED_W);
    374       return WAIT_FAILED_W;
    375   }
    376 
    377   return WaitForSingleObject(pHMHandleData, dwTimeout);
    378 }
    379 #endif
    380 
    381 #ifdef USE_OS2SEMAPHORES
    382 /*****************************************************************************
    383  * Name      : BOOL HMDeviceEventClass::MsgWaitForMultipleObjects
    384  * Purpose   :
    385  * Variables :
    386  * Result    :
    387  * Remark    :
    388  * Status    :
    389  *
    390  * Author    : SvL
    391  *****************************************************************************/
    392 DWORD HMDeviceEventClass::MsgWaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    393                                                     DWORD      nCount,
    394                                                     PHANDLE    pHandles,
    395                                                     BOOL       fWaitAll,
    396                                                     DWORD      dwMilliseconds,
    397                                                     DWORD      dwWakeMask)
    398 {
    399     return HMSemMsgWaitForMultipleObjects(nCount, pHandles, fWaitAll, dwMilliseconds, dwWakeMask);
    400 }
    401 #endif
    402 
    403 #ifdef USE_OS2SEMAPHORES
    404 /*****************************************************************************
    405  * Name      : BOOL HMDeviceHandler::WaitForMultipleObjects
    406  * Purpose   :
    407  * Variables :
    408  * Result    :
    409  * Remark    :
    410  * Status    :
    411  *
    412  * Author    : SvL
    413  *****************************************************************************/
    414 DWORD HMDeviceEventClass::WaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    415                                                  DWORD   cObjects,
    416                                                  PHANDLE lphObjects,
    417                                                  BOOL    fWaitAll,
    418                                                  DWORD   dwTimeout)
    419 {
    420     return HMSemWaitForMultipleObjects(cObjects, lphObjects, fWaitAll, dwTimeout);
    421 }
    422 #endif
    423137
    424138/*****************************************************************************
     
    436150BOOL HMDeviceEventClass::SetEvent(PHMHANDLEDATA pHMHandleData)
    437151{
    438 #ifdef USE_OS2SEMAPHORES
    439   APIRET rc;
    440 
    441   dprintf(("KERNEL32: HandleManager::Event::SetEvent(%08xh)\n",
    442             pHMHandleData->hHMHandle));
    443 
    444   if(!(pHMHandleData->dwAccess & EVENT_MODIFY_STATE_W) )
    445   {
    446       dprintf(("ERROR: Access denied!!"));
    447       SetLastError(ERROR_ACCESS_DENIED_W);
    448       return FALSE;
    449   }
    450 
    451   rc = DosPostEventSem(pHMHandleData->hHMHandle);
    452   if(rc && rc != ERROR_ALREADY_POSTED) {
    453       dprintf(("DosPostEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    454       SetLastError(error2WinError(rc));
    455       return FALSE;
    456   }
    457   SetLastError(ERROR_SUCCESS_W);
    458   return TRUE;
    459 #else
    460152  dprintf(("KERNEL32: HandleManager::Event::SetEvent(%08xh)\n",
    461153            pHMHandleData->hHMHandle));
    462154
    463155  return (O32_SetEvent(pHMHandleData->hHMHandle));
    464 #endif
    465156}
    466157
     
    480171BOOL HMDeviceEventClass::PulseEvent(PHMHANDLEDATA pHMHandleData)
    481172{
    482 #ifdef USE_OS2SEMAPHORES
    483   APIRET rc;
    484   ULONG count; 
    485 
    486   dprintf2(("KERNEL32: HandleManager::Event::PulseEvent(%08xh)\n",
    487             pHMHandleData->hHMHandle));
    488 
    489   if(!(pHMHandleData->dwAccess & EVENT_MODIFY_STATE_W) )
    490   {
    491       dprintf(("ERROR: Access denied!!"));
    492       SetLastError(ERROR_ACCESS_DENIED_W);
    493       return FALSE;
    494   }
    495 
    496   rc = DosPostEventSem(pHMHandleData->hHMHandle);
    497   if(rc && rc != ERROR_ALREADY_POSTED) {
    498       dprintf(("DosPostEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    499       SetLastError(error2WinError(rc));
    500       return FALSE;
    501   }
    502   if(pHMHandleData->dwFlags == TRUE) {//fManualReset
    503       rc = DosResetEventSem(pHMHandleData->hHMHandle, &count);
    504       if(rc && rc != ERROR_ALREADY_RESET) {
    505           dprintf(("DosResetEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    506           SetLastError(error2WinError(rc));
    507           return FALSE;
    508       }
    509   }
    510   SetLastError(ERROR_SUCCESS_W);
    511   return TRUE;
    512 #else
    513173  dprintf2(("KERNEL32: HandleManager::Event::PulseEvent(%08xh)\n",
    514174            pHMHandleData->hHMHandle));
    515175
    516176  return (O32_PulseEvent(pHMHandleData->hHMHandle));
    517 #endif
    518177}
    519178
     
    533192BOOL HMDeviceEventClass::ResetEvent(PHMHANDLEDATA pHMHandleData)
    534193{
    535 #ifdef USE_OS2SEMAPHORES
    536   APIRET rc;
    537   ULONG count; 
    538  
    539   dprintf2(("KERNEL32: HandleManager::Event::ResetEvent(%08xh)\n",
    540             pHMHandleData->hHMHandle));
    541 
    542   if(!(pHMHandleData->dwAccess & EVENT_MODIFY_STATE_W) )
    543   {
    544       dprintf(("ERROR: Access denied!!"));
    545       SetLastError(ERROR_ACCESS_DENIED_W);
    546       return FALSE;
    547   }
    548 
    549   rc = DosResetEventSem(pHMHandleData->hHMHandle, &count);
    550   if(rc && rc != ERROR_ALREADY_RESET) {
    551       dprintf(("DosResetEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    552       SetLastError(error2WinError(rc));
    553       return FALSE;
    554   }
    555   SetLastError(ERROR_SUCCESS_W);
    556   return TRUE;
    557 #else
    558194  dprintf2(("KERNEL32: HandleManager::Event::ResetEvent(%08xh)\n",
    559195            pHMHandleData->hHMHandle));
    560196
    561197  return (O32_ResetEvent(pHMHandleData->hHMHandle));
    562 #endif
    563198}
    564199
  • trunk/src/kernel32/hmevent.h

    r6060 r9748  
    1 /* $Id: hmevent.h,v 1.4 2001-06-21 21:07:53 sandervl Exp $ */
     1/* $Id: hmevent.h,v 1.5 2003-02-04 11:28:57 sandervl Exp $ */
    22
    33/*
     
    2929 *****************************************************************************/
    3030
    31 #ifdef USE_OS2SEMAPHORES
    32 class HMDeviceEventClass : public HMDeviceHandler
    33 #else
    3431class HMDeviceEventClass : public HMDeviceOpen32Class
    35 #endif
    3632{
    3733public:
    38 #ifdef USE_OS2SEMAPHORES
    39   HMDeviceEventClass(LPCSTR lpDeviceName) : HMDeviceHandler(lpDeviceName) {}
    40 #else
    4134  HMDeviceEventClass(LPCSTR lpDeviceName) : HMDeviceOpen32Class(lpDeviceName) {}
    42 #endif
    4335
    4436  /* this is a handler method for calls to CreateEvent() */
     
    4840                             BOOL                  fInitialState,
    4941                             LPCTSTR               lpszEventName);
    50 
    51 #ifdef USE_OS2SEMAPHORES
    52   virtual BOOL  CloseHandle(PHMHANDLEDATA pHMHandleData);
    53 
    54   virtual BOOL DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    55                                PHMHANDLEDATA pHMSrcHandle,
    56                                HANDLE  destprocess,
    57                                PHANDLE desthandle,
    58                                DWORD   fdwAccess,
    59                                BOOL    fInherit,
    60                                DWORD   fdwOptions,
    61                                DWORD   fdwOdinOptions);
    62 
    63   /* this is a handler method for calls to WaitForSingleObject */
    64   virtual DWORD WaitForSingleObject  (PHMHANDLEDATA pHMHandleData,
    65                                       DWORD  dwTimeout);
    66 
    67   /* this is a handler method for calls to WaitForSingleObjectEx */
    68   virtual DWORD WaitForSingleObjectEx(PHMHANDLEDATA pHMHandleData,
    69                                       DWORD  dwTimeout,
    70                                       BOOL   fAlertable);
    71 
    72   virtual DWORD MsgWaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    73                                           DWORD      nCount,
    74                                           PHANDLE       pHandles,
    75                                           BOOL       fWaitAll,
    76                                           DWORD      dwMilliseconds,
    77                                           DWORD      dwWakeMask);
    78 
    79   virtual DWORD WaitForMultipleObjects (PHMHANDLEDATA pHMHandleData,
    80                                         DWORD   cObjects,
    81                                         PHANDLE lphObjects,
    82                                         BOOL    fWaitAll,
    83                                         DWORD   dwTimeout);
    84 
    85 #endif
    8642 
    8743  /* this is a handler method for calls to OpenEvent() */
  • trunk/src/kernel32/hmfile.cpp

    r9653 r9748  
    1 /* $Id: hmfile.cpp,v 1.38 2003-01-10 12:57:13 sandervl Exp $ */
     1/* $Id: hmfile.cpp,v 1.39 2003-02-04 11:28:57 sandervl Exp $ */
    22
    33/*
     
    305305 * Author    : SvL
    306306 *****************************************************************************/
    307 BOOL HMDeviceFileClass::DuplicateHandle(PHMHANDLEDATA pHMHandleData,
     307BOOL HMDeviceFileClass::DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData,
    308308                                        HANDLE  srcprocess,
    309309                                        PHMHANDLEDATA pHMSrcHandle,
  • trunk/src/kernel32/hmfile.h

    r9653 r9748  
    1 /* $Id: hmfile.h,v 1.8 2003-01-10 12:57:13 sandervl Exp $ */
     1/* $Id: hmfile.h,v 1.9 2003-02-04 11:28:58 sandervl Exp $ */
    22
    33/*
     
    5656                             UINT          fuMode);
    5757
    58   virtual BOOL DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
     58  virtual BOOL DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    5959                               PHMHANDLEDATA pHMSrcHandle,
    6060                               HANDLE  destprocess,
  • trunk/src/kernel32/hmmutex.cpp

    r6084 r9748  
    1 /* $Id: hmmutex.cpp,v 1.7 2001-06-23 16:59:28 sandervl Exp $ */
     1/* $Id: hmmutex.cpp,v 1.8 2003-02-04 11:28:58 sandervl Exp $ */
    22
    33/*
     
    2929 *****************************************************************************/
    3030
    31 #ifdef USE_OS2SEMAPHORES
    32 #define INCL_DOSSEMAPHORES
    33 #define INCL_DOSERRORS
    34 #include <os2wrap.h>
    35 #include <win32type.h>
    36 #include <win32api.h>
    37 #include <winconst.h>
    38 #else
    3931#include <os2win.h>
    40 #endif
    4132#include <stdlib.h>
    4233#include <string.h>
     
    8273                                      LPCTSTR               lpszMutexName)
    8374{
    84 #ifdef USE_OS2SEMAPHORES
    85   APIRET rc;
    86   HMTX htmx;
    87   char szSemName[CCHMAXPATH];
    88 
    89   dprintf(("KERNEL32: HandleManager::Mutex::CreateMutex(%08xh,%08xh,%08xh,%s)\n",
    90            pHMHandleData,
    91            lpsa,
    92            fInitialOwner,
    93            lpszMutexName));
    94 
    95   if(lpszMutexName) {
    96       strcpy(szSemName, "\\SEM32\\");
    97       strcat(szSemName, lpszMutexName);
    98       lpszMutexName = szSemName;
    99       FixSemName((char *)lpszMutexName);
    100   }
    101   rc = DosCreateMutexSem(lpszMutexName, &htmx, 0, fInitialOwner);
    102 
    103   if(rc) {
    104       dprintf(("DosCreateMutexSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    105       pHMHandleData->hHMHandle = 0;
    106       return error2WinError(rc);
    107   }
    108   pHMHandleData->dwAccess  = MUTEX_ALL_ACCESS_W;
    109   pHMHandleData->hHMHandle = htmx;
    110   pHMHandleData->dwInternalType = HMTYPE_MUTEXSEM;
    111   return ERROR_SUCCESS_W;
    112 #else
    11375  HANDLE hOpen32;
    11476
     
    12991  }
    13092  else
    131     return (O32_GetLastError());
    132 #endif
     93    return (GetLastError());
    13394}
    13495
     
    150111                                    LPCTSTR               lpszMutexName)
    151112{
    152 #ifdef USE_OS2SEMAPHORES
    153   HMTX   hmtx;
    154   APIRET rc;
    155   char szSemName[CCHMAXPATH];
    156 
    157   dprintf(("KERNEL32: HandleManager::Mutex::OpenMutex(%08xh,%08xh,%s)\n",
    158            pHMHandleData,
    159            fInheritHandle,
    160            lpszMutexName));
    161 
    162   if(lpszMutexName == NULL) {
    163       pHMHandleData->hHMHandle = 0;
    164       return ERROR_INVALID_PARAMETER_W;
    165   }
    166 
    167   strcpy(szSemName, "\\SEM32\\");
    168   strcat(szSemName, lpszMutexName);
    169   FixSemName(szSemName);
    170   rc = DosOpenMutexSem(szSemName, &hmtx);
    171   if(rc) {
    172       dprintf(("DosOpenMutexSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    173       pHMHandleData->hHMHandle = 0;
    174       return error2WinError(rc);
    175   }
    176   pHMHandleData->hHMHandle = hmtx;
    177   pHMHandleData->dwInternalType = HMTYPE_MUTEXSEM;
    178   return ERROR_SUCCESS_W;
    179 #else
    180113  HANDLE hOpen32;
    181114
     
    195128  }
    196129  else
    197     return (O32_GetLastError());
    198 #endif
     130    return (GetLastError());
    199131}
    200 
    201 /*****************************************************************************
    202  * Name      : HMDeviceMutexClass::CloseHandle
    203  * Purpose   : close the handle
    204  * Parameters: PHMHANDLEDATA pHMHandleData
    205  * Variables :
    206  * Result    : API returncode
    207  * Remark    :
    208  * Status    :
    209  *
    210  * Author    :
    211  *****************************************************************************/
    212 
    213 #ifdef USE_OS2SEMAPHORES
    214 BOOL HMDeviceMutexClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
    215 {
    216   APIRET rc;
    217 
    218   if(pHMHandleData->hHMHandle) {
    219       rc = DosCloseMutexSem((HEV)pHMHandleData->hHMHandle);
    220       if(rc) {
    221           dprintf(("DosCloseMutexSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    222           SetLastError(error2WinError(rc));
    223           return FALSE;
    224       }
    225   }
    226   return TRUE;
    227 }
    228 #endif
    229 
    230 /*****************************************************************************
    231  * Name      : HMDeviceMutexClass::DuplicateHandle
    232  * Purpose   :
    233  * Parameters:
    234  *             various parameters as required
    235  * Variables :
    236  * Result    :
    237  * Remark    : the standard behaviour is to return an error code for non-
    238  *             existant request codes
    239  * Status    :
    240  *
    241  * Author    :
    242  *****************************************************************************/
    243 #ifdef USE_OS2SEMAPHORES
    244 BOOL HMDeviceMutexClass::DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    245                                PHMHANDLEDATA pHMSrcHandle,
    246                                HANDLE  destprocess,
    247                                PHANDLE desthandle,
    248                                DWORD   fdwAccess,
    249                                BOOL    fInherit,
    250                                DWORD   fdwOptions,
    251                                DWORD   fdwOdinOptions)
    252 {
    253   APIRET rc;
    254   HMTX hmtx;
    255  
    256   dprintf(("KERNEL32:HandleManager::DuplicateHandle %s(%08x,%08x,%08x,%08x,%08x) - NOT IMPLEMENTED!!!!!!!!\n",
    257            lpHMDeviceName,
    258            pHMHandleData,
    259            srcprocess, pHMSrcHandle, destprocess, desthandle));
    260 
    261   if(srcprocess != destprocess) {
    262       DebugInt3();
    263       SetLastError(ERROR_ACCESS_DENIED_W);
    264       return FALSE;
    265   }
    266   hmtx = (HMTX)pHMSrcHandle->hHMHandle;
    267   rc = DosOpenMutexSem(NULL, &hmtx);
    268   if(rc) {
    269       dprintf(("DosOpenMutexSem %x failed with rc %d", pHMSrcHandle->hHMHandle, rc));
    270       pHMHandleData->hHMHandle = 0;
    271       SetLastError(error2WinError(rc));
    272       return FALSE;
    273   }
    274   pHMHandleData->dwAccess  = fdwAccess;
    275   pHMHandleData->hHMHandle = hmtx;
    276   pHMHandleData->dwInternalType = HMTYPE_MUTEXSEM;
    277   SetLastError(ERROR_SUCCESS_W);
    278   return TRUE;
    279 }
    280 #endif
    281 
    282 
    283 #ifdef USE_OS2SEMAPHORES
    284 /*****************************************************************************
    285  * Name      : DWORD HMDeviceOpen32Class::WaitForSingleObject
    286  * Purpose   : object synchronization
    287  * Parameters: PHMHANDLEDATA pHMHandleData
    288  *             DWORD dwTimeout
    289  * Variables :
    290  * Result    : API returncode
    291  * Remark    :
    292  * Status    :
    293  *
    294  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    295  *****************************************************************************/
    296 
    297 DWORD HMDeviceMutexClass::WaitForSingleObject(PHMHANDLEDATA pHMHandleData,
    298                                               DWORD         dwTimeout)
    299 {
    300  DWORD rc;
    301 
    302   dprintf2(("KERNEL32: HMDeviceMutexClass::WaitForSingleObject(%08xh %08xh)",
    303             pHMHandleData->hHMHandle, dwTimeout));
    304 
    305   if(!(pHMHandleData->dwAccess & SYNCHRONIZE_W) )
    306   {
    307       dprintf(("ERROR: Access denied!!"));
    308       SetLastError(ERROR_ACCESS_DENIED_W);
    309       return FALSE;
    310   }
    311 
    312   rc = DosRequestMutexSem(pHMHandleData->hHMHandle, dwTimeout);
    313   if(rc && rc != ERROR_INTERRUPT && rc != ERROR_TIMEOUT && rc != ERROR_SEM_OWNER_DIED) {
    314       dprintf(("DosWaitEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    315       SetLastError(error2WinError(rc));
    316       return WAIT_FAILED_W;
    317   }
    318   SetLastError(ERROR_SUCCESS_W);
    319   if(rc == ERROR_INTERRUPT || rc == ERROR_SEM_OWNER_DIED) {
    320       return WAIT_ABANDONED_W;
    321   }
    322   else
    323   if(rc == ERROR_TIMEOUT) {
    324       return WAIT_TIMEOUT_W;
    325   }
    326   return WAIT_OBJECT_0_W;
    327 }
    328 #endif
    329 
    330 #ifdef USE_OS2SEMAPHORES
    331 /*****************************************************************************
    332  * Name      : DWORD HMDeviceOpen32Class::WaitForSingleObjectEx
    333  * Purpose   : object synchronization
    334  * Parameters: PHMHANDLEDATA pHMHandleData
    335  *             DWORD dwTimeout
    336  *             BOOL  fAlertable
    337  * Variables :
    338  * Result    : API returncode
    339  * Remark    :
    340  * Status    :
    341  *
    342  * Author    : Patrick Haller [Wed, 1999/06/17 20:44]
    343  *****************************************************************************/
    344 
    345 DWORD HMDeviceMutexClass::WaitForSingleObjectEx(PHMHANDLEDATA pHMHandleData,
    346                                                 DWORD         dwTimeout,
    347                                                 BOOL          fAlertable)
    348 {
    349   dprintf2(("KERNEL32: HMDeviceMutexClass::WaitForSingleObjectEx(%08xh,%08h,%08xh) not implemented correctly.\n",
    350             pHMHandleData->hHMHandle, dwTimeout, fAlertable));
    351 
    352   if(!(pHMHandleData->dwAccess & SYNCHRONIZE_W) )
    353   {
    354       dprintf(("ERROR: Access denied!!"));
    355       SetLastError(ERROR_ACCESS_DENIED_W);
    356       return WAIT_FAILED_W;
    357   }
    358 
    359   return WaitForSingleObject(pHMHandleData, dwTimeout);
    360 }
    361 #endif
    362 
    363 #ifdef USE_OS2SEMAPHORES
    364 /*****************************************************************************
    365  * Name      : BOOL HMDeviceMutexClass::MsgWaitForMultipleObjects
    366  * Purpose   :
    367  * Variables :
    368  * Result    :
    369  * Remark    :
    370  * Status    :
    371  *
    372  * Author    : SvL
    373  *****************************************************************************/
    374 DWORD HMDeviceMutexClass::MsgWaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    375                                                     DWORD      nCount,
    376                                                     PHANDLE    pHandles,
    377                                                     BOOL       fWaitAll,
    378                                                     DWORD      dwMilliseconds,
    379                                                     DWORD      dwWakeMask)
    380 {
    381     return HMSemMsgWaitForMultipleObjects(nCount, pHandles, fWaitAll, dwMilliseconds, dwWakeMask);
    382 }
    383 #endif
    384 
    385 #ifdef USE_OS2SEMAPHORES
    386 /*****************************************************************************
    387  * Name      : BOOL HMDeviceMutexClass::WaitForMultipleObjects
    388  * Purpose   :
    389  * Variables :
    390  * Result    :
    391  * Remark    :
    392  * Status    :
    393  *
    394  * Author    : SvL
    395  *****************************************************************************/
    396 DWORD HMDeviceMutexClass::WaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    397                                                  DWORD   cObjects,
    398                                                  PHANDLE lphObjects,
    399                                                  BOOL    fWaitAll,
    400                                                  DWORD   dwTimeout)
    401 {
    402     return HMSemWaitForMultipleObjects(cObjects, lphObjects, fWaitAll, dwTimeout);
    403 }
    404 #endif
    405132
    406133/*****************************************************************************
     
    418145BOOL HMDeviceMutexClass::ReleaseMutex(PHMHANDLEDATA pHMHandleData)
    419146{
    420 #ifdef USE_OS2SEMAPHORES
    421   APIRET rc;
    422  
    423   dprintf(("KERNEL32: HandleManager::Mutex::ReleaseMutex(%08xh)\n",
    424            pHMHandleData->hHMHandle));
    425 
    426   rc = DosReleaseMutexSem(pHMHandleData->hHMHandle);
    427   if(rc) {
    428       dprintf(("DosReleaseMutexSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    429       SetLastError(error2WinError(rc));
    430       return FALSE;
    431   }
    432   SetLastError(ERROR_SUCCESS_W);
    433   return TRUE;
    434 #else
    435147  dprintf(("KERNEL32: HandleManager::Mutex::ReleaseMutex(%08xh)\n",
    436148           pHMHandleData->hHMHandle));
    437149
    438150  return (O32_ReleaseMutex(pHMHandleData->hHMHandle));
    439 #endif
    440151}
    441152
  • trunk/src/kernel32/hmmutex.h

    r6060 r9748  
    1 /* $Id: hmmutex.h,v 1.4 2001-06-21 21:07:54 sandervl Exp $ */
     1/* $Id: hmmutex.h,v 1.5 2003-02-04 11:28:59 sandervl Exp $ */
    22
    33/*
     
    2929 *****************************************************************************/
    3030
    31 #ifdef USE_OS2SEMAPHORES
    32 class HMDeviceMutexClass : public HMDeviceHandler
    33 #else
    3431class HMDeviceMutexClass : public HMDeviceOpen32Class
    35 #endif
    3632{
    3733public:
    38 #ifdef USE_OS2SEMAPHORES
    39   HMDeviceMutexClass(LPCSTR lpDeviceName) : HMDeviceHandler(lpDeviceName) {}
    40 #else
    4134  HMDeviceMutexClass(LPCSTR lpDeviceName) : HMDeviceOpen32Class(lpDeviceName) {}
    42 #endif
    4335
    4436  /* this is a handler method for calls to CreateMutex() */
     
    5244                             BOOL                  fInheritHandle,
    5345                             LPCTSTR               lpszMutexName);
    54 
    55 #ifdef USE_OS2SEMAPHORES
    56   virtual BOOL  CloseHandle(PHMHANDLEDATA pHMHandleData);
    57 
    58   virtual BOOL DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    59                                PHMHANDLEDATA pHMSrcHandle,
    60                                HANDLE  destprocess,
    61                                PHANDLE desthandle,
    62                                DWORD   fdwAccess,
    63                                BOOL    fInherit,
    64                                DWORD   fdwOptions,
    65                                DWORD   fdwOdinOptions);
    66 
    67   /* this is a handler method for calls to WaitForSingleObject */
    68   virtual DWORD WaitForSingleObject  (PHMHANDLEDATA pHMHandleData,
    69                                       DWORD  dwTimeout);
    70 
    71   /* this is a handler method for calls to WaitForSingleObjectEx */
    72   virtual DWORD WaitForSingleObjectEx(PHMHANDLEDATA pHMHandleData,
    73                                       DWORD  dwTimeout,
    74                                       BOOL   fAlertable);
    75 
    76   virtual DWORD MsgWaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    77                                           DWORD      nCount,
    78                                           PHANDLE       pHandles,
    79                                           BOOL       fWaitAll,
    80                                           DWORD      dwMilliseconds,
    81                                           DWORD      dwWakeMask);
    82 
    83   virtual DWORD WaitForMultipleObjects (PHMHANDLEDATA pHMHandleData,
    84                                         DWORD   cObjects,
    85                                         PHANDLE lphObjects,
    86                                         BOOL    fWaitAll,
    87                                         DWORD   dwTimeout);
    88 #endif
    8946                               
    9047  /* this is a handle method for calls to ReleaseMutex() */
  • trunk/src/kernel32/hmopen32.cpp

    r5587 r9748  
    1 /* $Id: hmopen32.cpp,v 1.29 2001-04-26 13:22:47 sandervl Exp $ */
     1/* $Id: hmopen32.cpp,v 1.30 2003-02-04 11:28:59 sandervl Exp $ */
    22
    33/*
     
    111111 * Author    : Patrick Haller [Wed, 1998/02/11 20:44]
    112112 *****************************************************************************/
    113 BOOL HMDeviceOpen32Class::DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
     113BOOL HMDeviceOpen32Class::DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    114114                               PHMHANDLEDATA pHMSrcHandle,
    115115                               HANDLE  destprocess,
  • trunk/src/kernel32/hmopen32.h

    r5587 r9748  
    1 /* $Id: hmopen32.h,v 1.8 2001-04-26 13:22:47 sandervl Exp $ */
     1/* $Id: hmopen32.h,v 1.9 2003-02-04 11:28:59 sandervl Exp $ */
    22
    33/*
     
    4242                                 ULONG         arg4);
    4343
    44   virtual BOOL DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
     44  virtual BOOL DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    4545                               PHMHANDLEDATA pHMSrcHandle,
    4646                               HANDLE  destprocess,
  • trunk/src/kernel32/hmsemaphore.cpp

    r6086 r9748  
    1 /* $Id: hmsemaphore.cpp,v 1.9 2001-06-23 19:43:50 sandervl Exp $ */
     1/* $Id: hmsemaphore.cpp,v 1.10 2003-02-04 11:29:00 sandervl Exp $ */
    22
    33/*
     
    1010 * TODO: OpenSemaphore does not work. (get SEM_INFO pointer)
    1111 * TODO: Name collisions with files & mutex not allowed. Check if this can happen in OS/2
     12 *
     13 * TODO: Use DosQueryEventSem to test the posted count against maximum count!!
    1214 *
    1315 * Project Odin Software License can be found in LICENSE.TXT
     
    3133 *****************************************************************************/
    3234
    33 #ifdef USE_OS2SEMAPHORES
    34 #define INCL_DOSSEMAPHORES
    35 #define INCL_DOSERRORS
    36 #define INCL_WIN
    37 #include <os2wrap.h>
    38 #include <win32type.h>
    39 #include <win32api.h>
    40 #include <winconst.h>
    41 #else
    4235#include <os2win.h>
    43 #endif
    4436#include <stdlib.h>
    4537#include <string.h>
     
    5446#define DBG_LOCALLOG    DBG_hmsemaphore
    5547#include "dbglocal.h"
    56 
    57 #ifndef DCE_AUTORESET
    58 #define DCE_AUTORESET   0x1000  /* DosCreateEventSem option to auto-reset  */
    59                                 /* event semaphore on post.                */
    60 #define DCE_POSTONE     0x0800  /* DosCreateEventSem option to post only   */
    61                                 /* waiter and auto-reset the semaphore when*/
    62                                 /* there are multiple waiters.             */
    63 
    64 #endif
    6548
    6649/*****************************************************************************
     
    9578                                              LPCTSTR               lpszSemaphoreName)
    9679{
    97 #ifdef USE_OS2SEMAPHORES
    98   APIRET rc;
    99   HEV hev;
    100   char szSemName[CCHMAXPATH];
    101 
    102 
    103   dprintf(("KERNEL32: HandleManager::Semaphore::CreateSemaphore(%08xh,%08xh,%08xh,%08xh,%s)\n",
    104            pHMHandleData,
    105            lpsa,
    106            lInitialCount,
    107            lMaximumCount,
    108            lpszSemaphoreName));
    109 
    110   if(lMaximumCount <= 0 || lInitialCount < 0 || lInitialCount > lMaximumCount) {
    111       dprintf(("ERROR: invalid parameter"));
    112       return ERROR_INVALID_PARAMETER_W;
    113   }
    114  
    115   if(lpszSemaphoreName) {
    116       strcpy(szSemName, "\\SEM32\\");
    117       strcat(szSemName, lpszSemaphoreName);
    118       lpszSemaphoreName = szSemName;
    119       FixSemName((char *)lpszSemaphoreName);
    120   }
    121   rc = DosCreateEventSem(lpszSemaphoreName, &hev, DCE_POSTONE, lInitialCount);
    122 
    123   if(rc) {
    124       dprintf(("DosCreateEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    125       pHMHandleData->hHMHandle = 0;
    126       return error2WinError(rc);
    127   }
    128   pHMHandleData->dwAccess  = SEMAPHORE_ALL_ACCESS_W;
    129   PSEM_INFO pSemInfo       = (PSEM_INFO)_smalloc(sizeof(SEM_INFO));
    130   pSemInfo->refCount       = 1;
    131   pSemInfo->hev            = hev;
    132   pSemInfo->maximumCount   = lMaximumCount;
    133   pSemInfo->currentCount   = lInitialCount;
    134   pHMHandleData->hHMHandle = (DWORD)pSemInfo;
    135   pHMHandleData->dwInternalType = HMTYPE_SEMAPHORE;
    136   return ERROR_SUCCESS_W;
    137 #else
    13880  HANDLE hOpen32;
    13981
     
    15698  }
    15799  else
    158     return (O32_GetLastError());
    159 #endif
     100    return (GetLastError());
    160101}
    161102
     
    177118                                            LPCTSTR               lpszSemaphoreName)
    178119{
    179 #ifdef USE_OS2SEMAPHORES
    180   HEV    hev;
    181   APIRET rc;
    182   char szSemName[CCHMAXPATH];
    183 
    184   //TODO: NOT WORKING (initialcount/maximumcount)
    185   dprintf(("KERNEL32: HandleManager::Semaphore::OpenSemaphore(%08xh,%08xh,%s)\n",
    186            pHMHandleData,
    187            fInheritHandle,
    188            lpszSemaphoreName));
    189 
    190   if(lpszSemaphoreName == NULL) {
    191       pHMHandleData->hHMHandle = 0;
    192       return ERROR_INVALID_PARAMETER_W;
    193   }
    194 
    195   strcpy(szSemName, "\\SEM32\\");
    196   strcat(szSemName, lpszSemaphoreName);
    197   FixSemName(szSemName);
    198   rc = DosOpenEventSem(szSemName, &hev);
    199   if(rc) {
    200       dprintf(("DosOpenEventSem %x failed with rc %d", pHMHandleData->hHMHandle, rc));
    201       pHMHandleData->hHMHandle = 0;
    202       return error2WinError(rc);
    203   }
    204   pHMHandleData->hHMHandle = hev;
    205   pHMHandleData->dwInternalType = HMTYPE_SEMAPHORE;
    206   return ERROR_SUCCESS_W;
    207 #else
    208120  HANDLE hOpen32;
    209121
     
    223135  }
    224136  else
    225     return (O32_GetLastError());
    226 #endif
     137    return (GetLastError());
    227138}
    228139
    229 /*****************************************************************************
    230  * Name      : HMDeviceEventClass::CloseHandle
    231  * Purpose   : close the handle
    232  * Parameters: PHMHANDLEDATA pHMHandleData
    233  * Variables :
    234  * Result    : API returncode
    235  * Remark    :
    236  * Status    :
    237  *
    238  * Author    :
    239  *****************************************************************************/
    240 
    241 #ifdef USE_OS2SEMAPHORES
    242 BOOL HMDeviceSemaphoreClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
    243 {
    244   APIRET rc;
    245   PSEM_INFO pSemInfo  = (PSEM_INFO)pHMHandleData->hHMHandle;
    246 
    247   if(pSemInfo) {
    248       rc = DosCloseEventSem(pSemInfo->hev);
    249       if(rc) {
    250           dprintf(("DosCloseEventSem %x failed with rc %d", pSemInfo->hev, rc));
    251           SetLastError(error2WinError(rc));
    252           return FALSE;
    253       }
    254       if(InterlockedDecrement(&pSemInfo->refCount) == 0) {
    255           free(pSemInfo);
    256       }
    257   }
    258   return TRUE;
    259 }
    260 #endif
    261 
    262 
    263 /*****************************************************************************
    264  * Name      : HMDeviceEventClass::DuplicateHandle
    265  * Purpose   :
    266  * Parameters:
    267  *             various parameters as required
    268  * Variables :
    269  * Result    :
    270  * Remark    : the standard behaviour is to return an error code for non-
    271  *             existant request codes
    272  * Status    :
    273  *
    274  * Author    :
    275  *****************************************************************************/
    276 #ifdef USE_OS2SEMAPHORES
    277 BOOL HMDeviceSemaphoreClass::DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    278                                PHMHANDLEDATA pHMSrcHandle,
    279                                HANDLE  destprocess,
    280                                PHANDLE desthandle,
    281                                DWORD   fdwAccess,
    282                                BOOL    fInherit,
    283                                DWORD   fdwOptions,
    284                                DWORD   fdwOdinOptions)
    285 {
    286   APIRET rc;
    287   HEV    hev;
    288   PSEM_INFO pSemInfo  = (PSEM_INFO)pHMSrcHandle->hHMHandle;
    289  
    290   dprintf(("KERNEL32:HandleManager::DuplicateHandle %s(%08x,%08x,%08x,%08x,%08x)",
    291            lpHMDeviceName,
    292            pHMHandleData,
    293            srcprocess, pHMSrcHandle, destprocess, desthandle));
    294 
    295   if(srcprocess != destprocess) {
    296       DebugInt3();
    297       SetLastError(ERROR_ACCESS_DENIED_W);
    298       return FALSE;
    299   }
    300   InterlockedIncrement(&pSemInfo->refCount);
    301   pHMHandleData->dwAccess  = fdwAccess;
    302   pHMHandleData->hHMHandle = (DWORD)pSemInfo;
    303   pHMHandleData->dwInternalType = HMTYPE_SEMAPHORE;
    304   SetLastError(ERROR_SUCCESS_W);
    305   return TRUE;
    306 }
    307 #endif
    308 
    309 #ifdef USE_OS2SEMAPHORES
    310 /*****************************************************************************
    311  * Name      : DWORD HMDeviceSemaphoreClass::WaitForSingleObject
    312  * Purpose   : object synchronization
    313  * Parameters: PHMHANDLEDATA pHMHandleData
    314  *             DWORD dwTimeout
    315  * Variables :
    316  * Result    : API returncode
    317  * Remark    :
    318  * Status    :
    319  *
    320  * Author    : SvL
    321  *****************************************************************************/
    322 
    323 DWORD HMDeviceSemaphoreClass::WaitForSingleObject(PHMHANDLEDATA pHMHandleData,
    324                                                   DWORD         dwTimeout)
    325 {
    326  DWORD rc;
    327 
    328   dprintf2(("KERNEL32: HMDeviceSemaphoreClass::WaitForSingleObject(%08xh %08xh)",
    329             pHMHandleData->hHMHandle, dwTimeout));
    330 
    331   if(!(pHMHandleData->dwAccess & SYNCHRONIZE_W) )
    332   {
    333       dprintf(("ERROR: Access denied!!"));
    334       SetLastError(ERROR_ACCESS_DENIED_W);
    335       return WAIT_FAILED_W;
    336   }
    337 
    338   PSEM_INFO pSemInfo  = (PSEM_INFO)pHMHandleData->hHMHandle;
    339 
    340   if(InterlockedDecrement(&pSemInfo->currentCount) >= 0) {
    341       SetLastError(ERROR_SUCCESS_W);
    342       return WAIT_OBJECT_0_W; 
    343   }
    344 
    345   rc = DosWaitEventSem(pSemInfo->hev, dwTimeout);
    346   if(rc && rc != ERROR_INTERRUPT && rc != ERROR_TIMEOUT && rc != ERROR_SEM_OWNER_DIED) {
    347       dprintf(("DosWaitEventSem %x failed with rc %d", pSemInfo->hev, rc));
    348       SetLastError(error2WinError(rc));
    349       return WAIT_FAILED_W;
    350   }
    351   SetLastError(ERROR_SUCCESS_W);
    352   if(rc == ERROR_INTERRUPT || rc == ERROR_SEM_OWNER_DIED) {
    353       return WAIT_ABANDONED_W;
    354   }
    355   else
    356   if(rc == ERROR_TIMEOUT) {
    357       return WAIT_TIMEOUT_W;
    358   }
    359   return WAIT_OBJECT_0_W;
    360 }
    361 #endif
    362 
    363 #ifdef USE_OS2SEMAPHORES
    364 /*****************************************************************************
    365  * Name      : DWORD HMDeviceSemaphoreClass::WaitForSingleObjectEx
    366  * Purpose   : object synchronization
    367  * Parameters: PHMHANDLEDATA pHMHandleData
    368  *             DWORD dwTimeout
    369  *             BOOL  fAlertable
    370  * Variables :
    371  * Result    : API returncode
    372  * Remark    :
    373  * Status    :
    374  *
    375  * Author    : SvL
    376  *****************************************************************************/
    377 
    378 DWORD HMDeviceSemaphoreClass::WaitForSingleObjectEx(PHMHANDLEDATA pHMHandleData,
    379                                                  DWORD         dwTimeout,
    380                                                  BOOL          fAlertable)
    381 {
    382     dprintf2(("KERNEL32: HMDeviceSemaphoreClass::WaitForSingleObjectEx(%08xh,%08h,%08xh) not implemented correctly.\n",
    383               pHMHandleData->hHMHandle, dwTimeout, fAlertable));
    384 
    385     if(!(pHMHandleData->dwAccess & SYNCHRONIZE_W) )
    386     {
    387         dprintf(("ERROR: Access denied!!"));
    388         SetLastError(ERROR_ACCESS_DENIED_W);
    389         return WAIT_FAILED_W;
    390     }
    391 
    392     return WaitForSingleObject(pHMHandleData, dwTimeout);
    393 }
    394 #endif
    395 
    396 #ifdef USE_OS2SEMAPHORES
    397 /*****************************************************************************
    398  * Name      : BOOL HMDeviceSemaphoreClass::MsgWaitForMultipleObjects
    399  * Purpose   :
    400  * Variables :
    401  * Result    :
    402  * Remark    :
    403  * Status    :
    404  *
    405  * Author    : SvL
    406  *****************************************************************************/
    407 DWORD HMDeviceSemaphoreClass::MsgWaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    408                                                         DWORD      nCount,
    409                                                         PHANDLE    pHandles,
    410                                                         BOOL       fWaitAll,
    411                                                         DWORD      dwMilliseconds,
    412                                                         DWORD      dwWakeMask)
    413 {
    414     return HMSemMsgWaitForMultipleObjects(nCount, pHandles, fWaitAll, dwMilliseconds, dwWakeMask);
    415 }
    416 
    417 DWORD HMSemMsgWaitForMultipleObjects(DWORD   cObjects,
    418                                      PHANDLE lphObjects,
    419                                      BOOL    fWaitAll,
    420                                      DWORD   dwTimeout,
    421                                      DWORD   dwWakeMask)
    422 {
    423     PHMHANDLEDATA *pHandles;
    424     HMUX hmux;
    425     PSEMRECORD pSemRec;
    426     int i, j;
    427     APIRET rc;
    428     ULONG  ulUser;
    429     static HMODULE hUser32 = 0;
    430     static BOOL (* WINAPI pfnPeekMessageA)(LPMSG,HWND,UINT,UINT,UINT);
    431 
    432     dprintf(("KERNEL32: WaitForMultipleObjects %d %x %d %x",
    433               cObjects, lphObjects, fWaitAll, dwTimeout));
    434 
    435     if(pfnPeekMessageA == NULL) {
    436           hUser32 = LoadLibraryA("USER32.DLL");
    437           *(FARPROC *)&pfnPeekMessageA = GetProcAddress(hUser32,"PeekMessageA");
    438     }   
    439 
    440     if(cObjects == 1) {
    441         //Can't use DosCreateMuxWaitSem here (will return error 292)
    442         PHMHANDLEDATA pHandle = HMQueryHandleData(lphObjects[0]);
    443         if(pHandle == NULL) {
    444             return WAIT_FAILED_W;
    445         }
    446         if(!(pHandle->dwAccess & SYNCHRONIZE_W) )
    447         {
    448             dprintf(("ERROR: Access denied (handle %x, index 0)!!", lphObjects[0]));
    449             SetLastError(ERROR_ACCESS_DENIED_W);
    450             return WAIT_FAILED_W;
    451         }
    452 
    453         switch(pHandle->dwInternalType) {
    454         case HMTYPE_SEMAPHORE:
    455         {
    456             PSEM_INFO pSemInfo  = (PSEM_INFO)pHandle->hHMHandle;
    457 
    458             dprintf(("KERNEL32: HMWaitForMultipleObjects(S): handle 0: ODIN-%08xh, OS/2-%08xh",
    459                      lphObjects[0], pSemInfo->hev));
    460             if(InterlockedDecrement(&pSemInfo->currentCount) >= 0) {
    461                 return WAIT_OBJECT_0_W;
    462             }
    463             rc = WinWaitEventSem(pSemInfo->hev, dwTimeout);
    464             break;
    465         }
    466         case HMTYPE_EVENTSEM:
    467             dprintf(("KERNEL32: HMWaitForMultipleObjects(E): handle 0: ODIN-%08xh, OS/2-%08xh",
    468                      lphObjects[0], pHandle->hHMHandle));
    469             rc = WinWaitEventSem((HEV)pHandle->hHMHandle, dwTimeout);
    470             break;
    471         case HMTYPE_MUTEXSEM:
    472             dprintf(("KERNEL32: HMWaitForMultipleObjects(M): handle 0: ODIN-%08xh, OS/2-%08xh",
    473                      lphObjects[0], pHandle->hHMHandle));
    474             rc = WinRequestMutexSem((HMTX)pHandle->hHMHandle, dwTimeout);
    475             break;
    476         }
    477         if(rc && rc != ERROR_INTERRUPT && rc != ERROR_TIMEOUT && rc != ERROR_SEM_OWNER_DIED) {
    478             dprintf(("WinWaitEventSem/WinRequestMutexSem %x failed with rc %d", pHandle->hHMHandle, rc));
    479             SetLastError(error2WinError(rc));
    480             return WAIT_FAILED_W;
    481         }
    482         SetLastError(ERROR_SUCCESS_W);
    483         if(rc == ERROR_INTERRUPT || rc == ERROR_SEM_OWNER_DIED) {
    484             dprintf(("WAIT_ABANDONED_W (rc %d)", rc));
    485             return WAIT_ABANDONED_W;
    486         }
    487         else
    488         if(rc == ERROR_TIMEOUT) {
    489             dprintf(("WAIT_TIMEOUT_W (rc %d)", rc));
    490             return WAIT_TIMEOUT_W;
    491         }
    492         MSG msg ;
    493    
    494         if(pfnPeekMessageA(&msg, NULL, 0, 0, PM_NOREMOVE_W) == TRUE) {
    495             dprintf(("WAIT_OBJECT_0_W+1 (rc %d)", rc));
    496             return WAIT_OBJECT_0_W + 1;
    497         }
    498         dprintf(("WAIT_OBJECT_0_W+1 (rc %d)", rc));
    499         return WAIT_OBJECT_0_W;
    500     }
    501     pHandles = (PHMHANDLEDATA *)alloca(cObjects * sizeof(PHMHANDLEDATA));
    502     pSemRec  = (PSEMRECORD)alloca(cObjects * sizeof(SEMRECORD));
    503     if(pHandles == NULL || pSemRec == NULL) {
    504         dprintf(("ERROR: out of memory!!"));
    505         SetLastError(ERROR_OUTOFMEMORY_W);
    506         return WAIT_FAILED_W;
    507     }
    508     for(i=0;i<cObjects;i++) {
    509         pHandles[i] = HMQueryHandleData(lphObjects[i]);
    510         if(pHandles[i] == NULL) {
    511             dprintf(("ERROR: handle %x not recognized", lphObjects[i]));
    512             SetLastError(ERROR_INVALID_HANDLE_W);
    513             return WAIT_FAILED_W;
    514         }
    515         if(!(pHandles[i]->dwAccess & SYNCHRONIZE_W) )
    516         {
    517             dprintf(("ERROR: Access denied (handle %x, index %d)!!", lphObjects[i], i));
    518             SetLastError(ERROR_ACCESS_DENIED_W);
    519             return WAIT_FAILED_W;
    520         }
    521         if(pHandles[i]->dwInternalType == HMTYPE_SEMAPHORE) {
    522             PSEM_INFO pSemInfo  = (PSEM_INFO)pHandles[i]->hHMHandle;
    523             dprintf(("KERNEL32: HMWaitForMultipleObjects: handle %3i: ODIN-%08xh, OS/2-%08xh",
    524                      i, lphObjects[i], pSemInfo->hev));
    525         }
    526         else
    527             dprintf(("KERNEL32: HMWaitForMultipleObjects: handle %3i: ODIN-%08xh, OS/2-%08xh",
    528                      i, lphObjects[i], pHandles[i]->hHMHandle));
    529 
    530     }
    531     j = 0;
    532     for(i=0;i<cObjects;i++) {
    533         if(pHandles[i]->dwInternalType == HMTYPE_SEMAPHORE) {
    534             PSEM_INFO pSemInfo  = (PSEM_INFO)pHandles[i]->hHMHandle;
    535 
    536             if(InterlockedDecrement(&pSemInfo->currentCount) >= 0) {
    537                 if(!fWaitAll) {
    538                     return WAIT_OBJECT_0_W + i;
    539                 }
    540             }
    541             else {
    542                 pSemRec[j].hsemCur = (HSEM)pSemInfo->hev;
    543                 pSemRec[j].ulUser = j;
    544                 j++;
    545             }
    546         }
    547         else {
    548             pSemRec[j].hsemCur = (HSEM)pHandles[i]->hHMHandle;
    549             pSemRec[j].ulUser = j;
    550             j++;
    551         }
    552     }
    553     rc = DosCreateMuxWaitSem(NULL, &hmux, j, pSemRec, (fWaitAll) ? DCMW_WAIT_ALL : DCMW_WAIT_ANY);
    554     if(rc) {
    555         dprintf(("DosCreateMuxWaitSem failed with rc %d", rc));
    556         SetLastError(error2WinError(rc));
    557         return WAIT_FAILED_W;
    558     }
    559     ulUser = -1;
    560     rc = WinWaitMuxWaitSem(hmux, dwTimeout, &ulUser);
    561     DosCloseMuxWaitSem(hmux);
    562     if(rc && rc != ERROR_INTERRUPT && rc != ERROR_TIMEOUT && rc != ERROR_SEM_OWNER_DIED) {
    563         dprintf(("DosWaitMuxWaitSem %x failed with rc %d", hmux, rc));
    564         SetLastError(error2WinError(rc));
    565         return WAIT_FAILED_W;
    566     }
    567     SetLastError(ERROR_SUCCESS_W);
    568     if(rc == ERROR_INTERRUPT || rc == ERROR_SEM_OWNER_DIED) {
    569         //TODO: add index of handle that caused the error....
    570         dprintf(("WAIT_ABANDONED_W"));
    571         return WAIT_ABANDONED_W;
    572     }
    573     else
    574     if(rc == ERROR_TIMEOUT) {
    575         dprintf(("WAIT_TIMEOUT_W"));
    576         return WAIT_TIMEOUT_W;
    577     }
    578     if(ulUser == -1) {
    579         dprintf(("WAIT_OBJECT_0_W+%d", cObjects));
    580         return WAIT_OBJECT_0_W + cObjects; //message waiting
    581     }
    582     dprintf(("WAIT_OBJECT_0_W+%d", ulUser));
    583     return WAIT_OBJECT_0_W + ulUser;
    584 }
    585 
    586 #endif
    587 
    588 #ifdef USE_OS2SEMAPHORES
    589 /*****************************************************************************
    590  * Name      : BOOL HMDeviceSemaphoreClass::WaitForMultipleObjects
    591  * Purpose   :
    592  * Variables :
    593  * Result    :
    594  * Remark    :
    595  * Status    :
    596  *
    597  * Author    : SvL
    598  *****************************************************************************/
    599 DWORD HMDeviceSemaphoreClass::WaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    600                                                  DWORD   cObjects,
    601                                                  PHANDLE lphObjects,
    602                                                  BOOL    fWaitAll,
    603                                                  DWORD   dwTimeout)
    604 {
    605     return HMSemWaitForMultipleObjects(cObjects, lphObjects, fWaitAll, dwTimeout);
    606 }
    607 
    608 DWORD HMSemWaitForMultipleObjects(DWORD   cObjects,
    609                                   PHANDLE lphObjects,
    610                                   BOOL    fWaitAll,
    611                                   DWORD   dwTimeout)
    612 {
    613     PHMHANDLEDATA *pHandles;
    614     HMUX hmux;
    615     PSEMRECORD pSemRec;
    616     int i, j;
    617     APIRET rc;
    618     ULONG  ulUser;
    619 
    620     dprintf(("KERNEL32: WaitForMultipleObjects %d %x %d %x",
    621               cObjects, lphObjects, fWaitAll, dwTimeout));
    622 
    623     pHandles = (PHMHANDLEDATA *)alloca(cObjects * sizeof(PHMHANDLEDATA));
    624     pSemRec  = (PSEMRECORD)alloca(cObjects * sizeof(SEMRECORD));
    625     if(pHandles == NULL || pSemRec == NULL) {
    626         dprintf(("ERROR: out of memory!!"));
    627         SetLastError(ERROR_OUTOFMEMORY_W);
    628         return WAIT_FAILED_W;
    629     }
    630     for(i=0;i<cObjects;i++) {
    631         pHandles[i] = HMQueryHandleData(lphObjects[i]);
    632         if(pHandles[i] == NULL) {
    633             dprintf(("ERROR: handle %x not recognized", lphObjects[i]));
    634         }
    635         if(!(pHandles[i]->dwAccess & EVENT_MODIFY_STATE_W) )
    636         {
    637             dprintf(("ERROR: Access denied (handle %x, index %d)!!", lphObjects[i], i));
    638             SetLastError(ERROR_INVALID_HANDLE_W);
    639             return WAIT_FAILED_W;
    640         }
    641         if(pHandles[i]->dwInternalType == HMTYPE_SEMAPHORE) {
    642             PSEM_INFO pSemInfo  = (PSEM_INFO)pHandles[i]->hHMHandle;
    643             dprintf(("KERNEL32: HMWaitForMultipleObjects: handle %3i: ODIN-%08xh, OS/2-%08xh",
    644                      i, lphObjects[i], pSemInfo->hev));
    645         }
    646         else
    647             dprintf(("KERNEL32: HMWaitForMultipleObjects: handle %3i: ODIN-%08xh, OS/2-%08xh",
    648                      i, lphObjects[i], pHandles[i]->hHMHandle));
    649 
    650     }
    651     j = 0;
    652     for(i=0;i<cObjects;i++) {
    653         if(pHandles[i]->dwInternalType == HMTYPE_SEMAPHORE) {
    654             PSEM_INFO pSemInfo  = (PSEM_INFO)pHandles[i]->hHMHandle;
    655 
    656             if(InterlockedDecrement(&pSemInfo->currentCount) >= 0) {
    657                 if(!fWaitAll) {
    658                     return WAIT_OBJECT_0_W + i;
    659                 }
    660             }
    661             else {
    662                 pSemRec[j].hsemCur = (HSEM)pSemInfo->hev;
    663                 pSemRec[j].ulUser = j;
    664                 j++;
    665             }
    666         }
    667         else {
    668             pSemRec[j].hsemCur = (HSEM)pHandles[i]->hHMHandle;
    669             pSemRec[j].ulUser = j;
    670             j++;
    671         }
    672     }
    673     rc = DosCreateMuxWaitSem(NULL, &hmux, j, pSemRec, (fWaitAll) ? DCMW_WAIT_ALL : DCMW_WAIT_ANY);
    674     if(rc) {
    675         dprintf(("DosCreateMuxWaitSem failed with rc %d", rc));
    676         SetLastError(error2WinError(rc));
    677         return WAIT_FAILED_W;
    678     }
    679     rc = DosWaitMuxWaitSem(hmux, dwTimeout, &ulUser);
    680     DosCloseMuxWaitSem(hmux);
    681     if(rc && rc != ERROR_INTERRUPT && rc != ERROR_TIMEOUT && rc != ERROR_SEM_OWNER_DIED) {
    682         dprintf(("DosWaitMuxWaitSem %x failed with rc %d", hmux, rc));
    683         SetLastError(error2WinError(rc));
    684         return WAIT_FAILED_W;
    685     }
    686     SetLastError(ERROR_SUCCESS_W);
    687     if(rc == ERROR_INTERRUPT || rc == ERROR_SEM_OWNER_DIED) {
    688         //TODO: add index of handle that caused the error....
    689         return WAIT_ABANDONED_W;
    690     }
    691     else
    692     if(rc == ERROR_TIMEOUT) {
    693         return WAIT_TIMEOUT_W;
    694     }
    695     return WAIT_OBJECT_0_W + ulUser;
    696 }
    697 
    698 #endif
    699140
    700141/*****************************************************************************
     
    714155                                              LPLONG        lpPreviousCount)
    715156{
    716 #ifdef USE_OS2SEMAPHORES
    717   APIRET rc;
    718   ULONG count; 
    719  
    720   dprintf2(("KERNEL32: HandleManager::Semaphore::ReleaseSemaphore(%08xh,%08xh,%08xh)\n",
    721             pHMHandleData->hHMHandle,
    722             cReleaseCount,
    723             lpPreviousCount));
    724 
    725   if(!(pHMHandleData->dwAccess & SEMAPHORE_MODIFY_STATE_W) )
    726   {
    727       dprintf(("ERROR: Access denied!!"));
    728       SetLastError(ERROR_ACCESS_DENIED_W);
    729       return FALSE;
    730   }
    731 
    732   PSEM_INFO pSemInfo  = (PSEM_INFO)pHMHandleData->hHMHandle;
    733 
    734   if(InterlockedIncrement(&pSemInfo->currentCount) > 0) {
    735       //TODO: this is NOT thread safe:
    736       if(pSemInfo->currentCount > pSemInfo->maximumCount) {
    737           pSemInfo->currentCount = pSemInfo->maximumCount;
    738       }
    739       SetLastError(ERROR_SUCCESS_W);
    740       return TRUE; 
    741   }
    742 
    743   rc = DosResetEventSem(pSemInfo->hev, &count);
    744   if(rc && rc != ERROR_ALREADY_RESET) {
    745       dprintf(("DosResetEventSem %x failed with rc %d", pSemInfo->hev, rc));
    746       SetLastError(error2WinError(rc));
    747       return FALSE;
    748   }
    749   SetLastError(ERROR_SUCCESS_W);
    750   return TRUE;
    751 #else
    752157  dprintf(("KERNEL32: HandleManager::Semaphore::ReleaseSemaphore(%08xh,%08xh,%08xh)\n",
    753158           pHMHandleData->hHMHandle,
     
    758163                               cReleaseCount,
    759164                               lpPreviousCount));
    760 #endif
    761165}
    762166
    763167//******************************************************************************
    764 //Replaces illegal characters in semaphore name (or else OS/2 will return
    765 //ERROR_INVALID_NAME
    766168//******************************************************************************
    767 void FixSemName(char *lpszSemaphoreName)
    768 {
    769     while(TRUE) {
    770         switch(*lpszSemaphoreName) {
    771         case 0:
    772             return;
    773         case '?':
    774         case ':':
    775             *lpszSemaphoreName = '_';
    776             break;
    777         }
    778         lpszSemaphoreName++;
    779     }
    780 }
    781 //******************************************************************************
    782 //******************************************************************************
  • trunk/src/kernel32/hmsemaphore.h

    r6084 r9748  
    1 /* $Id: hmsemaphore.h,v 1.5 2001-06-23 16:59:28 sandervl Exp $ */
     1/* $Id: hmsemaphore.h,v 1.6 2003-02-04 11:29:00 sandervl Exp $ */
    22
    33/*
     
    2424#include "HMOpen32.h"
    2525
    26 #ifdef USE_OS2SEMAPHORES
    27 typedef struct {
    28     LONG   currentCount;
    29     LONG   maximumCount;
    30     LONG   refCount;
    31     ULONG  hev;
    32 } SEM_INFO, *PSEM_INFO;
    33 #endif
    34 
    3526
    3627/*****************************************************************************
     
    3829 *****************************************************************************/
    3930
    40 #ifdef USE_OS2SEMAPHORES
    41 class HMDeviceSemaphoreClass : public HMDeviceHandler
    42 #else
    4331class HMDeviceSemaphoreClass : public HMDeviceOpen32Class
    44 #endif
    4532{
    4633public:
    47 #ifdef USE_OS2SEMAPHORES
    48   HMDeviceSemaphoreClass(LPCSTR lpDeviceName) : HMDeviceHandler(lpDeviceName) {}
    49 #else
    5034  HMDeviceSemaphoreClass(LPCSTR lpDeviceName) : HMDeviceOpen32Class(lpDeviceName) {}
    51 #endif
    5235
    5336  /* this is a handler method for calls to CreateSemaphore() */
     
    6245                                 BOOL                  fInheritHandle,
    6346                                 LPCTSTR               lpszSemaphoreName);
    64 
    65 #ifdef USE_OS2SEMAPHORES
    66   virtual BOOL  CloseHandle(PHMHANDLEDATA pHMHandleData);
    67 
    68   virtual BOOL DuplicateHandle(PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
    69                                PHMHANDLEDATA pHMSrcHandle,
    70                                HANDLE  destprocess,
    71                                PHANDLE desthandle,
    72                                DWORD   fdwAccess,
    73                                BOOL    fInherit,
    74                                DWORD   fdwOptions,
    75                                DWORD   fdwOdinOptions);
    76 
    77   /* this is a handler method for calls to WaitForSingleObject */
    78   virtual DWORD WaitForSingleObject  (PHMHANDLEDATA pHMHandleData,
    79                                       DWORD  dwTimeout);
    80 
    81   /* this is a handler method for calls to WaitForSingleObjectEx */
    82   virtual DWORD WaitForSingleObjectEx(PHMHANDLEDATA pHMHandleData,
    83                                       DWORD  dwTimeout,
    84                                       BOOL   fAlertable);
    85 
    86   virtual DWORD MsgWaitForMultipleObjects(PHMHANDLEDATA pHMHandleData,
    87                                           DWORD      nCount,
    88                                           PHANDLE       pHandles,
    89                                           BOOL       fWaitAll,
    90                                           DWORD      dwMilliseconds,
    91                                           DWORD      dwWakeMask);
    92 
    93   virtual DWORD WaitForMultipleObjects (PHMHANDLEDATA pHMHandleData,
    94                                         DWORD   cObjects,
    95                                         PHANDLE lphObjects,
    96                                         BOOL    fWaitAll,
    97                                         DWORD   dwTimeout);
    98 
    99 #endif
    10047
    10148  /* this is a handle method for calls to ReleaseSemaphore() */
     
    11764                                      DWORD   dwWakeMask);
    11865
    119 void FixSemName(char *lpszSemaphoreName);
    12066
    12167#endif /* _HM_DEVICE_SEMAPHORE_H_ */
  • trunk/src/kernel32/hmthread.cpp

    r9667 r9748  
    1 /* $Id: hmthread.cpp,v 1.17 2003-01-13 16:51:39 sandervl Exp $ */
     1/* $Id: hmthread.cpp,v 1.18 2003-02-04 11:29:00 sandervl Exp $ */
    22
    33/*
     
    4040#include "dbglocal.h"
    4141
     42
     43typedef struct {
     44  HANDLE hDupThread;    //original thread handle if duplicated
     45  DWORD  dwState;       //THREAD_ALIVE, THREAD_TERMINATED
     46} OBJ_THREAD;
     47
     48#define GET_THREADHANDLE(hThread) (threadobj && threadobj->hDupThread) ? threadobj->hDupThread : hThread
    4249
    4350//******************************************************************************
     
    6067    }
    6168    pHMHandleData->dwInternalType = HMTYPE_THREAD;
    62     pHMHandleData->dwUserData     = THREAD_ALIVE;
     69    OBJ_THREAD *threadobj = (OBJ_THREAD *)malloc(sizeof(OBJ_THREAD));
     70    if(threadobj == 0) {
     71        DebugInt3();
     72        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
     73        return(0);
     74    }
     75    threadobj->hDupThread = 0;  //not a duplicate
     76    threadobj->dwState = THREAD_ALIVE;
     77    pHMHandleData->dwUserData = (DWORD)threadobj;
    6378
    6479    //SvL: This doesn't really create a thread, but only sets up the
    6580    //     handle of thread 0
    6681    if(fFirstThread) {
    67             pHMHandleData->hHMHandle = O32_GetCurrentThread(); //return Open32 handle of thread
    68             return pHMHandleData->hHMHandle;
     82        pHMHandleData->hHMHandle = O32_GetCurrentThread(); //return Open32 handle of thread
     83        return pHMHandleData->hHMHandle;
    6984    }
    7085    winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate, hThread);
     
    112127    return pHMHandleData->hHMHandle;
    113128}
     129/*****************************************************************************
     130 * Name      : HMDeviceFileClass::DuplicateHandle
     131 * Purpose   :
     132 * Parameters:
     133 *             various parameters as required
     134 * Variables :
     135 * Result    :
     136 * Remark    : DUPLICATE_CLOSE_SOURCE flag handled in HMDuplicateHandle
     137 *
     138 * Status    : partially implemented
     139 *
     140 * Author    : SvL
     141 *****************************************************************************/
     142BOOL HMDeviceThreadClass::DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData,
     143                                          HANDLE  srcprocess,
     144                                          PHMHANDLEDATA pHMSrcHandle,
     145                                          HANDLE  destprocess,
     146                                          PHANDLE desthandle,
     147                                          DWORD   fdwAccess,
     148                                          BOOL    fInherit,
     149                                          DWORD   fdwOptions,
     150                                          DWORD   fdwOdinOptions)
     151{
     152  BOOL ret;
     153  OBJ_THREAD *threadsrc = (OBJ_THREAD *)pHMSrcHandle->dwUserData;
     154
     155  dprintf(("KERNEL32:HMDeviceThreadClass::DuplicateHandle (%08x,%08x,%08x,%08x,%08x)",
     156           pHMHandleData, srcprocess, pHMSrcHandle->hHMHandle, destprocess, desthandle));
     157
     158  if(destprocess != srcprocess)
     159  {
     160      dprintf(("ERROR: DuplicateHandle; different processes not supported!!"));
     161      SetLastError(ERROR_INVALID_HANDLE); //??
     162      return FALSE;
     163  }
     164  ret = O32_DuplicateHandle(srcprocess, pHMSrcHandle->hHMHandle, destprocess, desthandle, fdwAccess, fInherit, fdwOptions);
     165
     166  if(ret == TRUE) {
     167       OBJ_THREAD *threaddest = (OBJ_THREAD *)malloc(sizeof(OBJ_THREAD));
     168       if(threaddest == NULL) {
     169           O32_CloseHandle(*desthandle);
     170           SetLastError(ERROR_NOT_ENOUGH_MEMORY);
     171           return FALSE;
     172       }
     173       threaddest->hDupThread = 0;
     174       threaddest->dwState    = THREAD_ALIVE;
     175       pHMHandleData->dwUserData = (DWORD)threaddest;
     176
     177       if(threadsrc) {
     178           threaddest->hDupThread = (threadsrc->hDupThread) ? threadsrc->hDupThread : srchandle;
     179           threaddest->dwState    = threadsrc->dwState;
     180       }
     181
     182       pHMHandleData->hHMHandle = *desthandle;
     183       return TRUE;
     184  }
     185  else return FALSE;
     186}
    114187//******************************************************************************
    115188//******************************************************************************
     
    117190{
    118191    DWORD dwSuspend;
    119 
    120     TEB *teb = GetTEBFromThreadHandle(hThread);
     192    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     193
     194    TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread));
    121195    if(teb) {
    122196        teb->o.odin.dwSuspend++;
     
    135209{
    136210    DWORD dwSuspend;
    137     TEB *teb = GetTEBFromThreadHandle(hThread);
     211    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     212
     213    TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread));
    138214    if(teb) {
    139215        teb->o.odin.dwSuspend--;
     
    151227INT HMDeviceThreadClass::GetThreadPriority(HANDLE hThread, PHMHANDLEDATA pHMHandleData)
    152228{
    153     TEB *teb;
     229    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
    154230
    155231    dprintf(("GetThreadPriority(%08xh)\n", pHMHandleData->hHMHandle));
    156232
    157     teb = GetTEBFromThreadHandle(hThread);
     233    TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread));
    158234    if(teb == NULL) {
    159235        dprintf(("!WARNING!: TEB not found!!"));
     
    167243BOOL HMDeviceThreadClass::SetThreadPriority(HANDLE hThread, PHMHANDLEDATA pHMHandleData, int priority)
    168244{
    169     TEB  *teb;
     245    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
    170246
    171247    dprintf(("SetThreadPriority (%08xh,%08xh)", pHMHandleData->hHMHandle, priority));
    172248
    173     teb = GetTEBFromThreadHandle(hThread);
     249    TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread));
    174250    if(teb == NULL) {
    175251        dprintf(("!WARNING!: TEB not found!!"));
     
    214290  return FALSE;
    215291}
     292/*****************************************************************************
     293 * Name      : BOOL GetThreadTimes
     294 * Purpose   : The GetThreadTimes function obtains timing information about a specified thread.
     295 * Parameters: HANDLE     hThread       specifies the thread of interest
     296 *             LPFILETIME lpCreationTime when the thread was created
     297 *             LPFILETIME lpExitTime     when the thread exited
     298 *             LPFILETIME lpKernelTime   time the thread has spent in kernel mode
     299 *             LPFILETIME lpUserTime     time the thread has spent in user mode
     300 * Variables :
     301 * Result    : TRUE / FALSE
     302 * Remark    :
     303 * Status    : UNTESTED STUB
     304 *
     305 * Author    : Patrick Haller [Mon, 1998/06/15 08:00]
     306 *****************************************************************************/
     307
     308BOOL HMDeviceThreadClass::GetThreadTimes(HANDLE        hThread,
     309                                         PHMHANDLEDATA pHMHandleData,
     310                                         LPFILETIME lpCreationTime,
     311                                         LPFILETIME lpExitTime,
     312                                         LPFILETIME lpKernelTime,
     313                                         LPFILETIME lpUserTime)
     314{
     315  dprintf(("Kernel32: GetThreadTimes(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
     316           hThread,
     317           lpCreationTime,
     318           lpExitTime,
     319           lpKernelTime,
     320           lpUserTime));
     321
     322  return (FALSE);
     323}
    216324//******************************************************************************
    217325//******************************************************************************
    218326BOOL HMDeviceThreadClass::TerminateThread(HANDLE hThread, PHMHANDLEDATA pHMHandleData, DWORD exitcode)
    219327{
     328    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     329
    220330    dprintf(("TerminateThread (%08xh,%08xh)\n",
    221331             pHMHandleData->hHMHandle,
    222332             exitcode));
    223333
    224     pHMHandleData->dwUserData = THREAD_TERMINATED;
     334    if(threadobj) {
     335        threadobj->dwState = THREAD_TERMINATED;
     336    }
     337    else DebugInt3();
    225338    return O32_TerminateThread(pHMHandleData->hHMHandle, exitcode);
    226339}
     
    229342BOOL HMDeviceThreadClass::SetThreadTerminated(HANDLE hThread, PHMHANDLEDATA pHMHandleData)
    230343{
    231     pHMHandleData->dwUserData = THREAD_TERMINATED;
     344    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     345
     346    if(threadobj) {
     347        threadobj->dwState = THREAD_TERMINATED;
     348    }
     349    else DebugInt3();
     350
    232351    return TRUE;
    233352}
     
    241360
    242361#if 0
    243     if(pHMHandleData->dwUserData == THREAD_ALIVE) {
     362    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     363
     364    if(threadobj && threadobj->dwState == THREAD_ALIVE) {
    244365        lpExitCode == STILL_ALIVE;
    245366        return TRUE;
    246367    }
     368    else DebugInt3();
    247369#endif
    248370    return O32_GetExitCodeThread(pHMHandleData->hHMHandle, lpExitCode);
     
    252374BOOL HMDeviceThreadClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
    253375{
     376    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     377
    254378    dprintf(("HMThread::CloseHandle %08x", pHMHandleData->hHMHandle));
     379
     380    if(threadobj) {
     381        pHMHandleData->dwUserData = 0;
     382        free(threadobj);
     383    }
    255384    return O32_CloseHandle(pHMHandleData->hHMHandle);
    256385}
     
    260389                                               DWORD  dwTimeout)
    261390{
     391  OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     392
    262393  dprintf(("HMThread::WaitForSingleObject (%08xh,%08xh)\n",
    263394           pHMHandleData->hHMHandle,
     
    265396 
    266397  //This doesn't work very well in Open32 (object's state never signaled)
    267   if(pHMHandleData->dwUserData == THREAD_TERMINATED) {
     398  if(threadobj && threadobj->dwState == THREAD_TERMINATED) {
    268399        return WAIT_OBJECT_0;
    269400  }
     
    276407                                                 BOOL   fAlertable)
    277408{
    278   if(pHMHandleData->dwUserData == THREAD_TERMINATED) {
     409  OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     410
     411  //This doesn't work very well in Open32 (object's state never signaled)
     412  if(threadobj && threadobj->dwState == THREAD_TERMINATED) {
    279413        return WAIT_OBJECT_0;
    280414  }
  • trunk/src/kernel32/hmthread.h

    r7532 r9748  
    1 /* $Id: hmthread.h,v 1.4 2001-12-03 12:13:09 sandervl Exp $ */
     1/* $Id: hmthread.h,v 1.5 2003-02-04 11:29:01 sandervl Exp $ */
    22
    33/*
     
    4646  virtual BOOL   SetThreadPriority(HANDLE hThread, PHMHANDLEDATA pHMHandleData, int priority);
    4747
     48  virtual BOOL DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData, HANDLE  srcprocess,
     49                               PHMHANDLEDATA pHMSrcHandle,
     50                               HANDLE  destprocess,
     51                               PHANDLE desthandle,
     52                               DWORD   fdwAccess,
     53                               BOOL    fInherit,
     54                               DWORD   fdwOptions,
     55                               DWORD   fdwOdinOptions);
     56
    4857  virtual BOOL   GetThreadContext(HANDLE hThread, PHMHANDLEDATA pHMHandleData, PCONTEXT lpContext);
    4958  virtual BOOL   SetThreadContext(HANDLE hThread, PHMHANDLEDATA pHMHandleData, const CONTEXT *lpContext);
     59
     60  virtual BOOL   GetThreadTimes(HANDLE hThread, PHMHANDLEDATA pHMHandleData,
     61                                LPFILETIME lpCreationTime, LPFILETIME lpExitTime,
     62                                LPFILETIME lpKernelTime, LPFILETIME lpUserTime);
    5063 
    5164  virtual BOOL   TerminateThread(HANDLE hThread, PHMHANDLEDATA pHMHandleData, DWORD exitcode);
  • trunk/src/kernel32/kobjects.cpp

    r7854 r9748  
    1 /* $Id: kobjects.cpp,v 1.15 2002-02-09 17:27:32 sandervl Exp $ */
     1/* $Id: kobjects.cpp,v 1.16 2003-02-04 11:29:01 sandervl Exp $ */
    22
    33/*
     
    747747//******************************************************************************
    748748//******************************************************************************
     749BOOL WIN32API GetThreadTimes(HANDLE     hThread,
     750                             LPFILETIME lpCreationTime,
     751                             LPFILETIME lpExitTime,
     752                             LPFILETIME lpKernelTime,
     753                             LPFILETIME lpUserTime)
     754{
     755  return HMGetThreadTimes(hThread, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime);
     756}
     757//******************************************************************************
     758//******************************************************************************
    749759BOOL WIN32API TerminateThread(HANDLE hThread, DWORD exitcode)
    750760{
  • trunk/src/kernel32/stubs.cpp

    r9653 r9748  
    1 /* $Id: stubs.cpp,v 1.37 2003-01-10 12:57:14 sandervl Exp $
     1/* $Id: stubs.cpp,v 1.38 2003-02-04 11:29:02 sandervl Exp $
    22 *
    33 * Win32 KERNEL32 Subsystem for OS/2
     
    10611061
    10621062
    1063 /*****************************************************************************
    1064  * Name      : BOOL GetThreadTimes
    1065  * Purpose   : The GetThreadTimes function obtains timing information about a specified thread.
    1066  * Parameters: HANDLE     hThread       specifies the thread of interest
    1067  *             LPFILETIME lpCreationTime when the thread was created
    1068  *             LPFILETIME lpExitTime     when the thread exited
    1069  *             LPFILETIME lpKernelTime   time the thread has spent in kernel mode
    1070  *             LPFILETIME lpUserTime     time the thread has spent in user mode
    1071  * Variables :
    1072  * Result    : TRUE / FALSE
    1073  * Remark    :
    1074  * Status    : UNTESTED STUB
    1075  *
    1076  * Author    : Patrick Haller [Mon, 1998/06/15 08:00]
    1077  *****************************************************************************/
    1078 
    1079 BOOL WIN32API GetThreadTimes(HANDLE     hThread,
    1080                                 LPFILETIME lpCreationTime,
    1081                                 LPFILETIME lpExitTime,
    1082                                 LPFILETIME lpKernelTime,
    1083                                 LPFILETIME lpUserTime)
    1084 {
    1085   dprintf(("Kernel32: GetThreadTimes(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n",
    1086            hThread,
    1087            lpCreationTime,
    1088            lpExitTime,
    1089            lpKernelTime,
    1090            lpUserTime));
    1091 
    1092   return (FALSE);
    1093 }
    10941063
    10951064
  • trunk/src/kernel32/thread.cpp

    r9693 r9748  
    1 /* $Id: thread.cpp,v 1.49 2003-01-20 10:46:28 sandervl Exp $ */
     1/* $Id: thread.cpp,v 1.50 2003-02-04 11:29:03 sandervl Exp $ */
    22
    33/*
     
    6565    teb = GetThreadTEB();
    6666    if(teb == 0) {
     67        DebugInt3();
    6768        SetLastError(ERROR_INVALID_HANDLE); //todo
    6869        return 0;
Note: See TracChangeset for help on using the changeset viewer.