#include "stdafx.h" #include #include #include #include "iadmw.h" #include "iiscnfgp.h" #include "mdkey.h" #include "mdentry.h" #include "mdacl.h" #include "svc.h" #include "dllmain.h" #define PORT_NUM_MIN 2000 #define PORT_NUM_MAX 9999 extern OCMANAGER_ROUTINES gHelperRoutines; void CreateHTMLALink(int iPort); void RetrieveHTMLAInstanceNumFromMetabase(OUT TCHAR *p); int RetrieveHTMLAPortNumFromMetabase(); INT Register_iis_htmla() { UINT i = 1; // instance number is in range of 1 - 4 billion UINT n, iPort; CString csRoot = _T("LM/W3SVC"); CString strBuf; CString csPathRoot; ACTION_TYPE atHTMLA = GetSubcompAction(_T("iis_htmla"), TRUE); ProcessSection(g_pTheApp->m_hInfHandle, _T("register_iis_htmla_before")); #ifndef _CHICAGO_ // // HTMLA instance use a random port number // this port number is in the range of 2000 - 9999 // srand((unsigned)time(NULL)); iPort = (UINT) ( ((float)rand() / (float)RAND_MAX ) * (PORT_NUM_MAX - PORT_NUM_MIN) + PORT_NUM_MIN); // // WARNING on upgrade. Get the next open instance number!!!!!!! // n = GetInstNumber(csRoot, i); strBuf.Format( _T("%d"), n ); // // Check if there is an existing HTMLA deal in the metabase! // // if this is upgrading from win95, then make sure to write the acl... if (!g_pTheApp->m_bWin95Migration) { if (g_pTheApp->m_bUpgradeTypeHasMetabaseFlag) { TCHAR szInst[_MAX_PATH]; RetrieveHTMLAInstanceNumFromMetabase(szInst); if (*szInst) { // let's use this Instance number instead of the one that we already have (next open one) strBuf = szInst; if (IsValidNumber((LPCTSTR)strBuf)) { n=_ttoi((LPCTSTR)strBuf); } } // HTMLA link in IISv4.0 is in "Start Menu/Programs/Microsoft Internet Information Server" // In IISv5.0, we need to set it in "Start Menu/Programs/Administrative Tools" UINT iTempPort = 0; iTempPort = RetrieveHTMLAPortNumFromMetabase(); if (iTempPort != 0){iPort = iTempPort;} } } AdvanceProgressBarTickGauge(); // // Create "LM/W3SVC/N" // CString csPath = csRoot; csPath += _T("/"); csPath += strBuf; // "LM/W3SVC/N" CMapStringToString HTMLA_VRootsMap; CString name, value; POSITION pos; name = _T("/"); value.Format(_T("%s\\iisadmin,,%x"), g_pTheApp->m_csPathInetsrv, MD_ACCESS_SCRIPT | MD_ACCESS_READ); HTMLA_VRootsMap.SetAt(name, value); name = _T("/iisadmin"); value.Format(_T("%s\\iisadmin,,%x"), g_pTheApp->m_csPathInetsrv, MD_ACCESS_SCRIPT | MD_ACCESS_READ); HTMLA_VRootsMap.SetAt(name, value); name = _T("/iisHelp"); value.Format(_T("%s\\Help\\iishelp,,%x"), g_pTheApp->m_csWinDir, MD_ACCESS_SCRIPT | MD_ACCESS_READ); HTMLA_VRootsMap.SetAt(name, value); pos = HTMLA_VRootsMap.GetStartPosition(); while (pos) { HTMLA_VRootsMap.GetNextAssoc(pos, name, value); CreateMDVRootTree(csPath, name, value, NULL,n); AdvanceProgressBarTickGauge(); } SetAppFriendlyName(csPath); // // "LM/W3SVC/N" // WriteToMD_IIsWebServerInstance_WWW(csPath); WriteToMD_NotDeleteAble(csPath); WriteToMD_ServerSize(csPath); WriteToMD_ServerComment(csPath, IDS_ADMIN_SERVER_COMMENT); WriteToMD_ServerBindings_HTMLA(csPath, iPort); WriteToMD_CertMapper(csPath); // // "LM/W3SVC/N/Root" // if (g_pTheApp->m_eOS == OS_NT && g_pTheApp->m_eNTOSType != OT_NTW) { csPathRoot = csPath + _T("/Root"); // Restrict the Access to the admin instance SetIISADMINRestriction(csPathRoot); WriteToMD_Authorization(csPathRoot, MD_AUTH_NT); // bug299809 // removed per bug317177 //CString csHttpCustomString; //MyLoadString(IDS_HTTPCUSTOM_UTF8, csHttpCustomString); //WriteToMD_HttpCustom(csPathRoot, csHttpCustomString, TRUE); } // // "LM/W3SVC/N/Root" // // Add this extra asp thingy only for htmla // commented out for Beta3, will re-enable after beta3 // bug#316682 // re-enabled per bug#340576 // removed per bug#340576 //csPathRoot = csPath + _T("/Root"); //WriteToMD_AspCodepage(csPathRoot, 65001, FALSE); // Add this extra asp thingy only for htmla csPathRoot = csPath + _T("/Root"); WriteToMD_EnableParentPaths_WWW(csPathRoot, TRUE); // // "LM/W3SVC" // WriteToMD_AdminInstance(csRoot, strBuf); CreateHTMLALink(iPort); AdvanceProgressBarTickGauge(); #endif // _CHICAGO_ ProcessSection(g_pTheApp->m_hInfHandle, _T("register_iis_htmla_after")); return (0); } void CreateHTMLALink(IN int iPort) /*++ Routine Description: This function creates the HTMLA link in the "Start Menu/Programs/Administrative Tools". The link invokes: http://localhost: Arguments: iPort is the random port number used by the HTMLA instance. It is in the range of 2000 - 9999. We create the link only when iPort is valid. Return Value: void --*/ { if (iPort >= PORT_NUM_MIN && iPort <= PORT_NUM_MAX) { TCHAR szIPort[20]; _stprintf(szIPort, _T("%d"), iPort); SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle, 34001, szIPort); ProcessSection(g_pTheApp->m_hInfHandle, _T("register_iis_htmla_1_link")); } return; } INT Unregister_iis_htmla() { TCHAR szInst[_MAX_PATH]; ProcessSection(g_pTheApp->m_hInfHandle, _T("unregister_iis_htmla_before")); AdvanceProgressBarTickGauge(); if (CheckifServiceExist(_T("IISADMIN")) == 0 ) { RetrieveHTMLAInstanceNumFromMetabase(szInst); if (*szInst) { CString csPath = _T("LM/W3SVC/"); csPath += szInst; DeleteInProc(csPath); CMDKey cmdKey; cmdKey.OpenNode(_T("LM/W3SVC")); if ( (METADATA_HANDLE)cmdKey ) { cmdKey.DeleteNode(szInst); // delete the admin instance cmdKey.DeleteData(MD_ADMIN_INSTANCE, STRING_METADATA); // delete the admin instance pointer cmdKey.Close(); } AdvanceProgressBarTickGauge(); } } ProcessSection(g_pTheApp->m_hInfHandle, _T("unregister_iis_htmla_1")); AdvanceProgressBarTickGauge(); ProcessSection(g_pTheApp->m_hInfHandle, _T("unregister_iis_htmla_after")); AdvanceProgressBarTickGauge(); return (0); } void RetrieveHTMLAInstanceNumFromMetabase(OUT TCHAR *p) /*++ Routine Description: This function retrieves the instance number for the HTMLA instance from the Metabase. The instance number is in the form of a string, e.g., "12". If succeeds, p will hold this string. oherwise, p will hold an empty string. Arguments: Pointer to a string buffer to receive the instance number. Return Value: void --*/ { iisDebugOut_Start(_T("RetrieveHTMLAInstanceNumFromMetabase")); TCHAR szInst[_MAX_PATH] = _T("");; CMDKey cmdKey; cmdKey.OpenNode(_T("LM/W3SVC")); if ( (METADATA_HANDLE)cmdKey ) { DWORD attr, uType, dType, cbLen; cmdKey.GetData(MD_ADMIN_INSTANCE, &attr, &uType, &dType, &cbLen, (PBYTE)szInst, _MAX_PATH); cmdKey.Close(); } _tcscpy(p, szInst); iisDebugOut_End1(_T("RetrieveHTMLAInstanceNumFromMetabase"),p); return; } int RetrieveHTMLAPortNumFromMetabase() /*++ Routine Description: This function retrieves the random Port number for HTMLA instance from the Metabase. If succeeds, return the random Port number found; oherwise, return 0. Arguments: None Return Value: int - the Port number --*/ { iisDebugOut_Start(_T("RetrieveHTMLAPortNumFromMetabase")); BOOL bFound = FALSE; int iPort = 0; DWORD attr, uType, dType, cbLen; BUFFER bufData; PBYTE pData; int BufSize; LPTSTR p; TCHAR szInst[_MAX_PATH]; RetrieveHTMLAInstanceNumFromMetabase(szInst); if (*szInst) { CString csPath = _T("LM/W3SVC/"); csPath += szInst; CMDKey cmdKey; cmdKey.OpenNode(csPath); //Open "LM/W3SVC/N" // // MD_SERVER_BINDINGS is a MULTI_SZ string, // each one of them has the format of xxx::xxx // our goal is to get the // if ( (METADATA_HANDLE)cmdKey ) { pData = (PBYTE)(bufData.QueryPtr()); BufSize = bufData.QuerySize(); cbLen = 0; bFound = cmdKey.GetData(MD_SERVER_BINDINGS, &attr, &uType, &dType, &cbLen, pData, BufSize); if (!bFound && (cbLen > 0)) { if ( bufData.Resize(cbLen) ) { pData = (PBYTE)(bufData.QueryPtr()); BufSize = cbLen; cbLen = 0; bFound = cmdKey.GetData(MD_SERVER_BINDINGS, &attr, &uType, &dType, &cbLen, pData, BufSize); } } cmdKey.Close(); } } if (bFound && (dType == MULTISZ_METADATA)) { iisDebugOut((LOG_TYPE_TRACE, _T("RetrieveHTMLAPortNumFromMetabase():Found a previous HTMLA port num.\n"))); p = (LPTSTR)pData; // // each string in pData is in the form of xxx::xxx // retrieve port number from the first string // iisDebugOut((LOG_TYPE_TRACE, _T("RetrieveHTMLAPortNumFromMetabase():entry=%s.\n"),p)); TCHAR *token; token = _tcstok(p, _T(":")); if (token) { iisDebugOut((LOG_TYPE_TRACE, _T("RetrieveHTMLAPortNumFromMetabase():token=%s.\n"),token)); if (IsValidNumber((LPCTSTR)token)) {iPort = _ttoi(token);} } } iisDebugOut((LOG_TYPE_TRACE, _T("RetrieveHTMLAPortNumFromMetabase():Port=%d\n"), iPort)); return iPort; }