Ignore:
Timestamp:
Feb 4, 2011, 11:59:05 PM (15 years ago)
Author:
dmik
Message:

kernel32: Fixed a bunch of OSLibDos* functions dealing with file names that passed ANSI strings to the OS/2 APIs w/o first converting it to the OEM codepage which caused "file not found" errors in various Win32 APIs like GetFileAttributesEx() on file names with national characters (Cyrillic, umlauts, etc).

File:
1 edited

Legend:

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

    r21564 r21569  
    802802  FILESTATUS3 fs3;                             /* file information structure */
    803803  LPWIN32_FILE_ATTRIBUTE_DATA lpFad = (LPWIN32_FILE_ATTRIBUTE_DATA) pBuffer;
     804  char        pszOemName[CCHMAXPATH];
     805
     806  //Convert file name from Windows to OS/2 codepage
     807  CharToOemA(ODINHelperStripUNC(pszName), pszOemName);
    804808
    805809  // Note: we only handle standard "GetFileExInfoStandard" requests
    806   rc = DosQueryPathInfo(ODINHelperStripUNC(pszName),               /* query the file information */
     810  rc = DosQueryPathInfo(pszOemName,            /* query the file information */
    807811                        FIL_STANDARD,
    808812                        &fs3,
     
    887891                            ULONG cbInfoBuf)
    888892{
    889    APIRET rc = DosQueryPathInfo( ODINHelperStripUNC(pszPathName), ulInfoLevel,
    890                                  pInfoBuf, cbInfoBuf );
    891 
    892    if(rc == ERROR_TOO_MANY_OPEN_FILES)
    893    {
     893    APIRET      rc;
     894    char        pszOemPathName[CCHMAXPATH];
     895
     896    //Convert file name from Windows to OS/2 codepage
     897    CharToOemA(ODINHelperStripUNC(pszPathName), pszOemPathName);
     898
     899    rc = DosQueryPathInfo(pszOemPathName, ulInfoLevel,
     900                          pInfoBuf, cbInfoBuf);
     901
     902    if(rc == ERROR_TOO_MANY_OPEN_FILES)
     903    {
    894904        LONG  reqCount = 2;
    895905        ULONG maxFiles;
    896906
    897907        if(DosSetRelMaxFH(&reqCount, &maxFiles) == NO_ERROR)
    898           rc = DosQueryPathInfo(pszPathName, ulInfoLevel,
    899                                       pInfoBuf, cbInfoBuf );
    900    }
    901    return rc;
     908          rc = DosQueryPathInfo(pszOemPathName, ulInfoLevel,
     909                                pInfoBuf, cbInfoBuf);
     910    }
     911    return rc;
    902912}
    903913//******************************************************************************
     
    13971407BOOL OSLibDosGetFileInformationByHandle(LPCSTR lpFileName, DWORD hFile, BY_HANDLE_FILE_INFORMATION* pInfo)
    13981408{
    1399  APIRET       rc;
     1409   APIRET      rc;
    14001410
    14011411   // NOTE: On HPFS386, doing FIL_QUERYEASIZE on a write-only file will
     
    16581668   DWORD hPipe;
    16591669   DWORD rc, ulAction;
     1670   char  lpOemName[CCHMAXPATH];
     1671
     1672  //Convert file name from Windows to OS/2 codepage
     1673  CharToOemA(lpName, lpOemName);
    16601674
    16611675  if ((dwOpenMode & PIPE_ACCESS_DUPLEX_W) == PIPE_ACCESS_DUPLEX_W)
     
    16951709  dwOS2PipeMode |= nMaxInstances;
    16961710
    1697   if (strstr(lpName,"\\\\."))
     1711  if (strstr(lpOemName,"\\\\."))
    16981712  {
    16991713    // If pipe is created on the local machine
     
    17011715    // in Windows named pipes scheme is a \\.\PIPE\pipename
    17021716    // but in OS/2 only \PIPE\pipename
    1703     lpOS2Name = (LPSTR)lpName + 3;
    1704   }
    1705   else lpOS2Name = (LPSTR)lpName;
     1717    lpOS2Name = (LPSTR)lpOemName + 3;
     1718  }
     1719  else lpOS2Name = (LPSTR)lpOemName;
    17061720
    17071721  dprintf(("DosCreateNPipe(%s,%x,%x,%x,%x,%x)",lpOS2Name,dwOS2Mode,dwOS2PipeMode,nInBufferSize,nOutBufferSize,nDefaultTimeOut));
     
    17851799  ULONG openFlag = 0;
    17861800  ULONG openMode = OPEN_FLAGS_NOINHERIT; //default is not inherited by child processes
    1787 
     1801  char  lpOemName[CCHMAXPATH];
     1802
     1803   //Convert file name from Windows to OS/2 codepage
     1804   CharToOemA(lpName, lpOemName);
    17881805
    17891806   switch(fuCreate)
     
    18441861        openMode |= OPEN_ACCESS_WRITEONLY;
    18451862
    1846   if (strstr(lpName,"\\\\."))
     1863  if (strstr(lpOemName,"\\\\."))
    18471864  {
    18481865       // If pipe is created on the local machine
     
    18501867       // in Windows named pipes scheme is a \\.\PIPE\pipename
    18511868       // but in OS/2 only \PIPE\pipename
    1852        lpOS2Name = (LPSTR)lpName + 3;
    1853   }
    1854   else lpOS2Name = (LPSTR)lpName;
     1869       lpOS2Name = (LPSTR)lpOemName + 3;
     1870  }
     1871  else lpOS2Name = (LPSTR)lpOemName;
    18551872
    18561873  rc = DosOpen(lpOS2Name, &hPipe, &ulAction, 0, 0,
     
    18971914  LPSTR lpOS2Name;
    18981915  DWORD rc;
    1899 
    1900   if (strstr(lpNamedPipeName,"\\\\."))
     1916  char  lpOemNamedPipeName[CCHMAXPATH];
     1917
     1918  //Convert file name from Windows to OS/2 codepage
     1919  CharToOemA(lpNamedPipeName, lpOemNamedPipeName);
     1920
     1921  if (strstr(lpOemNamedPipeName,"\\\\."))
    19011922  {
    19021923    // If pipe is created on the local machine
     
    19041925    // in Windows named pipes scheme is a \\.\PIPE\pipename
    19051926    // but in OS/2 only \PIPE\pipename
    1906     lpOS2Name = (LPSTR)lpNamedPipeName + 3;
    1907   }
    1908   else lpOS2Name = (LPSTR)lpNamedPipeName;
     1927    lpOS2Name = (LPSTR)lpOemNamedPipeName + 3;
     1928  }
     1929  else lpOS2Name = (LPSTR)lpOemNamedPipeName;
    19091930
    19101931  rc=DosCallNPipe(lpOS2Name,
     
    20262047  LPSTR lpOS2Name;
    20272048  DWORD rc;
    2028 
    2029   if (strstr(lpszNamedPipeName,"\\\\."))
     2049  char  lpszOemNamedPipeName[CCHMAXPATH];
     2050
     2051  //Convert file name from Windows to OS/2 codepage
     2052  CharToOemA(lpszNamedPipeName, lpszOemNamedPipeName);
     2053
     2054  if (strstr(lpszOemNamedPipeName,"\\\\."))
    20302055  {
    20312056    // If pipe is created on the local machine
     
    20332058    // in Windows named pipes scheme is a \\.\PIPE\pipename
    20342059    // but in OS/2 only \PIPE\pipename
    2035     lpOS2Name = (LPSTR)lpszNamedPipeName + 3;
    2036   }
    2037   else lpOS2Name = (LPSTR)lpszNamedPipeName;
     2060    lpOS2Name = (LPSTR)lpszOemNamedPipeName + 3;
     2061  }
     2062  else lpOS2Name = (LPSTR)lpszOemNamedPipeName;
    20382063
    20392064  rc=DosWaitNPipe(lpOS2Name,dwTimeout);
     
    31233148}
    31243149
    3125 /**
    3126  * Pure wrapper for DosQueryModulName which returns the OS/2 returncode.
    3127  * @returns     Returncode from DosQueryModuleName.
    3128  * @param       hModule     Handle of the module which name we query.
    3129  * @param       cchName     Length of the output name buffer.
    3130  * @param       pszname     Pointer to the output name buffer.
    3131  * @status      Completely implemented.
    3132  * @author      knut st. osmundsen (knut.stange.osmundsen@mynd.no)
    3133  */
    31343150ULONG OSLibDosQueryModuleName(ULONG hModule, int cchName, char *pszName)
    31353151{
    3136     return DosQueryModuleName(hModule, cchName, pszName);
    3137 }
    3138 
     3152    char pszOemName[CCHMAXPATH];
     3153    APIRET rc;
     3154
     3155    rc = DosQueryModuleName(hModule, sizeof(pszOemName), pszOemName);
     3156    if(rc == NO_ERROR)
     3157    {
     3158       //Convert file name from OS/2 to Windows
     3159       if (!OemToCharBuffA(pszOemName, pszName, cchName))
     3160           return GetLastError();
     3161    }
     3162
     3163    rc = error2WinError(rc,ERROR_INVALID_HANDLE);
     3164    SetLastError(rc);
     3165    return rc;
     3166}
    31393167
    31403168HINSTANCE OSLibDosLoadModule(LPSTR szModName)
     
    31433171 HMODULE hModule = NULLHANDLE;
    31443172 char    name[ CCHMAXPATH ];
    3145 
    3146   rc = DosLoadModule(name, CCHMAXPATH, szModName, &hModule);
     3173 char    szOemModName[CCHMAXPATH];
     3174
     3175  //Convert file name from Windows to OS/2 codepage
     3176  CharToOemA(ODINHelperStripUNC(szModName), szOemModName);
     3177
     3178  rc = DosLoadModule(name, CCHMAXPATH, szOemModName, &hModule);
    31473179  if(rc) {
    31483180      SetLastError(error2WinError(rc,ERROR_FILE_NOT_FOUND));
     
    32293261   PPIB pPIB;
    32303262   APIRET rc;
     3263   char lpszOemPath[CCHMAXPATH];
    32313264
    32323265   if(hModule == -1 || hModule == 0)
     
    32363269   }
    32373270   *lpszPath = 0;
    3238    rc = DosQueryModuleName(hModule, cchPath, lpszPath);
     3271   rc = DosQueryModuleName(hModule, sizeof(lpszOemPath), lpszOemPath);
     3272
     3273   if(rc == NO_ERROR)
     3274   {
     3275      //Convert file name from OS/2 to Windows
     3276      if (!OemToCharBuffA(lpszOemPath, lpszPath, cchPath))
     3277          return 0;
     3278   }
    32393279
    32403280   DWORD len = strlen(lpszPath);
Note: See TracChangeset for help on using the changeset viewer.