180 lines
4 KiB
C++
180 lines
4 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
SxsPath.cpp
|
|
|
|
Abstract:
|
|
|
|
Author:
|
|
|
|
Jay Krell (a-JayK) October 2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "stdinc.h"
|
|
#include "sxspath.h"
|
|
#include "fusiontrace.h"
|
|
|
|
BOOL
|
|
SxspIsUncPath(
|
|
PCWSTR Path,
|
|
BOOL* Result
|
|
)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
FN_TRACE_WIN32(fSuccess);
|
|
BOOL fIsFullWin32OrNtPath = FALSE;
|
|
|
|
PARAMETER_CHECK(Path != NULL);
|
|
PARAMETER_CHECK(Result != NULL);
|
|
|
|
IFW32FALSE_EXIT(::SxspIsFullWin32OrNtPath(Path, &fIsFullWin32OrNtPath));
|
|
PARAMETER_CHECK(fIsFullWin32OrNtPath);
|
|
|
|
//
|
|
// UNC paths take at least two forms.
|
|
//
|
|
// 1) \\computer\share
|
|
// 2) \\?\unc\computer\share
|
|
// This is the NT path disguised as a Win32 path form.
|
|
//
|
|
// Non UNC paths take at least two forms.
|
|
//
|
|
// 1) c:\blah
|
|
// 2) \\?\c:\blah
|
|
// This is the NT path disguised as a Win32 path form.
|
|
//
|
|
if (RTL_IS_PATH_SEPARATOR(Path[0]) &&
|
|
RTL_IS_PATH_SEPARATOR(Path[1]))
|
|
{
|
|
if (Path[2] != '?')
|
|
{
|
|
*Result = TRUE;
|
|
fSuccess = TRUE;
|
|
goto Exit;
|
|
}
|
|
if ((Path[3] == 'U' || Path[3] == 'u') &&
|
|
(Path[4] == 'N' || Path[4] == 'n') &&
|
|
(Path[5] == 'N' || Path[5] == 'c') &&
|
|
RTL_IS_PATH_SEPARATOR(Path[6])
|
|
)
|
|
{
|
|
*Result = TRUE;
|
|
fSuccess = TRUE;
|
|
goto Exit;
|
|
}
|
|
}
|
|
fSuccess = TRUE;
|
|
*Result = FALSE;
|
|
Exit:
|
|
KdPrint((__FUNCTION__"(%ls):%s\n", Path, *Result ? "true" : "false"));
|
|
return fSuccess;
|
|
}
|
|
|
|
BOOL
|
|
SxspIsNtPath(
|
|
PCWSTR Path,
|
|
BOOL* Result
|
|
)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
FN_TRACE_WIN32(fSuccess);
|
|
|
|
PARAMETER_CHECK(Path != NULL);
|
|
PARAMETER_CHECK(Result != NULL);
|
|
|
|
//
|
|
// Nt paths usually look like \??\c:\blah
|
|
// or \??\unc\machine\share
|
|
//
|
|
// There general form is just a slash delimited path that
|
|
// starts with a slash and never contains double slashes (like DOS/Win32 paths can have).
|
|
//
|
|
// The path \foo\bar is ambiguous between DOS/Win32 and NT.
|
|
//
|
|
*Result = ((Path[0] != 0) && (Path[1] == '?'));
|
|
fSuccess = TRUE;
|
|
Exit:
|
|
KdPrint((__FUNCTION__"(%ls):%s\n", Path, *Result ? "true" : "false"));
|
|
return fSuccess;
|
|
}
|
|
|
|
BOOL
|
|
SxspIsFullWin32OrNtPath(
|
|
PCWSTR Path,
|
|
BOOL* Result
|
|
)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
FN_TRACE_WIN32(fSuccess);
|
|
|
|
PARAMETER_CHECK(Path != NULL);
|
|
PARAMETER_CHECK(Result != NULL);
|
|
|
|
//
|
|
//
|
|
// The acceptable forms are
|
|
//
|
|
// \\machine\share
|
|
// c:\foo
|
|
// \??\c:\foo
|
|
// \??\unc\machine\share
|
|
// \\?\c:\foo
|
|
// \\?\unc\machine\share
|
|
//
|
|
//
|
|
if (::FusionpIsDriveLetter(Path[0]) &&
|
|
(Path[1] == ':') &&
|
|
RTL_IS_PATH_SEPARATOR(Path[2]))
|
|
{
|
|
*Result = TRUE;
|
|
fSuccess = TRUE;
|
|
goto Exit;
|
|
}
|
|
if (RTL_IS_PATH_SEPARATOR(Path[0])
|
|
&& (Path[1] == '?' || RTL_IS_PATH_SEPARATOR(Path[1]))
|
|
&& Path[2] == '?'
|
|
&& RTL_IS_PATH_SEPARATOR(Path[3]))
|
|
{
|
|
// "\??\" or "\\?\"
|
|
if (::FusionpIsDriveLetter(Path[4]) &&
|
|
(Path[5] == ':') &&
|
|
(RTL_IS_PATH_SEPARATOR(Path[6]) || Path[6] == 0))
|
|
{
|
|
// "\??\c:\" or "\\?\c:\"
|
|
*Result = TRUE;
|
|
fSuccess = TRUE;
|
|
goto Exit;
|
|
}
|
|
if ((Path[4] == L'U' || Path[4] == L'u') &&
|
|
(Path[5] == L'N' || Path[5] == L'n') &&
|
|
(Path[6] == L'C' || Path[6] == L'c') &&
|
|
RTL_IS_PATH_SEPARATOR(Path[7]) &&
|
|
(Path[8] != L'\0'))
|
|
{
|
|
// "\??\unc\" for "\\?\unc\"
|
|
*Result = TRUE;
|
|
fSuccess = TRUE;
|
|
goto Exit;
|
|
}
|
|
|
|
}
|
|
if (RTL_IS_PATH_SEPARATOR(Path[0]) &&
|
|
RTL_IS_PATH_SEPARATOR(Path[1]))
|
|
{
|
|
// "\\" presumably "\\machine\share"
|
|
{
|
|
*Result = TRUE;
|
|
fSuccess = TRUE;
|
|
goto Exit;
|
|
}
|
|
}
|
|
Exit:
|
|
KdPrint((__FUNCTION__"(%ls):%s\n", Path, *Result ? "true" : "false"));
|
|
return fSuccess;
|
|
}
|