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.
362 lines
6.9 KiB
362 lines
6.9 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
|
//
|
|
// File: var2winnt.cxx
|
|
//
|
|
// Contents:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 13-June-1996 RamV Created.
|
|
//
|
|
//
|
|
// Issues: Check null ptrs for AllocADsMem and AllocADsStr
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "winnt.hxx"
|
|
#pragma hdrstop
|
|
#define INITGUID
|
|
|
|
|
|
//
|
|
// WinNT objects copy code
|
|
//
|
|
|
|
HRESULT
|
|
VarTypeToWinNTTypeCopyBOOL(
|
|
PVARIANT lpVarSrcObject,
|
|
PNTOBJECT pNTDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(!lpVarSrcObject){
|
|
RRETURN(E_POINTER);
|
|
}
|
|
|
|
if(lpVarSrcObject->vt != VT_BOOL){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
pNTDestValue->NTType = NT_SYNTAX_ID_BOOL;
|
|
|
|
if(lpVarSrcObject->boolVal){
|
|
(pNTDestValue->NTValue).fValue = TRUE;
|
|
|
|
} else {
|
|
(pNTDestValue->NTValue).fValue = FALSE;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
VarTypeToWinNTTypeCopySYSTEMTIME(
|
|
PVARIANT lpVarSrcObject,
|
|
PNTOBJECT pNTDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(!lpVarSrcObject){
|
|
RRETURN(E_POINTER);
|
|
}
|
|
|
|
if(lpVarSrcObject->vt != VT_DATE){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
hr = ConvertDATEToSYSTEMTIME(lpVarSrcObject->date,
|
|
&(pNTDestValue->NTValue.stSystemTimeValue) );
|
|
|
|
|
|
RRETURN( hr );
|
|
}
|
|
|
|
|
|
HRESULT
|
|
VarTypeToWinNTTypeCopyDWORD(
|
|
PVARIANT lpVarSrcObject,
|
|
PNTOBJECT pNTDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpVarSrcObject->vt == VT_I4){
|
|
|
|
(pNTDestValue->NTValue).dwValue =
|
|
(DWORD)lpVarSrcObject->lVal;
|
|
}
|
|
else if (lpVarSrcObject->vt == VT_I2) {
|
|
|
|
(pNTDestValue->NTValue).dwValue =
|
|
(DWORD)lpVarSrcObject->iVal;
|
|
}
|
|
else {
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
pNTDestValue->NTType = NT_SYNTAX_ID_DWORD;
|
|
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
VarTypeToWinNTTypeCopyDATE(
|
|
PVARIANT lpVarSrcObject,
|
|
PNTOBJECT pNTDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
SYSTEMTIME stTime;
|
|
|
|
if(lpVarSrcObject->vt != VT_DATE){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
pNTDestValue->NTType = NT_SYNTAX_ID_DATE;
|
|
|
|
|
|
//
|
|
// Note carefully! date is supplied as a value which is < 1 however
|
|
// VariantTimeToDosDateTime complains when given a value < 30000.
|
|
// (Number of days between 1900 and 1980). So
|
|
// we add 35000 to make it a legal value.
|
|
//
|
|
|
|
hr = ConvertDATEToSYSTEMTIME(lpVarSrcObject->date+ 35000,
|
|
&stTime);
|
|
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
(pNTDestValue->NTValue).dwValue = stTime.wHour*60 + stTime.wMinute ;
|
|
|
|
|
|
error:
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
VarTypeToWinNTTypeCopyDATE70(
|
|
PVARIANT lpVarSrcObject,
|
|
PNTOBJECT pNTDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
SYSTEMTIME stTime;
|
|
DWORD dwSeconds1970 = 0;
|
|
|
|
if(lpVarSrcObject->vt != VT_DATE){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
pNTDestValue->NTType = NT_SYNTAX_ID_DATE_1970;
|
|
|
|
hr = ConvertDATEtoDWORD(
|
|
lpVarSrcObject->date,
|
|
&dwSeconds1970
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
(pNTDestValue->NTValue).dwSeconds1970 = dwSeconds1970 ;
|
|
|
|
error:
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
VarTypeToWinNTTypeCopyLPTSTR(
|
|
PVARIANT lpVarSrcObject,
|
|
PNTOBJECT pNTDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(lpVarSrcObject->vt != VT_BSTR){
|
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
pNTDestValue->NTType = NT_SYNTAX_ID_LPTSTR;
|
|
|
|
(pNTDestValue->NTValue).pszValue =
|
|
AllocADsStr(lpVarSrcObject->bstrVal);
|
|
|
|
if(!(pNTDestValue->NTValue).pszValue){
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
VarTypeToWinNTTypeCopyOctetString(
|
|
PVARIANT lpVarSrcObject,
|
|
PNTOBJECT pNTDestValue
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
pNTDestValue->NTType = NT_SYNTAX_ID_OCTETSTRING;
|
|
hr = VariantToBinary(
|
|
lpVarSrcObject,
|
|
&(pNTDestValue->NTValue).octetstring.dwSize,
|
|
&(pNTDestValue->NTValue).octetstring.pByte);
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
VarTypeToNtTypeCopy(
|
|
DWORD dwNtType,
|
|
PVARIANT lpVarSrcObject,
|
|
PNTOBJECT lpNtDestObject
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
switch (dwNtType){
|
|
case NT_SYNTAX_ID_BOOL:
|
|
hr = VarTypeToWinNTTypeCopyBOOL(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
break;
|
|
|
|
case NT_SYNTAX_ID_SYSTEMTIME:
|
|
hr = VarTypeToWinNTTypeCopySYSTEMTIME(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
break;
|
|
|
|
|
|
case NT_SYNTAX_ID_DWORD:
|
|
hr = VarTypeToWinNTTypeCopyDWORD(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
break;
|
|
|
|
case NT_SYNTAX_ID_DATE:
|
|
hr = VarTypeToWinNTTypeCopyDATE(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
break;
|
|
|
|
|
|
case NT_SYNTAX_ID_DATE_1970:
|
|
hr = VarTypeToWinNTTypeCopyDATE70(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
break;
|
|
|
|
|
|
case NT_SYNTAX_ID_LPTSTR:
|
|
hr = VarTypeToWinNTTypeCopyLPTSTR(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
break;
|
|
|
|
case NT_SYNTAX_ID_DelimitedString:
|
|
hr = VarTypeToWinNTTypeCopyLPTSTR(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
|
|
lpNtDestObject->NTType = NT_SYNTAX_ID_DelimitedString;
|
|
break;
|
|
|
|
case NT_SYNTAX_ID_NulledString:
|
|
hr = VarTypeToWinNTTypeCopyLPTSTR(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
lpNtDestObject->NTType = NT_SYNTAX_ID_NulledString;
|
|
break;
|
|
|
|
case NT_SYNTAX_ID_OCTETSTRING:
|
|
hr = VarTypeToWinNTTypeCopyOctetString(
|
|
lpVarSrcObject,
|
|
lpNtDestObject
|
|
);
|
|
lpNtDestObject->NTType = NT_SYNTAX_ID_OCTETSTRING;
|
|
break;
|
|
|
|
default:
|
|
hr = E_FAIL;
|
|
break;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
|
|
HRESULT
|
|
VarTypeToNtTypeCopyConstruct(
|
|
DWORD dwNtType,
|
|
LPVARIANT pVarSrcObjects,
|
|
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);
|
|
}
|
|
|
|
for (i = 0; i < dwNumObjects; i++ ) {
|
|
hr = VarTypeToNtTypeCopy(
|
|
dwNtType,
|
|
pVarSrcObjects + i,
|
|
pNtDestObjects + i
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
*ppNtDestObjects = pNtDestObjects;
|
|
|
|
RRETURN(S_OK);
|
|
|
|
error:
|
|
|
|
if (pNtDestObjects) {
|
|
|
|
FreeADsMem(pNtDestObjects);
|
|
}
|
|
|
|
*ppNtDestObjects = NULL;
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|