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