Source code of Windows XP (NT5)
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.
|
|
/*++
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; }
|