aspnetcore/src/AspNetCoreModuleV2/IISLib/util.cxx

79 lines
1.6 KiB
C++

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
#include "precomp.h"
HRESULT
MakePathCanonicalizationProof(
IN PCWSTR pszName,
OUT STRU * pstrPath
)
/*++
Routine Description:
This functions adds a prefix
to the string, which is "\\?\UNC\" for a UNC path, and "\\?\" for
other paths. This prefix tells Windows not to parse the path.
Arguments:
IN pszName - The path to be converted
OUT pstrPath - Output path created
Return Values:
HRESULT
--*/
{
HRESULT hr;
if (pszName[0] == L'\\' && pszName[1] == L'\\')
{
//
// If the path is already canonicalized, just return
//
if ((pszName[2] == '?' || pszName[2] == '.') &&
pszName[3] == '\\')
{
hr = pstrPath->Copy(pszName);
if (SUCCEEDED(hr))
{
//
// If the path was in DOS form ("\\.\"),
// we need to change it to Win32 from ("\\?\")
//
pstrPath->QueryStr()[2] = L'?';
}
return hr;
}
pszName += 2;
if (FAILED(hr = pstrPath->Copy(L"\\\\?\\UNC\\")))
{
return hr;
}
}
else if (wcslen(pszName) > MAX_PATH)
{
if (FAILED(hr = pstrPath->Copy(L"\\\\?\\")))
{
return hr;
}
}
else
{
pstrPath->Reset();
}
return pstrPath->Append(pszName);
}