502 lines
9.2 KiB
C++
502 lines
9.2 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
||
|
//
|
||
|
// File: ntumrshl.cxx
|
||
|
//
|
||
|
// Contents:
|
||
|
//
|
||
|
// Functions:
|
||
|
//
|
||
|
//
|
||
|
// History: 17-June-1996 RamV Created.
|
||
|
//
|
||
|
//
|
||
|
// Notes : Need to add functionality to do NulledString to NTTYPE
|
||
|
// conversions
|
||
|
//
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "winnt.hxx"
|
||
|
#pragma hdrstop
|
||
|
#define INITGUID
|
||
|
|
||
|
HRESULT
|
||
|
NTTypeInit(
|
||
|
PNTOBJECT pNtType
|
||
|
)
|
||
|
{
|
||
|
memset(pNtType, 0, sizeof(NTOBJECT));
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
NTTypeClear(
|
||
|
PNTOBJECT pNtObject
|
||
|
)
|
||
|
{
|
||
|
if(!pNtObject)
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
switch (pNtObject->NTType) {
|
||
|
case NT_SYNTAX_ID_LPTSTR:
|
||
|
case NT_SYNTAX_ID_DelimitedString:
|
||
|
case NT_SYNTAX_ID_EncryptedString:
|
||
|
FreeADsStr((pNtObject->NTValue).pszValue);
|
||
|
break;
|
||
|
case NT_SYNTAX_ID_NulledString:
|
||
|
FreeADsMem((pNtObject->NTValue).pszValue);
|
||
|
break;
|
||
|
case NT_SYNTAX_ID_OCTETSTRING:
|
||
|
FreeADsMem((pNtObject->NTValue).octetstring.pByte);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
NTTypeFreeNTObjects(
|
||
|
PNTOBJECT pNtObject,
|
||
|
DWORD dwNumValues
|
||
|
)
|
||
|
{
|
||
|
DWORD i = 0;
|
||
|
|
||
|
if (!pNtObject) // just in case
|
||
|
return;
|
||
|
|
||
|
for (i = 0; i < dwNumValues; i++ ) {
|
||
|
NTTypeClear(pNtObject + i);
|
||
|
}
|
||
|
|
||
|
FreeADsMem(pNtObject);
|
||
|
pNtObject = NULL;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
CopyOctetToNTOBJECT(
|
||
|
PBYTE pOctetString,
|
||
|
PNTOBJECT lpNtObject
|
||
|
)
|
||
|
{
|
||
|
|
||
|
if(!lpNtObject){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
lpNtObject->NTType = NT_SYNTAX_ID_OCTETSTRING;
|
||
|
|
||
|
if(!pOctetString){
|
||
|
(lpNtObject->NTValue).octetstring.dwSize = 0;
|
||
|
(lpNtObject->NTValue).octetstring.pByte = NULL;
|
||
|
} else {
|
||
|
OctetString *pOctString = (OctetString*)pOctetString;
|
||
|
(lpNtObject->NTValue).octetstring.dwSize = pOctString->dwSize;
|
||
|
(lpNtObject->NTValue).octetstring.pByte = (BYTE*)AllocADsMem(sizeof(BYTE)*pOctString->dwSize);
|
||
|
if (!(lpNtObject->NTValue).octetstring.pByte) {
|
||
|
RRETURN(E_OUTOFMEMORY);
|
||
|
}
|
||
|
memcpy((lpNtObject->NTValue).octetstring.pByte, pOctString->pByte,pOctString->dwSize);
|
||
|
}
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
CopyDWORDToNTOBJECT(
|
||
|
PDWORD pdwSrcValue,
|
||
|
PNTOBJECT lpNtDestValue
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if(!lpNtDestValue){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
lpNtDestValue->NTType = NT_SYNTAX_ID_DWORD;
|
||
|
(lpNtDestValue->NTValue).dwValue = *pdwSrcValue;
|
||
|
|
||
|
RRETURN(hr);
|
||
|
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
CopyDATEToNTOBJECT(
|
||
|
PDWORD pdwSrcValue,
|
||
|
PNTOBJECT lpNtDestValue
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if(!lpNtDestValue){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
lpNtDestValue->NTType = NT_SYNTAX_ID_DATE;
|
||
|
(lpNtDestValue->NTValue).dwValue = *pdwSrcValue;
|
||
|
|
||
|
RRETURN(hr);
|
||
|
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
CopyBOOLToNTOBJECT(
|
||
|
PBOOL pfSrcValue,
|
||
|
PNTOBJECT lpNtObject
|
||
|
)
|
||
|
{
|
||
|
|
||
|
if(!lpNtObject){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
|
||
|
lpNtObject->NTType = NT_SYNTAX_ID_BOOL;
|
||
|
|
||
|
(lpNtObject->NTValue).fValue = *pfSrcValue;
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
CopySYSTEMTIMEToNTOBJECT(
|
||
|
PSYSTEMTIME pSysTime,
|
||
|
PNTOBJECT lpNtObject
|
||
|
)
|
||
|
{
|
||
|
|
||
|
if(!lpNtObject){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
(lpNtObject->NTValue).stSystemTimeValue = *pSysTime;
|
||
|
lpNtObject->NTType = NT_SYNTAX_ID_SYSTEMTIME;
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
CopyLPTSTRToNTOBJECT(
|
||
|
LPTSTR pszSrcValue,
|
||
|
PNTOBJECT lpNtObject
|
||
|
)
|
||
|
{
|
||
|
if(!lpNtObject){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
lpNtObject->NTType = NT_SYNTAX_ID_LPTSTR;
|
||
|
|
||
|
if(!pszSrcValue){
|
||
|
(lpNtObject->NTValue). pszValue = NULL;
|
||
|
} else {
|
||
|
|
||
|
(lpNtObject->NTValue). pszValue = AllocADsStr(pszSrcValue);
|
||
|
|
||
|
if (!((lpNtObject->NTValue). pszValue)){
|
||
|
RRETURN(E_OUTOFMEMORY);
|
||
|
}
|
||
|
}
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
CopyDelimitedStringToNTOBJECT(
|
||
|
LPTSTR pszSrcValue,
|
||
|
PNTOBJECT lpNtObject,
|
||
|
DWORD dwElements
|
||
|
)
|
||
|
{
|
||
|
|
||
|
LPTSTR pszCurrPos = NULL;
|
||
|
LONG i;
|
||
|
WCHAR Delimiter = L',';
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if(!pszSrcValue){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
if(!lpNtObject){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// scan string and put the appropriate pointers
|
||
|
//
|
||
|
|
||
|
pszCurrPos = pszSrcValue;
|
||
|
|
||
|
//
|
||
|
// Fill up the NtObject structure
|
||
|
//
|
||
|
|
||
|
lpNtObject[0].NTType = NT_SYNTAX_ID_DelimitedString;
|
||
|
(lpNtObject[0].NTValue).pszValue = AllocADsStr(pszCurrPos);
|
||
|
|
||
|
if (!(lpNtObject[0].NTValue). pszValue){
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
i = 1;
|
||
|
|
||
|
while(i < (LONG)dwElements){
|
||
|
|
||
|
if(*pszCurrPos == TEXT('\0')){
|
||
|
|
||
|
lpNtObject[i].NTType = NT_SYNTAX_ID_DelimitedString;
|
||
|
(lpNtObject[i].NTValue).pszValue = AllocADsStr(++pszCurrPos);
|
||
|
|
||
|
if (!(lpNtObject[i].NTValue).pszValue){
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
goto error;
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
|
||
|
pszCurrPos++;
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
CopyNulledStringToNTOBJECT(
|
||
|
LPTSTR pszSrcValue,
|
||
|
PNTOBJECT lpNtObject,
|
||
|
DWORD dwElements
|
||
|
)
|
||
|
{
|
||
|
|
||
|
LPTSTR pszCurrPos = NULL;
|
||
|
LONG i;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if(!pszSrcValue){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
if(!lpNtObject){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// scan string and put the appropriate pointers
|
||
|
//
|
||
|
|
||
|
pszCurrPos = pszSrcValue;
|
||
|
|
||
|
//
|
||
|
// Fill up the NtObject structure
|
||
|
//
|
||
|
|
||
|
lpNtObject[0].NTType = NT_SYNTAX_ID_NulledString;
|
||
|
(lpNtObject[0].NTValue).pszValue = AllocADsStr(pszCurrPos);
|
||
|
|
||
|
if (!(lpNtObject[0].NTValue). pszValue){
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
i = 1;
|
||
|
|
||
|
while(i < (LONG)dwElements){
|
||
|
|
||
|
if(*pszCurrPos == TEXT('\0')){
|
||
|
|
||
|
lpNtObject[i].NTType = NT_SYNTAX_ID_NulledString;
|
||
|
(lpNtObject[i].NTValue).pszValue = AllocADsStr(++pszCurrPos);
|
||
|
|
||
|
if (!(lpNtObject[i].NTValue).pszValue){
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
goto error;
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
|
||
|
pszCurrPos++;
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
CopySeconds70ToNTOBJECT(
|
||
|
PDWORD pdwSrcValue,
|
||
|
PNTOBJECT lpNtDestValue
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if(!lpNtDestValue){
|
||
|
RRETURN(E_POINTER);
|
||
|
}
|
||
|
|
||
|
lpNtDestValue->NTType = NT_SYNTAX_ID_DATE_1970;
|
||
|
(lpNtDestValue->NTValue).dwSeconds1970 = *pdwSrcValue;
|
||
|
|
||
|
RRETURN(hr);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
CopyNTToNTSynId(
|
||
|
DWORD dwSyntaxId,
|
||
|
LPBYTE lpByte,
|
||
|
PNTOBJECT lpNTObject,
|
||
|
DWORD dwNumValues
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
switch (dwSyntaxId) {
|
||
|
case NT_SYNTAX_ID_BOOL:
|
||
|
|
||
|
hr = CopyBOOLToNTOBJECT(
|
||
|
(PBOOL)lpByte,
|
||
|
lpNTObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case NT_SYNTAX_ID_SYSTEMTIME:
|
||
|
hr = CopySYSTEMTIMEToNTOBJECT(
|
||
|
(PSYSTEMTIME)lpByte,
|
||
|
lpNTObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case NT_SYNTAX_ID_DWORD:
|
||
|
hr = CopyDWORDToNTOBJECT(
|
||
|
(PDWORD)lpByte,
|
||
|
lpNTObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case NT_SYNTAX_ID_DelimitedString:
|
||
|
hr = CopyDelimitedStringToNTOBJECT(
|
||
|
(LPTSTR)lpByte,
|
||
|
lpNTObject,
|
||
|
dwNumValues
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case NT_SYNTAX_ID_NulledString:
|
||
|
hr = CopyNulledStringToNTOBJECT(
|
||
|
(LPTSTR)lpByte,
|
||
|
lpNTObject,
|
||
|
dwNumValues
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case NT_SYNTAX_ID_LPTSTR:
|
||
|
hr = CopyLPTSTRToNTOBJECT(
|
||
|
(LPTSTR)lpByte,
|
||
|
lpNTObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case NT_SYNTAX_ID_DATE_1970:
|
||
|
hr = CopySeconds70ToNTOBJECT(
|
||
|
(PDWORD)lpByte,
|
||
|
lpNTObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case NT_SYNTAX_ID_DATE :
|
||
|
hr = CopyDATEToNTOBJECT(
|
||
|
(PDWORD)lpByte,
|
||
|
lpNTObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case NT_SYNTAX_ID_OCTETSTRING:
|
||
|
hr = CopyOctetToNTOBJECT(
|
||
|
lpByte,
|
||
|
lpNTObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// NT is single-valued except for Delimited and Nulled Strings
|
||
|
//
|
||
|
|
||
|
HRESULT
|
||
|
UnMarshallNTToNTSynId(
|
||
|
DWORD dwSyntaxId,
|
||
|
DWORD dwNumValues,
|
||
|
LPBYTE lpValue,
|
||
|
PNTOBJECT * ppNTObject
|
||
|
)
|
||
|
{
|
||
|
LPBYTE lpByte = lpValue;
|
||
|
DWORD i = 0;
|
||
|
PNTOBJECT pNTObject = NULL;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
pNTObject = (PNTOBJECT)AllocADsMem(
|
||
|
sizeof(NTOBJECT)*dwNumValues
|
||
|
);
|
||
|
|
||
|
if (!pNTObject) {
|
||
|
RRETURN(E_FAIL);
|
||
|
}
|
||
|
|
||
|
hr = CopyNTToNTSynId(
|
||
|
dwSyntaxId,
|
||
|
lpByte,
|
||
|
pNTObject,
|
||
|
dwNumValues
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
*ppNTObject = pNTObject;
|
||
|
|
||
|
RRETURN(hr);
|
||
|
error:
|
||
|
if(pNTObject){
|
||
|
NTTypeFreeNTObjects(pNTObject, dwNumValues);
|
||
|
}
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|