/*++ Copyright (c) 1999-2001 Microsoft Corporation Module Name: sections.cpp Abstract: This module implements routines for section specific SSR Knowledge Base processing. Author: Vishnu Patankar (VishnuP) - Oct 2001 Environment: User mode only. Exported Functions: Revision History: Created - Oct 2001 --*/ #include "stdafx.h" #include "kbproc.h" #include "process.h" HRESULT process::SsrpCreatePreprocessorSection( IN CComPtr pXMLDocElemRoot, IN CComPtr pXMLDocIn, IN PWSTR pszKbMode, IN PWSTR pszKBDir) /*++ Routine Description: Routine called to process all roles Arguments: pXMLDocElemRoot - root of document pXMLDoc - KB document pszKbMode - mode value pszKBDir - KB directory name Return: HRESULT error code ++*/ { HRESULT hr = S_OK; DWORD rc; BSTR bstrLevelName; CComVariant Type(NODE_ELEMENT); CComVariant vtRefChild; CComPtr pResultList; CComPtr pSecurityLevels; CComPtr pPreprocessorNode; CComPtr pManufacturerNode; CComPtr pVersionNode; CComPtr pInputsNode; CComPtr pKBNode; CComPtr pLevelNode; CComPtr pPolicyNode; CComPtr pXDNodeCreate; CComPtr pXMLNameNode; // // get all the Level names since we need to validate the passed in level name // hr = pXMLDocElemRoot->selectNodes(L"SecurityLevels/Level/Name", &pResultList); if (FAILED(hr) || pResultList == NULL ) { SsrpLogParseError(hr); goto ExitHandler; } hr = pResultList->nextNode(&pXMLNameNode); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } BOOL bModeIsValid = FALSE; while (pXMLNameNode && bModeIsValid == FALSE) { pXMLNameNode->get_text(&bstrLevelName); if ( 0 == SsrpICompareBstrPwstr(bstrLevelName, pszKbMode )) { bModeIsValid = TRUE; } pXMLNameNode.Release(); hr = pResultList->nextNode(&pXMLNameNode); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } } if (bModeIsValid == FALSE) { SsrpLogError(L"The mode value is incorrect\n"); hr = E_INVALIDARG; goto ExitHandler; } hr = pXMLDocIn->createNode( Type, L"Preprocessor", NULL, &pPreprocessorNode); if (FAILED(hr) || pPreprocessorNode == NULL) { SsrpLogParseError(hr); goto ExitHandler; } hr = pXMLDocIn->createNode( Type, L"Manufacturer", NULL, &pManufacturerNode); hr = pManufacturerNode->put_text(L"Microsoft"); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pPreprocessorNode->appendChild(pManufacturerNode, NULL); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pXMLDocIn->createNode( Type, L"Version", NULL, &pVersionNode); hr = pVersionNode->put_text(L"1.0"); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pPreprocessorNode->appendChild(pVersionNode, NULL); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pXMLDocIn->createNode( Type, L"Inputs", NULL, &pInputsNode); hr = pXMLDocIn->createNode( Type, L"KnowledgeBase", NULL, &pKBNode); hr = pKBNode->put_text(pszKBDir); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pInputsNode->appendChild(pKBNode, NULL); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pXMLDocIn->createNode( Type, L"SecurityLevel", NULL, &pLevelNode); hr = pKBNode->put_text(pszKbMode); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pInputsNode->appendChild(pLevelNode, NULL); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pXMLDocIn->createNode( Type, L"Policy", NULL, &pPolicyNode); hr = pKBNode->put_text(L""); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pInputsNode->appendChild(pPolicyNode, NULL); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pPreprocessorNode->appendChild(pInputsNode, NULL); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pXMLDocElemRoot->selectSingleNode(L"SecurityLevels", &pSecurityLevels); if (FAILED(hr) || pSecurityLevels == NULL ) { SsrpLogParseError(hr); goto ExitHandler; } vtRefChild = pSecurityLevels; hr = pXMLDocElemRoot->insertBefore(pPreprocessorNode, vtRefChild, NULL); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } hr = pXMLDocElemRoot->removeChild(pSecurityLevels, NULL); if (FAILED(hr)) { SsrpLogParseError(hr); goto ExitHandler; } ExitHandler: return hr; }