79 lines
1.6 KiB
C++
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);
|
|
}
|
|
|