|
|
//+---------------------------------------------------------------------------
//
// 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); }
|