You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
6.1 KiB
258 lines
6.1 KiB
//
|
|
// 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;
|
|
}
|