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.
|
|
/*
* util.c - Miscellaneous utility functions module. */
/* Headers
**********/
#include "project.h"
#pragma hdrstop
/****************************** Public Functions *****************************/
/*
** IsLocalDrivePath() ** ** ** ** Arguments: ** ** Returns: ** ** Side Effects: none */ PUBLIC_CODE BOOL IsLocalDrivePath(LPCTSTR pcszFullPath) { BOOL bResult;
ASSERT(IsFullPath(pcszFullPath));
bResult = IsDrivePath(pcszFullPath);
if (bResult) { TCHAR rgchRootPath[DRIVE_ROOT_PATH_LEN];
ASSERT(IsCharAlpha(*pcszFullPath));
lstrcpy(rgchRootPath, TEXT("A:\\")); rgchRootPath[0] = *pcszFullPath;
bResult = (GetDriveType(rgchRootPath) != DRIVE_REMOTE); }
return(bResult); }
/*
** IsUNCPath() ** ** Determines whether or not a path is in "\\server\share" UNC form. ** ** Arguments: pcszPath - path to examine ** ** Returns: TRUE if path is a UNC path. FALSE if not. ** ** Side Effects: none ** ** A UNC path is a string of the form two slashes, one or more non-slashes, one ** slash, one or more non-slashes */ PUBLIC_CODE BOOL IsUNCPath(LPCTSTR pcszFullPath) { BOOL bResult = FALSE;
ASSERT(IsFullPath(pcszFullPath));
if (lstrlen(pcszFullPath) >= 5 && IS_SLASH(pcszFullPath[0]) && IS_SLASH(pcszFullPath[1]) && ! IS_SLASH(pcszFullPath[2])) { LPCTSTR pcsz;
for (pcsz = &(pcszFullPath[2]); *pcsz; pcsz = CharNext(pcsz)) { if (IS_SLASH(*pcsz)) { bResult = (*(pcsz + 1) && ! IS_SLASH(*(pcsz + 1)));
break; } } }
return(bResult); }
/*
** DeleteLastDrivePathElement() ** ** Deletes the last path element from a drive path. ** ** Arguments: pszDrivePath - drive path whose last element is to be deleted ** ** Returns: TRUE if path element deleted. FALSE if not, i.e., given path ** is root path. ** ** Side Effects: none ** ** Examples: ** ** input path output path ** ---------- ----------- ** c:\ c:\ ** c:\foo c:\ ** c:\foo\bar c:\foo ** c:\foo\bar\ c:\foo\bar ** ** N.b., this function does not perform any validity tests on the format of the ** input path string. */ PUBLIC_CODE BOOL DeleteLastDrivePathElement(LPTSTR pszDrivePath) { BOOL bHackIt; LPTSTR pszEndOfDriveSpec;
ASSERT(IsDrivePath(pszDrivePath));
pszEndOfDriveSpec = pszDrivePath + 3;
/* Is this a a root path? */
bHackIt = *pszEndOfDriveSpec;
if (bHackIt) DeleteLastPathElement(pszEndOfDriveSpec);
ASSERT(IsDrivePath(pszDrivePath));
return(bHackIt); }
#if defined(DEBUG) || defined(VSTF)
/*
** IsContained() ** ** ** ** Arguments: ** ** Returns: ** ** Side Effects: none */ PUBLIC_CODE BOOL IsContained(PCVOID pcvJar, UINT ucbJarLen, PCVOID pcvJelly, UINT ucbJellyLen) { BOOL bResult = FALSE;
ASSERT(IS_VALID_READ_BUFFER_PTR(pcvJar, CVOID, ucbJarLen)); ASSERT(IS_VALID_READ_BUFFER_PTR(pcvJelly, CVOID, ucbJellyLen));
if (EVAL(pcvJelly >= pcvJar)) { UINT ucbJellyOffset;
ucbJellyOffset = (UINT)((PCBYTE)pcvJelly - (PCBYTE)pcvJar);
if (EVAL(ucbJellyOffset < ucbJarLen) && EVAL(ucbJellyLen < ucbJarLen - ucbJellyOffset)) bResult = TRUE; }
return(bResult); }
/*
** IsValidCNRName() ** ** ** ** Arguments: ** ** Returns: ** ** Side Effects: none */ PUBLIC_CODE BOOL IsValidCNRName(LPCTSTR pcszCNRName) { BOOL bResult;
/* Any valid string < MAX_PATH_LEN bytes long is a valid CNR name. */
bResult = (IS_VALID_STRING_PTR(pcszCNRName, CSTR) && EVAL(lstrlen(pcszCNRName) < MAX_PATH_LEN));
#ifdef DEBUG
/*
* RIP if a CNR name ends in a slash */
if (bResult) { if (IsUNCPath(pcszCNRName)) { ASSERT(! IS_SLASH(*(CharPrev(pcszCNRName, pcszCNRName + lstrlen(pcszCNRName))))); } }
#endif
return(bResult); }
#endif
#ifdef DEBUG
/*
** IsDriveRootPath() ** ** ** ** Arguments: ** ** Returns: ** ** Side Effects: none */ PUBLIC_CODE BOOL IsDriveRootPath(LPCTSTR pcszPath) { return(IsDrivePath(pcszPath) && lstrlen(pcszPath) == 3); }
#endif
|