/*++ Copyright (C) 2000 Microsoft Corporation Module Name: tscomp.cpp Abstract: This compatibility dll is used by winnt32.exe in order to decide whether the user need to be warned about Terminal Server installation on system and it impending removal Author: Makarand Patwardhan (MakarP) 28-Sept-2000 Environment: compatibility dll for winnt32.exe Notes: Revision History: --*/ #include #include #include #include #include #include #include "registry.h" #include "tscomprc.h" HINSTANCE g_hinst; // compatibility text and html for w2k upgrades. TCHAR TSCOMP_ERROR_HTML_FILE_5[] = _T("compdata\\tscomp5.htm"); TCHAR TSCOMP_ERROR_TEXT_FILE_5[] = _T("compdata\\tscomp5.txt"); // compatibility text and html for ts4 upgrades. TCHAR TSCOMP_ERROR_HTML_FILE_4[] = _T("compdata\\tscomp4.htm"); TCHAR TSCOMP_ERROR_TEXT_FILE_4[] = _T("compdata\\tscomp4.txt"); LPCTSTR TS_ENABLED_VALUE = _T("TSEnabled"); LPCTSTR TS_APPCMP_VALUE = _T("TSAppCompat"); LPCTSTR REG_CONTROL_TS_KEY = _T("System\\CurrentControlSet\\Control\\Terminal Server"); LPCTSTR REG_PRODUCT_VER_KEY = _T("ProductVersion"); extern "C" BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReasonForCall, LPVOID lpReserved ) { BOOL status = TRUE; switch( dwReasonForCall ) { case DLL_PROCESS_ATTACH: g_hinst = hInstance; DisableThreadLibraryCalls(hInstance); break; case DLL_PROCESS_DETACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; } return status; } BOOL IsAppServerInstalled (BOOL *pbIsTS4) { ASSERT(pbIsTS4); *pbIsTS4 = FALSE; CRegistry oRegTermsrv; DWORD dwError; if (ERROR_SUCCESS == oRegTermsrv.OpenKey(HKEY_LOCAL_MACHINE, REG_CONTROL_TS_KEY, KEY_READ)) { DWORD cbVersion = 0; LPTSTR szVersion = NULL; // // Determine if this is a TS 4.0 upgrade. // dwError = oRegTermsrv.ReadRegString(REG_PRODUCT_VER_KEY, &szVersion, &cbVersion); if (ERROR_SUCCESS == dwError) { if ((_tcsicmp(szVersion, _T("5.1")) == 0) || (_tcsicmp(szVersion, _T("5.0")) == 0)) { DWORD dwValue; // // this is 50+ TS, now lets check if TS is enabled, // if (ERROR_SUCCESS == oRegTermsrv.ReadRegDWord(TS_ENABLED_VALUE, &dwValue) && dwValue == 1) { // // ts was enabled, check the ts mode. // if (ERROR_SUCCESS == oRegTermsrv.ReadRegDWord(TS_APPCMP_VALUE, &dwValue)) { // // for appserver mode we have this value 1. // return (dwValue == 1); } else { // // failed to read mode key, this should not happen. // ASSERT(FALSE); // lets us say that is not in AppServer mode. return FALSE; } } else { // // ts was not enabled, or we failed to get TSEnabled state. // either way lets us say that is not in AppServer mode. // return FALSE; } } else if ((_tcsicmp(szVersion, _T("4.0")) == 0) || (_tcsicmp(szVersion, _T("2.10")) == 0)) { // // this is TS40 or similar upgrade, // it has only app server mode then. *pbIsTS4 = TRUE; return TRUE; } else { // // ummm, Cant determine the TS mode. this should not happen, // ASSERT(FALSE); // // could this be older thatn ts4 version? // *pbIsTS4 = TRUE; return TRUE; } } else { // // ummm, Cant determine the TS mode. this should not happen, // ASSERT(FALSE); // lets us say that is not in AppServer mode. return FALSE; } } else { // this is an upgrade from Non TS system return FALSE; } } BOOL WINAPI TSCompatibilityCheck( IN PCOMPAIBILITYCALLBACK CompatibilityCallback, IN LPVOID Context ) /*++ Routine Description: This routine is called by winnt32.exe in order to decide whether the user should be warn before upgrade because of Terminal Server in a Windows 2000 system or later. Arguments: CompatibilityCallback - Supplies the winnt32 callback Context - Supplies the compatibility context Return Value: FALSE if the installation can continue TRUE if the user need to be warned --*/ { // BUGBUG : does it work for ts4, test it. COMPATIBILITY_ENTRY ce; TCHAR description[100]; BOOL bIsTS4 = FALSE; if (!IsAppServerInstalled(&bIsTS4)) { // upgrade can go ahead. return FALSE; } // // otherwise warn about imminent switch to remote admin mode. // if (!LoadString(g_hinst, TSCOMP_STR_ABORT_DESCRIPTION, description, 100)) { description[0] = 0; } ZeroMemory((PVOID) &ce, sizeof(COMPATIBILITY_ENTRY)); ce.Description = description; if (bIsTS4) { ce.HtmlName = TSCOMP_ERROR_HTML_FILE_4; ce.TextName = TSCOMP_ERROR_TEXT_FILE_4; } else { ce.HtmlName = TSCOMP_ERROR_HTML_FILE_5; ce.TextName = TSCOMP_ERROR_TEXT_FILE_5; } ce.RegKeyName = NULL; ce.RegValName = NULL; ce.RegValDataSize = 0; ce.RegValData = NULL; ce.SaveValue = NULL; ce.Flags = 0; CompatibilityCallback(&ce, Context); return TRUE; }