windows-nt/Source/XPSP1/NT/ds/adsi/winnt/ntcopy.cxx
2020-09-26 16:20:57 +08:00

230 lines
5.5 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: ntcopy.cxx
//
// Contents: NT Object Copy Routines
//
// Functions:
//
// History: 17-June-96 RamV Created.
// cloned off NDS copy code.
//
//
// Issues: Check null ptrs for AllocADsMem and AllocADsStr
//
//
//
//----------------------------------------------------------------------------
//
// NtType objects copy code
//
#include "winnt.hxx"
#pragma hdrstop
#define INITGUID
HRESULT
NtTypeCopy(
PNTOBJECT lpNtSrcObject,
PNTOBJECT lpNtDestObject
)
{
HRESULT hr = S_OK;
switch (lpNtSrcObject->NTType) {
case NT_SYNTAX_ID_BOOL:
lpNtDestObject->NTType = NT_SYNTAX_ID_BOOL;
(lpNtDestObject->NTValue).fValue = (lpNtSrcObject->NTValue).fValue;
break;
case NT_SYNTAX_ID_SYSTEMTIME:
lpNtDestObject->NTType = NT_SYNTAX_ID_SYSTEMTIME;
(lpNtDestObject->NTValue).stSystemTimeValue =
(lpNtSrcObject->NTValue).stSystemTimeValue;
break;
case NT_SYNTAX_ID_DATE_1970:
lpNtDestObject->NTType = NT_SYNTAX_ID_DATE_1970;
(lpNtDestObject->NTValue).dwSeconds1970 =
(lpNtSrcObject->NTValue).dwSeconds1970;
break;
case NT_SYNTAX_ID_DWORD:
lpNtDestObject->NTType = NT_SYNTAX_ID_DWORD;
(lpNtDestObject->NTValue).dwValue =
(lpNtSrcObject->NTValue).dwValue;
break;
case NT_SYNTAX_ID_DATE:
lpNtDestObject->NTType = NT_SYNTAX_ID_DATE;
(lpNtDestObject->NTValue).dwValue =
(lpNtSrcObject->NTValue).dwValue;
break;
case NT_SYNTAX_ID_LPTSTR:
lpNtDestObject->NTType = NT_SYNTAX_ID_LPTSTR;
if(!(lpNtSrcObject->NTValue).pszValue){
(lpNtDestObject->NTValue).pszValue = NULL;
hr = S_OK;
goto error;
}
(lpNtDestObject->NTValue).pszValue =
AllocADsStr((lpNtSrcObject->NTValue).pszValue);
hr =((lpNtDestObject->NTValue).pszValue == NULL)
? E_OUTOFMEMORY :S_OK;
break;
case NT_SYNTAX_ID_DelimitedString:
lpNtDestObject->NTType = NT_SYNTAX_ID_DelimitedString;
if(!(lpNtSrcObject->NTValue).pszValue){
(lpNtDestObject->NTValue).pszValue = NULL;
hr = S_OK;
goto error;
}
(lpNtDestObject->NTValue).pszValue =
AllocADsStr((lpNtSrcObject->NTValue).pszValue);
hr =((lpNtDestObject->NTValue).pszValue == NULL)
? E_OUTOFMEMORY :S_OK;
break;
case NT_SYNTAX_ID_NulledString:
lpNtDestObject->NTType = NT_SYNTAX_ID_NulledString;
if(!(lpNtSrcObject->NTValue).pszValue){
(lpNtDestObject->NTValue).pszValue = NULL;
hr = S_OK;
goto error;
}
(lpNtDestObject->NTValue).pszValue =
AllocADsStr((lpNtSrcObject->NTValue).pszValue);
hr =((lpNtDestObject->NTValue).pszValue == NULL)
? E_OUTOFMEMORY :S_OK;
break;
case NT_SYNTAX_ID_EncryptedString:
lpNtDestObject->NTType = NT_SYNTAX_ID_EncryptedString;
if(!(lpNtSrcObject->NTValue).pszValue){
(lpNtDestObject->NTValue).pszValue = NULL;
hr = S_OK;
goto error;
}
(lpNtDestObject->NTValue).pszValue =
AllocADsStr((lpNtSrcObject->NTValue).pszValue);
hr =((lpNtDestObject->NTValue).pszValue == NULL)
? E_OUTOFMEMORY :S_OK;
break;
case NT_SYNTAX_ID_OCTETSTRING:
lpNtDestObject->NTType = NT_SYNTAX_ID_OCTETSTRING;
(lpNtDestObject->NTValue).octetstring.dwSize =
(lpNtSrcObject->NTValue).octetstring.dwSize;
if ((lpNtSrcObject->NTValue).octetstring.dwSize == 0) {
(lpNtDestObject->NTValue).octetstring.pByte = NULL;
}
else {
(lpNtDestObject->NTValue).octetstring.pByte =
(BYTE*)AllocADsMem(sizeof(BYTE)*(lpNtSrcObject->NTValue).octetstring.dwSize);
if (!(lpNtDestObject->NTValue).octetstring.pByte) {
RRETURN(E_OUTOFMEMORY);
}
memcpy((lpNtDestObject->NTValue).octetstring.pByte,
(lpNtSrcObject->NTValue).octetstring.pByte,
(lpNtSrcObject->NTValue).octetstring.dwSize);
}
break;
default:
hr = E_FAIL;
break;
}
error:
RRETURN(hr);
}
HRESULT
NtTypeCopyConstruct(
LPNTOBJECT pNtSrcObjects,
DWORD dwNumObjects,
LPNTOBJECT * ppNtDestObjects
)
{
DWORD i = 0;
LPNTOBJECT pNtDestObjects = NULL;
HRESULT hr = S_OK;
pNtDestObjects = (LPNTOBJECT)AllocADsMem(
dwNumObjects * sizeof(NTOBJECT)
);
if (!pNtDestObjects) {
RRETURN(E_FAIL);
}
//
// Zero out so we can clear the memory on an error
//
memset(pNtDestObjects, 0, dwNumObjects * sizeof(NTOBJECT));
for (i = 0; i < dwNumObjects; i++ ) {
hr = NtTypeCopy(pNtSrcObjects + i, pNtDestObjects + i);
BAIL_ON_FAILURE(hr);
}
*ppNtDestObjects = pNtDestObjects;
RRETURN(S_OK);
error:
NTTypeFreeNTObjects(pNtDestObjects, dwNumObjects);
RRETURN(hr);
}