314 lines
6.3 KiB
C++
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);
|
|
}
|
|
|
|
|