91 lines
2.9 KiB
C++
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;
|
|
}
|