2025-04-27 07:49:33 -04:00

91 lines
2.9 KiB
C++

#include "precomp.h"
#include <WbemCli.h>
#include <GenUtils.h>
#include "NormlNSp.h"
// eleiminate warning about a performance hit changing an int to a bool
#pragma warning(4:4800)
// replace all slashes and backslashes with exclamation points
// no NULL checks, blithely assuming it's already been done
void BangWhacks(LPWSTR pStr)
{
do
if ((*pStr == L'\\') || (*pStr == L'/'))
*pStr = L'!';
while (*++pStr);
}
HRESULT NormalizeNamespace(LPCWSTR pNonNormalName, LPWSTR* ppNormalName)
{
HRESULT hr = WBEM_E_FAILED;
if (pNonNormalName == NULL || (wcslen(pNonNormalName) == 0))
return WBEM_E_INVALID_PARAMETER;
// first used as comparison buffer, will eventually be the normalized Name
WCHAR* pBuf = NULL;
WCHAR computerName[MAX_COMPUTERNAME_LENGTH +1];
WCHAR whackWhackDotWhack[] = L"\\\\.\\";
DWORD dNameSize = MAX_COMPUTERNAME_LENGTH +1;
bool bGotName = false;
if (IsNT())
bGotName = GetComputerNameW(computerName, &dNameSize);
else
{
char computerNameA[2*(MAX_COMPUTERNAME_LENGTH +1)];
if (GetComputerNameA(computerNameA, &dNameSize))
bGotName = (-1 != mbstowcs( computerName, computerNameA, MAX_COMPUTERNAME_LENGTH +1));
}
if (bGotName)
{
// length calculated to hold:
// computername. pNonNormalName, two leading whacks, one separating whack
// a NULL terminator and one extra in case I can't count.
if (pBuf = new WCHAR[wcslen(computerName) +wcslen(pNonNormalName) +5])
{
// construct prefix: "\\computername\"
wcscpy(pBuf, L"\\\\");
wcscat(pBuf, computerName);
wcscat(pBuf, L"\\");
if (0 == _wcsnicmp(pBuf, pNonNormalName, wcslen(pBuf)))
{
// input already contains normalized name - do it
wcscpy(pBuf, pNonNormalName);
hr = WBEM_S_NO_ERROR;
}
else if (0 == _wcsnicmp(whackWhackDotWhack, pNonNormalName, wcslen(whackWhackDotWhack)))
{
// input contains a relative name, replace
WCHAR* pInterestingPart = (WCHAR*)pNonNormalName + wcslen(whackWhackDotWhack);
wcscat(pBuf, pInterestingPart);
hr = WBEM_S_NO_ERROR;
}
else if (pNonNormalName[0] != L'\\')
{
// probably contains a naked name "root\default"
wcscat(pBuf, pNonNormalName);
hr = WBEM_S_NO_ERROR;
}
else
hr = WBEM_E_INVALID_PARAMETER;
}
else
// buffer allocation failed
hr = WBEM_E_OUT_OF_MEMORY;
}
if (SUCCEEDED(hr))
*ppNormalName = pBuf;
else
delete pBuf;
return hr;
}