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.
108 lines
3.1 KiB
108 lines
3.1 KiB
//***************************************************************************
|
|
//
|
|
// Copyright © Microsoft Corporation. All rights reserved.
|
|
//
|
|
// utils.cpp
|
|
//
|
|
// Purpose: utility functions
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
#include <utillib.h>
|
|
#include <utils.h>
|
|
|
|
// see comments in header
|
|
DWORD WINAPI NormalizePath(
|
|
|
|
LPCWSTR lpwszInPath,
|
|
LPCWSTR lpwszComputerName,
|
|
LPCWSTR lpwszNamespace,
|
|
DWORD dwFlags,
|
|
CHString &sOutPath
|
|
)
|
|
{
|
|
ParsedObjectPath *pParsedPath = NULL;
|
|
CObjectPathParser objpathParser;
|
|
|
|
GetValuesForPropResults eRet = e_OK;
|
|
|
|
int nStatus = objpathParser.Parse( lpwszInPath, &pParsedPath );
|
|
|
|
if ( 0 == nStatus )
|
|
{
|
|
try
|
|
{
|
|
// Check the machine name and namespace
|
|
if (pParsedPath->IsRelative( lpwszComputerName, lpwszNamespace ))
|
|
{
|
|
// If there is only one key, null out the property name (easier than trying
|
|
// to find the key name if it is missing).
|
|
if (pParsedPath->m_dwNumKeys == 1)
|
|
{
|
|
if (pParsedPath->m_paKeys[0]->m_pName != NULL)
|
|
{
|
|
if (!(dwFlags & NORMALIZE_NULL))
|
|
{
|
|
}
|
|
else
|
|
{
|
|
delete pParsedPath->m_paKeys[0]->m_pName;
|
|
pParsedPath->m_paKeys[0]->m_pName = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!(dwFlags & NORMALIZE_NULL))
|
|
{
|
|
eRet = e_NullName;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (eRet == e_OK)
|
|
{
|
|
// Reform the object path, minus machine name and namespace name
|
|
LPWSTR pPath = NULL;
|
|
if (objpathParser.Unparse(pParsedPath, &pPath) == 0)
|
|
{
|
|
try
|
|
{
|
|
sOutPath = pPath;
|
|
}
|
|
catch ( ... )
|
|
{
|
|
delete pPath;
|
|
throw;
|
|
}
|
|
delete pPath;
|
|
}
|
|
else
|
|
{
|
|
sOutPath.Empty();
|
|
eRet = e_UnParseError;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sOutPath.Empty();
|
|
eRet = e_NonLocalPath;
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
objpathParser.Free( pParsedPath );
|
|
throw;
|
|
}
|
|
|
|
objpathParser.Free( pParsedPath );
|
|
}
|
|
else
|
|
{
|
|
sOutPath.Empty();
|
|
eRet = e_UnparsablePath;
|
|
}
|
|
|
|
return eRet;
|
|
}
|