182 lines
5.6 KiB
Plaintext
182 lines
5.6 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;
|
|
}
|