// // Include Files // #include "stdafx.h" #include "common.h" #include "iisdebug.h" #include "strfn.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif BOOL IsUNCName( IN const CString & strDirPath ) /*++ Routine Description: Determine if the given string path is a UNC path. Arguments: const CString & strDirPath : Directory path string Return Value: TRUE if the path is a UNC path, FALSE otherwise. Notes: Any string of the form \\foo\bar\whatever is considered a UNC path, with the exception of \\.\device paths. No validation for the existance occurs, only for the correct format. --*/ { if (strDirPath.GetLength() >= 5) // It must be at least as long as \\x\y, { // LPCTSTR lp = strDirPath; // if (*lp == _T('\\') // It must begin with \\, && *(lp + 1) == _T('\\') // && *(lp + 2) != _T('.') // This is a device. && _tcschr(lp + 3, _T('\\')) // And have at least one more \ after that ) { // // Yes, it's a UNC path // return TRUE; } } // // No, it's not // return FALSE; } BOOL _EXPORT GetSpecialPathRealPath( IN const CString & strDirPath, OUT CString & strDestination ) { BOOL bReturn = FALSE; LPCTSTR lpszSpecialStuff = _T("\\\\?\\"); LPCTSTR lpszUNCDevice = _T("UNC\\"); // Default it with something strDestination = strDirPath; // Check for the "special stuff" BOOL bIsSpecialPath = (0 == _tcsnccmp(strDirPath, lpszSpecialStuff, lstrlen(lpszSpecialStuff))); // check if we need to verifiy that it is indeeded a valid devicepath if (bIsSpecialPath) { CString strTempPath; // verify that this is indeed a valid special path // grab everyting after the part we're interested in... // // and check if that is a fully qualified path // or a fully qualified UNC path. // // 1) \\?\c:\temp\testind.dll // 2) \\?\UNC\MyUnc\testing.dll // // check for #1 strTempPath = strDirPath.Right(strDirPath.GetLength() - lstrlen(lpszSpecialStuff)); // check if it starts with UNC if (0 == _tcsnccmp(strTempPath, lpszUNCDevice, lstrlen(lpszUNCDevice))) { CString strTempPath2; strTempPath2 = strTempPath.Right(strTempPath.GetLength() - lstrlen(lpszUNCDevice)); DebugTrace(_T("SpecialPath:%s,it's a UNC path!\r\n"),strTempPath2); // Append on the extra ("\\\\") when returning the munged path strDestination = _T("\\\\") + strTempPath2; bReturn = TRUE; } else { // check if the path if fully qualified and // if it's valid if (!PathIsRelative(strTempPath)) { DebugTrace(_T("SpecialPath:%s,it's NOT a UNC path!\r\n"),strTempPath); strDestination = strTempPath; bReturn = TRUE; } } } return bReturn; } BOOL _EXPORT IsSpecialPath( IN const CString & strDirPath, IN BOOL bCheckIfValid ) /*++ Routine Description: Determine if the given path is of the form: 1) \\?\c:\temp\testind.dll 2) \\?\UNC\MyUnc\testing.dll Arguments: const CString & strDirPath : Directory path string BOOL bCheckIfValid : to say "return true only if it's a "special path" and if it's valid" Return Value: TRUE if the path given is a special path, FALSE if it is not. if bCheckIfValid = TRUE then: TRUE if the path given is a special path and it's valid FALSE if it is not. --*/ { BOOL bIsSpecialPath = FALSE; LPCTSTR lpszSpecialStuff = _T("\\\\?\\"); LPCTSTR lpszUNCDevice = _T("UNC\\"); // Check for the "special stuff" bIsSpecialPath = (0 == _tcsnccmp(strDirPath, lpszSpecialStuff, lstrlen(lpszSpecialStuff))); // check if we need to verifiy that it is indeeded a valid devicepath if (bIsSpecialPath && bCheckIfValid) { bIsSpecialPath = FALSE; CString strTempPath; // verify that this is indeed a valid special path // grab everyting after the part we're interested in... // // and check if that is a fully qualified path // or a fully qualified UNC path. // // 1) \\?\c:\temp\testind.dll // 2) \\?\UNC\MyUnc\testing.dll // // check for #1 strTempPath = strDirPath.Right(strDirPath.GetLength() - lstrlen(lpszSpecialStuff)); // check if it starts with UNC if (0 == _tcsnccmp(strTempPath, lpszUNCDevice, lstrlen(lpszUNCDevice))) { bIsSpecialPath = TRUE; DebugTrace(_T("SpecialPath:%s,it's a UNC path!\r\n"),strTempPath); } else { // check if the path if fully qualified and // if it's valid if (!PathIsRelative(strTempPath)) { bIsSpecialPath = TRUE; DebugTrace(_T("SpecialPath:%s,it's NOT a UNC path!\r\n"),strTempPath); } } } return bIsSpecialPath; } BOOL _EXPORT IsDevicePath( IN const CString & strDirPath ) /*++ Routine Description: Determine if the given path is of the form "\\.\foobar" Arguments: const CString & strDirPath : Directory path string Return Value: TRUE if the path given is a device path, FALSE if it is not. --*/ { LPCTSTR lpszDevice = _T("\\\\.\\"); return (0 == _tcsnccmp(strDirPath, lpszDevice, lstrlen(lpszDevice))); } BOOL PathIsValid(LPCTSTR path) { LPCTSTR p = path; BOOL rc = TRUE; if (p == NULL || *p == 0) return FALSE; while (*p != 0) { switch (*p) { case TEXT('|'): case TEXT('>'): case TEXT('<'): case TEXT('/'): case TEXT('?'): case TEXT('*'): // case TEXT(';'): // case TEXT(','): case TEXT('"'): rc = FALSE; break; default: if (*p < TEXT(' ')) { rc = FALSE; } break; } if (!rc) { break; } p++; } return rc; }