mirror of https://github.com/tongzx/nt5src
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.
287 lines
5.5 KiB
287 lines
5.5 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows NT Security
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
//
|
|
// File: dbutils.cpp
|
|
//
|
|
// Contents: utilities
|
|
//
|
|
// History: 07-Feb-00 reidk Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <windows.h>
|
|
#include <dbgdef.h>
|
|
|
|
extern void * _CatDBAlloc(size_t len);
|
|
extern void * _CatDBReAlloc(void *p, size_t len);
|
|
extern void _CatDBFree(void *p);
|
|
|
|
|
|
LPSTR _CatDBConvertWszToSz(LPCWSTR pwsz)
|
|
{
|
|
LPSTR psz = NULL;
|
|
LONG cch = 0;
|
|
|
|
cch = WideCharToMultiByte(
|
|
GetACP(),
|
|
0, // dwFlags
|
|
pwsz,
|
|
-1, // cchWideChar, -1 => null terminated
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (cch == 0)
|
|
{
|
|
goto ErrorWideCharToMultiByte;
|
|
}
|
|
|
|
if (NULL == (psz = (CHAR *) _CatDBAlloc(cch + 1)))
|
|
{
|
|
goto ErrorMemory;
|
|
}
|
|
|
|
if (0 == WideCharToMultiByte(
|
|
GetACP(),
|
|
0, // dwFlags
|
|
pwsz,
|
|
-1, // cchWideChar, -1 => null terminated
|
|
psz,
|
|
cch,
|
|
NULL,
|
|
NULL))
|
|
{
|
|
goto ErrorWideCharToMultiByte;
|
|
}
|
|
|
|
CommonReturn:
|
|
|
|
return (psz);
|
|
|
|
ErrorReturn:
|
|
|
|
if (psz != NULL)
|
|
{
|
|
_CatDBFree(psz);
|
|
}
|
|
|
|
psz = NULL;
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS_CATDBSVC, ErrorWideCharToMultiByte)
|
|
TRACE_ERROR_EX(DBG_SS_CATDBSVC, ErrorMemory)
|
|
}
|
|
|
|
|
|
LPWSTR _CATDBAllocAndCopyWSTR(LPCWSTR pwsz)
|
|
{
|
|
LPWSTR pwszTemp = NULL;
|
|
|
|
if (NULL == (pwszTemp =
|
|
(LPWSTR) _CatDBAlloc(sizeof(WCHAR) * (wcslen(pwsz) + 1) )))
|
|
{
|
|
goto ErrorMemory;
|
|
}
|
|
|
|
wcscpy(pwszTemp, pwsz);
|
|
|
|
CommonReturn:
|
|
|
|
return (pwszTemp);
|
|
|
|
ErrorReturn:
|
|
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS_CATDBSVC, ErrorMemory)
|
|
}
|
|
|
|
|
|
LPWSTR _CATDBAllocAndCopyWSTR2(LPCWSTR pwsz1, LPCWSTR pwsz2)
|
|
{
|
|
LPWSTR pwszTemp = NULL;
|
|
|
|
if (NULL == (pwszTemp =
|
|
(LPWSTR) _CatDBAlloc(sizeof(WCHAR) * ( wcslen(pwsz1) +
|
|
wcslen(pwsz2) +
|
|
1))))
|
|
{
|
|
goto ErrorMemory;
|
|
}
|
|
|
|
wcscpy(pwszTemp, pwsz1);
|
|
wcscat(pwszTemp, pwsz2);
|
|
|
|
CommonReturn:
|
|
|
|
return (pwszTemp);
|
|
|
|
ErrorReturn:
|
|
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS_CATDBSVC, ErrorMemory)
|
|
}
|
|
|
|
|
|
BOOL _CATDBStrCatWSTR(LPWSTR *ppwszAddTo, LPCWSTR pwszAdd)
|
|
{
|
|
BOOL fRet = TRUE;
|
|
LPWSTR pwszTemp = NULL;
|
|
|
|
if (NULL == (pwszTemp = (LPWSTR) _CatDBAlloc(sizeof(WCHAR) * ( wcslen(*ppwszAddTo) +
|
|
wcslen(pwszAdd) +
|
|
1))))
|
|
{
|
|
goto ErrorMemory;
|
|
}
|
|
|
|
wcscpy(pwszTemp, *ppwszAddTo);
|
|
wcscat(pwszTemp, pwszAdd);
|
|
|
|
_CatDBFree(*ppwszAddTo);
|
|
*ppwszAddTo = pwszTemp;
|
|
|
|
CommonReturn:
|
|
|
|
return (fRet);
|
|
|
|
ErrorReturn:
|
|
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS_CATDBSVC, ErrorMemory)
|
|
}
|
|
|
|
|
|
BOOL _CATDBStrCat(LPSTR *ppszAddTo, LPCSTR pszAdd)
|
|
{
|
|
BOOL fRet = TRUE;
|
|
LPSTR pszTemp = NULL;
|
|
|
|
if (NULL == (pszTemp = (LPSTR) _CatDBAlloc(sizeof(char) * ( strlen(*ppszAddTo) +
|
|
strlen(pszAdd) +
|
|
1))))
|
|
{
|
|
goto ErrorMemory;
|
|
}
|
|
|
|
strcpy(pszTemp, *ppszAddTo);
|
|
strcat(pszTemp, pszAdd);
|
|
|
|
_CatDBFree(*ppszAddTo);
|
|
*ppszAddTo = pszTemp;
|
|
|
|
CommonReturn:
|
|
|
|
return (fRet);
|
|
|
|
ErrorReturn:
|
|
|
|
fRet = FALSE;
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS_CATDBSVC, ErrorMemory)
|
|
}
|
|
|
|
LPWSTR _CATDBConstructWSTRPath(LPCWSTR pwsz1, LPCWSTR pwsz2)
|
|
{
|
|
LPWSTR pwszTemp = NULL;
|
|
int nTotalLen = 0;
|
|
int nLenStr1 = 0;
|
|
|
|
//
|
|
// Calculate the length of the resultant string as the sum of the length
|
|
// of pwsz1, length of pwsz2, a NULL char, and a possible extra '\' char
|
|
//
|
|
nLenStr1 = wcslen(pwsz1);
|
|
nTotalLen = nLenStr1 + wcslen(pwsz2) + 2;
|
|
|
|
//
|
|
// Allocate the string and copy pwsz1 into the buffer
|
|
//
|
|
if (NULL == (pwszTemp = (LPWSTR) _CatDBAlloc(sizeof(WCHAR) * nTotalLen)))
|
|
{
|
|
goto ErrorMemory;
|
|
}
|
|
|
|
wcscpy(pwszTemp, pwsz1);
|
|
|
|
//
|
|
// Add the extra '\' if needed
|
|
//
|
|
if (pwsz1[nLenStr1 - 1] != L'\\')
|
|
{
|
|
pwszTemp[nLenStr1] = L'\\';
|
|
pwszTemp[nLenStr1 + 1] = L'\0';
|
|
}
|
|
|
|
//
|
|
// Tack on pwsz2
|
|
//
|
|
wcscat(pwszTemp, pwsz2);
|
|
|
|
CommonReturn:
|
|
|
|
return (pwszTemp);
|
|
|
|
ErrorReturn:
|
|
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS_CATDBSVC, ErrorMemory)
|
|
}
|
|
|
|
|
|
LPSTR _CATDBConstructPath(LPCSTR psz1, LPCSTR psz2)
|
|
{
|
|
LPSTR pszTemp = NULL;
|
|
int nTotalLen = 0;
|
|
int nLenStr1 = 0;
|
|
|
|
//
|
|
// Calculate the length of the resultant string as the sum of the length
|
|
// of psz1, length of psz2, a NULL char, and a possible extra '\' char
|
|
//
|
|
nLenStr1 = strlen(psz1);
|
|
nTotalLen = nLenStr1 + strlen(psz2) + 2;
|
|
|
|
//
|
|
// Allocate the string and copy pwsz1 into the buffer
|
|
//
|
|
if (NULL == (pszTemp =
|
|
(LPSTR) _CatDBAlloc(sizeof(char) * nTotalLen)))
|
|
{
|
|
goto ErrorMemory;
|
|
}
|
|
|
|
strcpy(pszTemp, psz1);
|
|
|
|
//
|
|
// Add the extra '\' if needed
|
|
//
|
|
if (psz1[nLenStr1 - 1] != '\\')
|
|
{
|
|
pszTemp[nLenStr1] = '\\';
|
|
pszTemp[nLenStr1 + 1] = '\0';
|
|
}
|
|
|
|
//
|
|
// Tack on pwsz2
|
|
//
|
|
strcat(pszTemp, psz2);
|
|
|
|
CommonReturn:
|
|
|
|
return (pszTemp);
|
|
|
|
ErrorReturn:
|
|
|
|
goto CommonReturn;
|
|
|
|
TRACE_ERROR_EX(DBG_SS_CATDBSVC, ErrorMemory)
|
|
}
|