WindowsXP-SP1/termsrv/setup/ists/ists.c.1922compatible
2020-09-30 16:53:49 +02:00

182 lines
5.8 KiB
Plaintext

//Copyright (c) 1998 - 1999 Microsoft Corporation
#include <windows.h>
#include <winbase.h>
/* -------------------------------------------------------------
Note that the ValidateProductSuite() and IsTerminalServices()
APIs use ANSI versions of functions in order to maintain
compatibility with Win9X platforms.
------------------------------------------------------------- */
#ifndef UNREFERENCED_PARAMETER
#define UNREFERENCED_PARAMETER(P) (P)
#endif
#define OLD_VER_SET_CONDITION(_m_,_t_,_c_) _m_=(_m_|(_c_<<(1<<_t_)))
BOOL ValidateProductSuite (LPSTR SuiteName)
{
BOOL rVal = FALSE;
LONG Rslt;
HKEY hKey = NULL;
DWORD Type = 0;
DWORD Size = 0;
LPSTR ProductSuite = NULL;
LPSTR p;
Rslt = RegOpenKeyA(
HKEY_LOCAL_MACHINE,
"System\\CurrentControlSet\\Control\\ProductOptions",
&hKey
);
if (Rslt != ERROR_SUCCESS)
goto exit;
Rslt = RegQueryValueExA( hKey, "ProductSuite", NULL, &Type, NULL, &Size );
if (Rslt != ERROR_SUCCESS || !Size)
goto exit;
ProductSuite = (LPSTR) LocalAlloc( LPTR, Size );
if (!ProductSuite)
goto exit;
Rslt = RegQueryValueExA( hKey, "ProductSuite", NULL, &Type,
(LPBYTE) ProductSuite, &Size );
if (Rslt != ERROR_SUCCESS || Type != REG_MULTI_SZ)
goto exit;
p = ProductSuite;
while (*p)
{
if (lstrcmpA( p, SuiteName ) == 0)
{
rVal = TRUE;
break;
}
p += (lstrlenA( p ) + 1);
}
exit:
if (ProductSuite)
LocalFree( ProductSuite );
if (hKey)
RegCloseKey( hKey );
return rVal;
}
BOOL IsTerminalServicesEnabled( VOID )
{
BOOL bResult = FALSE;
DWORD dwVersion;
OSVERSIONINFOEXA osVersionInfo;
DWORDLONG dwlConditionMask = 0;
HMODULE hmodK32 = NULL;
typedef ULONGLONG (*PFnVerSetConditionMask) ( ULONGLONG, ULONG, UCHAR );
typedef BOOL (*PFnVerifyVersionInfoA) (POSVERSIONINFOEXA, DWORD, DWORDLONG);
PFnVerSetConditionMask pfnVerSetConditionMask;
PFnVerifyVersionInfoA pfnVerifyVersionInfoA;
dwVersion = GetVersion();
/* are we running NT ? */
if (!(dwVersion & 0x80000000))
{
// Is it NT 50 or greater ?
if (LOBYTE(LOWORD(dwVersion)) > 4)
{
/* In NT5 we need to use the Product Suite APIs
Don't static link because it won't load on non-NT5 systems */
hmodK32 = GetModuleHandleA( "KERNEL32.DLL" );
if (hmodK32)
{
pfnVerSetConditionMask = (PFnVerSetConditionMask )GetProcAddress( hmodK32, "VerSetConditionMask");
if (pfnVerSetConditionMask || (HIWORD(dwVersion) < 1922))
{
if (pfnVerSetConditionMask)
{
/* get the condition mask. */
dwlConditionMask = (*pfnVerSetConditionMask)(dwlConditionMask, VER_SUITENAME, VER_AND);
}
else
{
/* we are running older builds of NT5. (pre-1922) */
/* -------------------------------------------------------------
Calling the VerSetConditionMask is the newer way to get the condition mask.
but since this new function was added only on Build 1922,
this will not work for pre-1922 builds (like Beta2) of NT5.
if you want your program to work for pre 1922 builds of NT5 as well.
use
OLD_VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND );
instead of calling VerSetConditionMask dynamically.
You might want to remove this condition if you dont care about interminent builds of NT5
------------------------------------------------------------- */
OLD_VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND );
}
pfnVerifyVersionInfoA = (PFnVerifyVersionInfoA)GetProcAddress( hmodK32, "VerifyVersionInfoA") ;
if (pfnVerifyVersionInfoA != NULL)
{
ZeroMemory(&osVersionInfo, sizeof(osVersionInfo));
osVersionInfo.dwOSVersionInfoSize = sizeof(osVersionInfo);
osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL;
bResult = (*pfnVerifyVersionInfoA)(
&osVersionInfo,
VER_SUITENAME,
dwlConditionMask);
}
}
}
}
else
{
/* This is NT 40 */
bResult = ValidateProductSuite( "Terminal Server" );
}
}
return bResult;
}
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window);
)
{
BOOL bIsTerminalServer;
UNREFERENCED_PARAMETER (hInstance);
UNREFERENCED_PARAMETER (hPrevInstance);
UNREFERENCED_PARAMETER (lpCmdLine);
UNREFERENCED_PARAMETER (nCmdShow);
bIsTerminalServer = IsTerminalServicesEnabled();
if (bIsTerminalServer)
MessageBoxA( NULL, "Terminal Services is running.", "Status", MB_OK );
else
MessageBoxA( NULL, "Not a Terminal Services box.", "Status", MB_OK );
return 0;
}