windows-nt/Source/XPSP1/NT/inetsrv/iis/admin/adsi/adsiis/iisurshl.cxx
2020-09-26 16:20:57 +08:00

314 lines
6.3 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1997.
//
// File: iisurshl.cxx
//
// Contents: IIS unmarshalling code
//
// Functions:
//
// History: 01-Mar-97 SophiaC Created.
//
//----------------------------------------------------------------------------
#include "iis.hxx"
HRESULT
IISTypeInit(
PIISOBJECT pIISType
)
{
memset(pIISType, 0, sizeof(IISOBJECT));
RRETURN(S_OK);
}
LPBYTE
CopyIISDWORD_To_IISSynIdDWORD(
LPBYTE lpByte,
PIISOBJECT lpIISObject
)
{
lpIISObject->IISType = IIS_SYNTAX_ID_DWORD;
lpIISObject->IISValue.value_1.dwDWORD = *(DWORD UNALIGNED *)lpByte;
return(lpByte);
}
LPBYTE
CopyIISSTRING_To_IISSynIdSTRING(
LPBYTE lpByte,
PIISOBJECT lpIISObject
)
{
DWORD dwStatus = 0;
lpIISObject->IISType = IIS_SYNTAX_ID_STRING;
lpIISObject->IISValue.value_2.String =
(LPWSTR)AllocADsStr((LPWSTR)lpByte);
return(lpByte);
}
LPBYTE
CopyIISEXPANDSZ_To_IISSynIdEXPANDSZ(
LPBYTE lpByte,
PIISOBJECT lpIISObject
)
{
DWORD dwStatus = 0;
lpIISObject->IISType = IIS_SYNTAX_ID_EXPANDSZ;
lpIISObject->IISValue.value_3.ExpandSz =
(LPWSTR)AllocADsStr((LPWSTR)lpByte);
return(lpByte);
}
LPBYTE
CopyIISMULTISZ_To_IISSynIdMULTISZ(
LPBYTE lpByte,
PIISOBJECT lpIISObject,
DWORD dwNumValues
)
{
DWORD dwStatus = 0;
LPWSTR pszCurrPosition = NULL;
DWORD i;
//
// scan multi-sz string and store each string in an IISObject object
//
pszCurrPosition = (LPWSTR) lpByte;
for (i = 0; i < dwNumValues; i++) {
//
// copy each string to IISObject structure
//
lpIISObject[i].IISType = IIS_SYNTAX_ID_MULTISZ;
lpIISObject[i].IISValue.value_4.MultiSz =
(LPWSTR)AllocADsStr((LPWSTR)pszCurrPosition);
while (*pszCurrPosition != L'\0') {
pszCurrPosition++;
}
pszCurrPosition++;
}
return(lpByte);
}
LPBYTE
CopyIISBINARY_To_IISSynIdBINARY(
LPBYTE lpByte,
PIISOBJECT lpIISObject,
DWORD dwSyntaxId,
DWORD dwNumValues
)
{
LPBYTE pBuffer = NULL;
lpIISObject->IISType = dwSyntaxId;
pBuffer = (LPBYTE) AllocADsMem(dwNumValues);
if (!pBuffer) {
return(lpByte);
}
memcpy(pBuffer, lpByte, dwNumValues);
lpIISObject->IISValue.value_5.Binary = pBuffer;
lpIISObject->IISValue.value_5.Length = dwNumValues;
return(lpByte);
}
LPBYTE
CopyIISMIMEMAP_To_IISSynIdMIMEMAP(
LPBYTE lpByte,
PIISOBJECT lpIISObject,
DWORD dwNumValues
)
{
DWORD dwStatus = 0;
LPWSTR pszUnicode = NULL;
LPWSTR pszCurrPosition = NULL;
DWORD i;
//
// scan multi-sz string and store each string in an IISObject object
//
pszCurrPosition = (LPWSTR) lpByte;
for (i = 0; i < dwNumValues; i++) {
//
// copy each string to IISObject structure
//
lpIISObject[i].IISType = IIS_SYNTAX_ID_MIMEMAP;
lpIISObject[i].IISValue.value_6.MimeMap =
(LPWSTR)AllocADsStr((LPWSTR)pszCurrPosition);
while (*pszCurrPosition != L'\0') {
pszCurrPosition++;
}
pszCurrPosition++;
}
return(lpByte);
}
LPBYTE
CopyIISBOOL_To_IISSynIdBOOL(
LPBYTE lpByte,
PIISOBJECT lpIISObject,
DWORD dwSyntaxId
)
{
lpIISObject->IISType = dwSyntaxId;
lpIISObject->IISValue.value_1.dwDWORD = *(PDWORD)lpByte;
return(lpByte);
}
LPBYTE
CopyIISToIISSynId(
DWORD dwSyntaxId,
DWORD dwNumValues,
LPBYTE pTemp,
PIISOBJECT lpIISObject
)
{
switch (dwSyntaxId) {
case IIS_SYNTAX_ID_DWORD:
pTemp = CopyIISDWORD_To_IISSynIdDWORD(
pTemp,
lpIISObject
);
break;
case IIS_SYNTAX_ID_STRING:
pTemp = CopyIISSTRING_To_IISSynIdSTRING(
pTemp,
lpIISObject
);
break;
case IIS_SYNTAX_ID_EXPANDSZ:
pTemp = CopyIISEXPANDSZ_To_IISSynIdEXPANDSZ(
pTemp,
lpIISObject
);
break;
case IIS_SYNTAX_ID_MULTISZ:
pTemp = CopyIISMULTISZ_To_IISSynIdMULTISZ(
pTemp,
lpIISObject,
dwNumValues
);
break;
case IIS_SYNTAX_ID_BINARY:
case IIS_SYNTAX_ID_IPSECLIST:
case IIS_SYNTAX_ID_NTACL:
pTemp = CopyIISBINARY_To_IISSynIdBINARY(
pTemp,
lpIISObject,
dwSyntaxId,
dwNumValues
);
break;
case IIS_SYNTAX_ID_MIMEMAP:
pTemp = CopyIISMIMEMAP_To_IISSynIdMIMEMAP(
pTemp,
lpIISObject,
dwNumValues
);
break;
case IIS_SYNTAX_ID_BOOL:
case IIS_SYNTAX_ID_BOOL_BITMASK:
pTemp = CopyIISBOOL_To_IISSynIdBOOL(
pTemp,
lpIISObject,
dwSyntaxId
);
break;
default:
break;
}
return(pTemp);
}
HRESULT
UnMarshallIISToIISSynId(
DWORD dwSyntaxId,
DWORD dwNumValues,
LPBYTE lpByte,
PIISOBJECT * ppIISObject
)
{
DWORD i = 0;
PIISOBJECT pIISObject = NULL;
//
// For binary type, dwNumValues is the number of bytes
//
if (dwSyntaxId == IIS_SYNTAX_ID_BINARY ||
dwSyntaxId == IIS_SYNTAX_ID_IPSECLIST ||
dwSyntaxId == IIS_SYNTAX_ID_NTACL) {
pIISObject = (PIISOBJECT)AllocADsMem(
sizeof(IISOBJECT)
);
}
else {
pIISObject = (PIISOBJECT)AllocADsMem(
dwNumValues * sizeof(IISOBJECT)
);
}
if (!pIISObject) {
RRETURN(E_FAIL);
}
lpByte = CopyIISToIISSynId(
dwSyntaxId,
dwNumValues,
lpByte,
pIISObject
);
*ppIISObject = pIISObject;
RRETURN(S_OK);
}