Changeset 22051


Ignore:
Timestamp:
Dec 29, 2012, 12:31:02 AM (8 years ago)
Author:
dmik
Message:

kernel32: Use file/pipe device classes when standard handles are redirected/piped.

This fixes working with standard handles (stdin/stdout/stderr) broken after r22024.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/HandleManager.h

    r21916 r22051  
    8787                               HANDLE hHandle);
    8888
    89 BOOL    HMUpdtStdHandle(DWORD  nStdHandle,
    90                                 HANDLE hHandle);
     89BOOL    HMSetupStdHandle(DWORD  nStdHandle);
    9190
    9291
  • trunk/src/kernel32/HandleManager.cpp

    r22024 r22051  
    6868
    6969#include "hmhandle.h"
     70#include "oslibdos.h"
    7071
    7172#include <vmutex.h>
     
    657658#endif
    658659
    659     /* copy standard handles from OS/2's Open32 Subsystem */
     660    /* create handle manager instance for Open32 handles */
    660661    HMGlobals.pHMStandard   = new HMDeviceStandardClass("\\\\STANDARD_HANDLE\\");
    661     HMSetStdHandle(STD_INPUT_HANDLE,  O32_GetStdHandle(STD_INPUT_HANDLE));
    662     HMSetStdHandle(STD_OUTPUT_HANDLE, O32_GetStdHandle(STD_OUTPUT_HANDLE));
    663     HMSetStdHandle(STD_ERROR_HANDLE,  O32_GetStdHandle(STD_ERROR_HANDLE));
    664 
    665     /* create handle manager instance for Open32 handles */
    666662    HMGlobals.pHMOpen32     = new HMDeviceOpen32Class("\\\\.\\");
    667663    HMGlobals.pHMEvent      = new HMDeviceEventClass("\\\\EVENT\\");
     
    679675    HMGlobals.pHMParPort    = new HMDeviceParPortClass("\\\\LPT\\");
    680676    HMGlobals.pHMNul        = new HMDeviceNulClass("\\\\NUL\\");
     677
     678    HMSetupStdHandle(STD_INPUT_HANDLE);
     679    HMSetupStdHandle(STD_OUTPUT_HANDLE);
     680    HMSetupStdHandle(STD_ERROR_HANDLE);
    681681  }
    682682  return (NO_ERROR);
     
    10521052
    10531053/*****************************************************************************
    1054  * Name      : HANDLE  _HMSetStdHandle
    1055  * Purpose   : replacement for Open32's SetStdHandle function
     1054 * Name      : HANDLE  _HMSetupStdHandle
     1055 * Purpose   : initialization of standard handles
    10561056 * Parameters: DWORD  nStdHandle
    10571057 *             HANDLE hHandle
     
    10641064 *****************************************************************************/
    10651065
    1066 BOOL HMSetStdHandle(DWORD  nStdHandle, HANDLE hHandleOpen32)
     1066BOOL HMSetupStdHandle(DWORD  nStdHandle)
    10671067{
    10681068 PHMHANDLEDATA pHMHandleData;
     
    10741074    SetLastError(ERROR_NOT_ENOUGH_MEMORY);      /* use this as error message */
    10751075    return 0;
     1076  }
     1077
     1078  ULONG handle;
     1079
     1080  switch (nStdHandle)
     1081  {
     1082    case STD_INPUT_HANDLE:
     1083    {
     1084      handle = 0;
     1085      HMGlobals.hStandardIn = hHandle;
     1086      break;
     1087    }
     1088    case STD_OUTPUT_HANDLE:
     1089    {
     1090      handle = 1;
     1091      HMGlobals.hStandardOut = hHandle;
     1092      break;
     1093    }
     1094    case STD_ERROR_HANDLE:
     1095    {
     1096      handle = 2;
     1097      HMGlobals.hStandardError = hHandle;
     1098      break;
     1099    }
     1100    default:
     1101    {
     1102      SetLastError(ERROR_INVALID_PARAMETER);        /* set error information */
     1103      return (FALSE);                               /* raise error condition */
     1104    }
    10761105  }
    10771106
     
    10821111  pHMHandleData->dwCreation = 0;
    10831112  pHMHandleData->dwFlags    = 0;
    1084   pHMHandleData->dwUserData = nStdHandle;
    1085   pHMHandleData->hHMHandle  = hHandleOpen32;
     1113  pHMHandleData->dwUserData = 0;
    10861114  pHMHandleData->lpHandlerData = NULL;
    10871115
    1088   TabWin32Handles[hHandle].pDeviceHandler = HMGlobals.pHMStandard;
    1089 
    1090   switch (nStdHandle)
    1091   {
    1092     case STD_INPUT_HANDLE:  HMGlobals.hStandardIn    = hHandle; return TRUE;
    1093     case STD_OUTPUT_HANDLE: HMGlobals.hStandardOut   = hHandle; return TRUE;
    1094     case STD_ERROR_HANDLE:  HMGlobals.hStandardError = hHandle; return TRUE;
    1095 
     1116
     1117  DWORD type = OSLibDosQueryHType(handle);
     1118  switch (type & 0x7)
     1119  {
     1120    case 0: /* disk file */
     1121    {
     1122      pHMHandleData->hHMHandle = handle;
     1123      TabWin32Handles[hHandle].pDeviceHandler = HMGlobals.pHMFile;
     1124      break;
     1125    }
     1126    case 1: /* character device */
     1127    {
     1128      // Note: we use a simple read/write device by default;
     1129      // if this is a console application, iConsoleInit() will set up
     1130      // proper devices with extended functionality
     1131      pHMHandleData->hHMHandle = O32_GetStdHandle(nStdHandle);
     1132      TabWin32Handles[hHandle].pDeviceHandler = HMGlobals.pHMStandard;
     1133      break;
     1134    }
     1135    case 2: /* pipe */
     1136    {
     1137      pHMHandleData->hHMHandle = handle;
     1138      TabWin32Handles[hHandle].pDeviceHandler = HMGlobals.pHMNamedPipe;
     1139      break;
     1140    }
    10961141    default:
    10971142    {
    1098       SetLastError(ERROR_INVALID_PARAMETER);        /* set error information */
     1143      SetLastError(ERROR_SYS_INTERNAL);             /* set error information */
    10991144      return (FALSE);                               /* raise error condition */
    11001145    }
    11011146  }
    1102 }
    1103 
    1104 /*****************************************************************************
    1105  * Name      : HANDLE  _HMUdptStdHandle
    1106  * Purpose   :
     1147
     1148  return TRUE;
     1149}
     1150
     1151/*****************************************************************************
     1152 * Name      : HANDLE  _HMSetStdHandle
     1153 * Purpose   : replacement for Open32's SetStdHandle function
    11071154 * Parameters: DWORD  nStdHandle
    11081155 *             HANDLE hHandle
     
    11151162 *****************************************************************************/
    11161163
    1117 BOOL HMUpdtStdHandle(DWORD  nStdHandle, HANDLE hHandle)
     1164BOOL HMSetStdHandle(DWORD  nStdHandle, HANDLE hHandle)
    11181165{
    11191166  switch (nStdHandle)
     
    17841831
    17851832  if (!pHMHandle || !pHMHandle->pDeviceHandler)
    1786       return ERROR_SYS_INTERNAL;
     1833  {
     1834    SetLastError(ERROR_SYS_INTERNAL);
     1835    return (FALSE);
     1836  }
    17871837
    17881838  fResult = pHMHandle->pDeviceHandler->ReadFile(&pHMHandle->hmHandleData,
  • trunk/src/kernel32/console.cpp

    r22050 r22051  
    468468                               CONSOLE_TEXTMODE_BUFFER,
    469469                               0);
    470     HMUpdtStdHandle(STD_INPUT_HANDLE,
    471                     hStandardIn);
     470    HMSetStdHandle(STD_INPUT_HANDLE,
     471                   hStandardIn);
    472472  }
    473473
     
    485485                                CONSOLE_TEXTMODE_BUFFER,
    486486                                0);
    487     HMUpdtStdHandle(STD_OUTPUT_HANDLE,
    488                     hStandardOut);
     487    HMSetStdHandle(STD_OUTPUT_HANDLE,
     488                   hStandardOut);
    489489  }
    490490
     
    502502                                  CONSOLE_TEXTMODE_BUFFER,
    503503                                  0);
    504     HMUpdtStdHandle(STD_ERROR_HANDLE,
    505                     hStandardError);
     504    HMSetStdHandle(STD_ERROR_HANDLE,
     505                   hStandardError);
    506506  }
    507507
  • trunk/src/kernel32/oslibdos.cpp

    r22038 r22051  
    34853485//******************************************************************************
    34863486//******************************************************************************
     3487DWORD OSLibDosQueryHType(ULONG handle)
     3488{
     3489    ULONG type, attr;
     3490    APIRET rc = DosQueryHType(handle, &type, &attr);
     3491    if (rc != NO_ERROR) {
     3492        dprintf(("DosQueryHType error: return code = %u\n", rc));
     3493        return -1;
     3494    }
     3495    return type;
     3496}
     3497//******************************************************************************
     3498//******************************************************************************
    34873499
    34883500/* sdbm:
  • trunk/src/kernel32/oslibdos.h

    r21916 r22051  
    363363DWORD OSLibDosGetNumPhysDrives();
    364364
     365DWORD OSLibDosQueryHType(ULONG handle);
     366
    365367#ifdef __cplusplus
    366368}
Note: See TracChangeset for help on using the changeset viewer.