Changeset 7474 for trunk/src


Ignore:
Timestamp:
Nov 29, 2001, 12:33:37 AM (24 years ago)
Author:
phaller
Message:

Fixes in HandleManager and Device Handlers

Location:
trunk/src/kernel32
Files:
10 edited

Legend:

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

    r7472 r7474  
    1 /* $Id: HandleManager.cpp,v 1.78 2001-11-28 15:45:45 sandervl Exp $ */
     1/* $Id: HandleManager.cpp,v 1.79 2001-11-28 23:33:34 phaller Exp $ */
    22
    33/*
     
    432432
    433433    HMGlobals.fIsInitialized = TRUE;                             /* OK, done */
    434 
     434   
     435#if 1
     436    //This is a very bad idea. \\\\.\\NTICE -> NTICE, if the file exits, then
     437    //it will open the file instead of the device driver
     438    /* add standard symbolic links first, so local symbolic links in the
     439     * device handlers get precedence over the default here.
     440     *
     441     * Device handlers are supposed to place the appropriate
     442     * symbolic links such as "\\.\\COM1", "COM1"
     443     *
     444     * - "\\.\f:\temp\readme.txt" is a valid file
     445     * - "com1" is a valid device in case serial port 1 exists,
     446     *   otherwise it'd be a valid file.
     447     * - "\\.\filename" is the only misleading case (to be verified)
     448     *
     449     * Note:
     450     * the Open32 "device" definately MUST be the last device to be
     451     * asked to accept the specified name.
     452     */
     453    {
     454      // strings are placed in read-only segment
     455      PSZ pszDrive  = strdup("\\\\.\\x:");
     456      PSZ pszDrive2 = strdup("\\\\.\\x:");
     457      for (char ch = 'A'; ch <= 'Z'; ch++)
     458      {
     459        pszDrive[4] = ch;
     460        pszDrive2[4] = ch;
     461        HandleNamesAddSymbolicLink(pszDrive, pszDrive+4);
     462        HandleNamesAddSymbolicLink(pszDrive2, pszDrive2+4);
     463      }
     464      free(pszDrive);
     465      free(pszDrive2);
     466      HandleNamesAddSymbolicLink("\\\\?\\UNC\\", "\\\\");
     467    }
     468#endif
     469   
    435470    /* copy standard handles from OS/2's Open32 Subsystem */
    436471    HMGlobals.pHMStandard   = new HMDeviceStandardClass("\\\\STANDARD_HANDLE\\");
     
    453488    HMGlobals.pHMMailslot   = new HMMailslotClass("\\MAILSLOT\\");
    454489    HMGlobals.pHMParPort    = new HMDeviceParPortClass("\\\\LPT\\");
    455    
    456 #if 0
    457     //This is a very bad idea. \\\\.\\NTICE -> NTICE, if the file exits, then
    458     //it will open the file instead of the device driver
    459     /* add standard symbolic links */
    460     HandleNamesAddSymbolicLink("\\\\.\\", "");
    461 #endif
    462490  }
    463491  return (NO_ERROR);
     
    10701098  {
    10711099    TabWin32Handles[iIndexNew].hmHandleData.hHMHandle = INVALID_HANDLE_VALUE;
    1072     SetLastError(rc);          /* Hehe, OS/2 and NT are pretty compatible :) */
     1100   
     1101   
     1102    // Note:
     1103    // device handlers have to return an Win32-style error code
     1104    // from CreateFile() !
     1105    SetLastError(rc);
    10731106    return (INVALID_HANDLE_VALUE);                           /* signal error */
    10741107  }
  • trunk/src/kernel32/handlenames.cpp

    r7465 r7474  
    170170    if (fCaseInsensitive)
    171171    {
    172       if (strnicmp(pHandleName->pszSymbolicLink, pszSymbolicLink, iLen) == 0)
    173         return pHandleName;
     172      // Note: pszSymbolicLink must either terminate at [iLen] or
     173      // have a delimiter.
     174      if ( (pszSymbolicLink[iLen] == '\\') ||
     175           (pszSymbolicLink[iLen] == 0) )
     176        if (strnicmp(pHandleName->pszSymbolicLink, pszSymbolicLink, iLen) == 0)
     177          return pHandleName;
    174178    }
    175179    else
    176180    {
    177       if (strncmp(pHandleName->pszSymbolicLink, pszSymbolicLink, iLen) == 0)
    178         return pHandleName;
     181      if ( (pszSymbolicLink[iLen] == '\\') ||
     182           (pszSymbolicLink[iLen] == 0) )
     183        if (strncmp(pHandleName->pszSymbolicLink, pszSymbolicLink, iLen) == 0)
     184          return pHandleName;
    179185    }
    180186   
  • trunk/src/kernel32/hmcomm.cpp

    r7471 r7474  
    1 /* $Id: hmcomm.cpp,v 1.17 2001-11-28 15:35:15 sandervl Exp $ */
     1/* $Id: hmcomm.cpp,v 1.18 2001-11-28 23:33:35 phaller Exp $ */
    22
    33/*
     
    1919#include <string.h>
    2020#include <handlemanager.h>
     21#include "handlenames.h"
    2122#include <heapstring.h>
    2223#include "hmdevice.h"
     
    9192  if(pData!= NULL)
    9293    HMDeviceRegisterEx("COM1", this, pData);
     94 
     95  // add symbolic links to the "real name" of the device
     96  {
     97    // @@@PH what's the long device name: SerialPortx ?
     98    // HandleNamesAddSymbolicLink("\\Device\\ParallelPort3", "COM3");
     99   
     100    PSZ pszCOM = strdup("\\\\.\\COMx");
     101    for (char ch = '1'; ch <= '9'; ch++)
     102    {
     103      pszCOM[7] = ch;
     104      HandleNamesAddSymbolicLink(pszCOM, pszCOM+4);
     105    }
     106    free(pszCOM);
     107  }
    93108}
    94109
     
    109124{
    110125    dprintf2(("HMDeviceCommClass::FindDevice %s %s", lpClassDevName, lpDeviceName));
    111 
    112     if(namelength > 5) {
    113         if(namelength != 9 || lstrncmpA(lpDeviceName, "\\\\.\\", 4) != 0) {
    114             return FALSE;  //can't be com name
    115         }
    116         lpDeviceName += 4; //skip prefix
    117     }
    118 
     126 
    119127    //first 3 letters 'COM'?
    120128    if(lstrncmpiA(lpDeviceName, lpClassDevName, 3) != 0) {
     
    207215    {
    208216      delete pHMHandleData->lpHandlerData;
    209       return rc;
     217      return error2WinError(rc);
    210218    }
    211219    rc = SetBaud(pHMHandleData,9600);
  • trunk/src/kernel32/hmdevio.cpp

    r7458 r7474  
    1 /* $Id: hmdevio.cpp,v 1.17 2001-11-26 17:16:24 sandervl Exp $ */
     1/* $Id: hmdevio.cpp,v 1.18 2001-11-28 23:33:35 phaller Exp $ */
    22
    33/*
     
    3030#include "map.h"
    3131#include "exceptutil.h"
     32#include "oslibdos.h"
    3233
    3334#define DBG_LOCALLOG    DBG_hmdevio
     
    111112                {
    112113                    HINSTANCE hDrvDll = LoadLibraryA(szDllName);
    113                     if(hDrvDll) {
     114                    if(hDrvDll)
     115                    {
    114116                        sprintf(szDrvName, "\\\\.\\%s", szKeyName);
    115117                        driver = new HMCustomDriver(hDrvDll, szDrvName);
     
    117119                        rc = HMDeviceRegister(szDrvName, driver);
    118120                        if (rc != NO_ERROR)                                  /* check for errors */
    119                               dprintf(("KERNEL32:RegisterDevices: registering %s failed with %u.\n", szDrvName, rc));
     121                          dprintf(("KERNEL32:RegisterDevices: registering %s failed with %u.\n", szDrvName, rc));
     122                     
     123                        // @@@PH
     124                        // there should be an symbolic link:
     125                        // "\\.\drvname$" -> "drvname$"
    120126                    }
    121127                }
     
    217223        if(rc) {
    218224                dprintf(("DosSetRelMaxFH returned %d", rc));
    219                 return rc;
     225                return error2WinError(rc);
    220226        }
    221227        dprintf(("DosOpen failed -> increased nr open files to %d", CurMaxFH));
     
    225231  dprintf(("DosOpen %s returned %d\n", szOS2Name, rc));
    226232
    227   if(rc == NO_ERROR) {
    228         pHMHandleData->hHMHandle = hfFileHandle;
    229         return (NO_ERROR);
    230   }
    231   else  return(rc);
     233  if(rc == NO_ERROR)
     234  {
     235    pHMHandleData->hHMHandle = hfFileHandle;
     236    return (NO_ERROR);
     237  }
     238  else 
     239    return(error2WinError(rc));
    232240}
    233241//******************************************************************************
  • trunk/src/kernel32/hmdisk.cpp

    r7457 r7474  
    1 /* $Id: hmdisk.cpp,v 1.29 2001-11-26 14:54:01 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.30 2001-11-28 23:33:36 phaller Exp $ */
    22
    33/*
     
    6767BOOL HMDeviceDiskClass::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength)
    6868{
     69  // @@@PH
     70  // this is broken:
     71  // "\\.\C:" and "C:" is a LOGICAL drive
     72  // \\.\PHYSICALDRIVEx is a PHYSICAL drive!
     73 
    6974    //\\.\x:                -> length 6
    7075    //\\.\PHYSICALDRIVEn    -> length 18
     
    109114        return ERROR_INVALID_PARAMETER;
    110115    }
    111     if(strncmp(lpFileName,       // "support" for local unc names
    112              "\\\\.\\",
    113              4) == 0)
    114     {
    115         lpFileName+=4;
    116     }
    117116
    118117    //Disable error popus. NT allows an app to open a cdrom/dvd drive without a disk inside
     
    206205    filename[2] = 0;
    207206
    208     //Disable error popus. NT allows an app to open a cdrom/dvd drive without a disk inside
     207    //Disable error popups. NT allows an app to open a cdrom/dvd drive without a disk inside
    209208    //OS/2 fails in that case with error ERROR_NOT_READY
    210209    ULONG oldmode = SetErrorMode(SEM_FAILCRITICALERRORS);
  • trunk/src/kernel32/hmfile.cpp

    r7457 r7474  
    1 /* $Id: hmfile.cpp,v 1.30 2001-11-26 14:54:01 sandervl Exp $ */
     1/* $Id: hmfile.cpp,v 1.31 2001-11-28 23:33:36 phaller Exp $ */
    22
    33/*
     
    4949 * Variables :
    5050 * Result    :
    51  * Remark    : TODO: \\.\PHYSICALDRIVEx opens physical drive x
     51 * Remark    :
    5252 * Status    : NO_ERROR - API succeeded
    5353 *             other    - what is to be set in SetLastError
     
    7272           lpSecurityAttributes,
    7373           pHMHandleDataTemplate));
    74 
    75   if(strncmp(lpFileName,       // "support" for local unc names
    76              "\\\\.\\",
    77              4) == 0)
    78   {
    79         lpFileName+=4;
    80   }
    81   else {
    82         ParsePath(lpFileName, filepath, sizeof(filepath));
    83         lpFileName = filepath;
    84   }
    85 
     74 
     75  ParsePath(lpFileName, filepath, sizeof(filepath));
     76  lpFileName = filepath;
    8677
    8778  // create from template
     
    180171    }
    181172
    182     if(strcmp(lpFileName,       // "support" for local unc names
    183              "\\\\.\\") == 0)
    184     {
    185         lpFileName+=4;
    186     }
    187     else
    188173    if(!strchr(lpFileName, ':') && !strchr(lpFileName, '\\'))
    189174    {
  • trunk/src/kernel32/hmmailslot.cpp

    r7457 r7474  
    1 /* $Id: hmmailslot.cpp,v 1.3 2001-11-26 14:54:02 sandervl Exp $
     1/* $Id: hmmailslot.cpp,v 1.4 2001-11-28 23:33:36 phaller Exp $
    22 *
    33 * Win32 mailslot APIs
     
    190190
    191191  char *pipename = (char *)alloca(strlen(lpFileName)+16);
    192   if(pipename == NULL) {
    193       DebugInt3();
    194       SetLastError(ERROR_NOT_ENOUGH_MEMORY);
    195       return FALSE;
     192  if(pipename == NULL)
     193  {
     194    DebugInt3();
     195    return ERROR_NOT_ENOUGH_MEMORY;
    196196  }
    197197  strcpy(pipename, "\\\\.\\pipe\\");
     
    215215  //todo: lookup name and fail if exists
    216216  mailslot = new HMMailSlotInfo(lpFileName, hPipe, -1, 0, FALSE, (LPSECURITY_ATTRIBUTES)lpSecurityAttributes);
    217   if(mailslot == NULL) {
    218       DebugInt3();
    219       return ERROR_NOT_ENOUGH_MEMORY;
     217  if(mailslot == NULL)
     218  {
     219    DebugInt3();
     220    return ERROR_NOT_ENOUGH_MEMORY;
    220221  }
    221222  pHMHandleData->dwUserData = (DWORD)mailslot;
  • trunk/src/kernel32/hmnpipe.cpp

    r7457 r7474  
    1 /* $Id: hmnpipe.cpp,v 1.4 2001-11-26 14:54:02 sandervl Exp $ */
     1/* $Id: hmnpipe.cpp,v 1.5 2001-11-28 23:33:37 phaller Exp $ */
    22/*
    33 * Project Odin Software License can be found in LICENSE.TXT
     
    140140                                               pHMHandleData->dwCreation,
    141141                                               pHMHandleData->dwFlags);
    142    if(pHMHandleData->hHMHandle == -1) {
    143       return GetLastError();
    144    }
    145    return ERROR_SUCCESS;
     142  if(pHMHandleData->hHMHandle == -1)
     143  {
     144    return GetLastError();
     145  }
     146  return ERROR_SUCCESS;
    146147}
    147148
  • trunk/src/kernel32/hmparport.cpp

    r7457 r7474  
    1 /* $Id: hmparport.cpp,v 1.8 2001-11-26 14:54:03 sandervl Exp $ */
     1/* $Id: hmparport.cpp,v 1.9 2001-11-28 23:33:37 phaller Exp $ */
    22
    33/*
     
    152152 
    153153  // add symbolic links to the "real name" of the device
    154   HandleNamesAddSymbolicLink("\\Device\\ParallelPort1", "LPT1");
    155   HandleNamesAddSymbolicLink("\\Device\\ParallelPort2", "LPT2");
    156   HandleNamesAddSymbolicLink("\\Device\\ParallelPort3", "LPT3");
     154  {
     155    PSZ pszLPT = strdup("\\\\.\\LPTx");
     156    PSZ pszLPT2 = strdup("\\Device\\ParallelPort1");
     157    for (char ch = '1'; ch <= '3'; ch++)
     158    {
     159      pszLPT[7] = ch;
     160      pszLPT2[20] = ch;
     161      HandleNamesAddSymbolicLink(pszLPT, pszLPT+4);
     162      HandleNamesAddSymbolicLink(pszLPT2, pszLPT+4);
     163    }
     164    free(pszLPT);
     165    free(pszLPT2);
     166  }
    157167}
    158168
     
    172182BOOL HMDeviceParPortClass::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength)
    173183{
    174   dprintf(("HMDeviceParPortClass::FindDevice(%s,%s)\n",
    175            lpClassDevName,
    176            lpDeviceName));
    177  
     184  // can be both, "LPT1" and "LPT1:"
    178185    if(namelength > 5)
    179186        return FALSE;  //can't be lpt name
     
    208215           pHMHandleDataTemplate));
    209216 
    210  char comname[6];
     217 char lptname[6];
    211218
    212219  dprintf(("HMDeviceParPortClass: Parallel port %s open request\n", lpFileName));
    213220
    214   if(strlen(lpFileName) > 5) {
    215     return -1;  //safety check (unnecessary..)
    216   }
    217   pHMHandleData->hHMHandle = 0;
    218 
    219   strcpy(comname, lpFileName);
    220   comname[4] = 0;   //get rid of : (if present) (eg LPT1:)
     221  strcpy(lptname, lpFileName);
     222  lptname[4] = 0;   //get rid of : (if present) (eg LPT1:)
    221223
    222224  //AH: TODO parse Win32 security handles
    223225  ULONG oldmode = SetErrorMode(SEM_FAILCRITICALERRORS);
    224   pHMHandleData->hHMHandle = OSLibDosOpen(comname,
     226  pHMHandleData->hHMHandle = OSLibDosOpen(lptname,
    225227                                          OSLIB_ACCESS_READWRITE |
    226228                                          OSLIB_ACCESS_SHAREDENYREAD |
    227229                                          OSLIB_ACCESS_SHAREDENYWRITE);
    228230  SetErrorMode(oldmode);
    229 
     231 
     232  // check if handle could be opened properly
     233  if (0 == pHMHandleData->hHMHandle)
     234  {
     235    // @@@PH we need to get an OS/2 return code from OSLibDosOpen!
     236    // and translate it via error2WinError
     237    return ERROR_ACCESS_DENIED; // signal failure
     238  }
     239 
    230240#if 0
    231241  if (pHMHandleData->hHMHandle != 0)
     
    256266             " XON Char               : 0x%x\n"
    257267             " XOFF Char              : 0x%x\n",
    258              comname,
     268             lptname,
    259269             ((PHMDEVCOMDATA)pHMHandleData->lpHandlerData)->dcbOS2.usWriteTimeout,
    260270             ((PHMDEVCOMDATA)pHMHandleData->lpHandlerData)->dcbOS2.usReadTimeout,
     
    610620#endif
    611621 
    612   return(rc==0);
     622  return(rc==NO_ERROR);
    613623}
    614624
  • trunk/src/kernel32/oslibdos.cpp

    r7398 r7474  
    1 /* $Id: oslibdos.cpp,v 1.85 2001-11-19 13:02:58 phaller Exp $ */
     1/* $Id: oslibdos.cpp,v 1.86 2001-11-28 23:33:37 phaller Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    178178    case ERROR_WRITE_PROTECT: //19
    179179        return ERROR_WRITE_PROTECT_W;
     180 
     181    case ERROR_BAD_UNIT: //20
     182        return ERROR_BAD_UNIT_W;
    180183
    181184    case ERROR_NOT_READY: //21
     
    604607               os2flags,
    605608               0L);                            /* No extended attribute */
    606 
    607   if(rc) {
    608         if(rc == ERROR_TOO_MANY_OPEN_FILES) {
    609          ULONG CurMaxFH;
    610          LONG  ReqCount = 32;
    611 
    612                 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
    613                 if(rc) {
    614                         dprintf(("DosSetRelMaxFH returned %d", rc));
    615                         return 0;
    616                 }
    617                 dprintf(("DosOpen failed -> increased nr open files to %d", CurMaxFH));
    618                 goto tryopen;
    619         }
     609  if(rc)
     610  {
     611    if(rc == ERROR_TOO_MANY_OPEN_FILES)
     612    {
     613      ULONG CurMaxFH;
     614      LONG  ReqCount = 32;
     615
     616      rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH);
     617      if(rc)
     618      {
     619        dprintf(("DosSetRelMaxFH returned %d", rc));
    620620        return 0;
    621   }
    622   else  return hFile;
     621      }
     622      dprintf(("DosOpen failed -> increased nr open files to %d", CurMaxFH));
     623      goto tryopen;
     624    }
     625   
     626    SetLastError(error2WinError(rc));
     627    return 0;
     628  }
     629 
     630  // OK, file was opened
     631  SetLastError(ERROR_SUCCESS_W);
     632  return hFile;
    623633}
    624634//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.