245 lines
5 KiB
C
245 lines
5 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1995-2001 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
osver.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains utility routines for identifying different NT product
|
|||
|
version types, suites, and feature attributes.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jim Cavalaris (jamesca) 03-07-2001
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User-mode only.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
07-March-2001 jamesca
|
|||
|
|
|||
|
Creation and initial implementation.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// includes
|
|||
|
//
|
|||
|
#include "precomp.h"
|
|||
|
#include "umpnpi.h"
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// global data
|
|||
|
//
|
|||
|
|
|||
|
const TCHAR RegWinlogonKeyName[] =
|
|||
|
TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
|
|||
|
|
|||
|
const TCHAR RegAllowMultipleTSSessionsValueName[] =
|
|||
|
TEXT("AllowMultipleTSSessions");
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
IsEmbeddedNT(
|
|||
|
VOID
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Check if this is Embedded product suite of NT.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Return TRUE / FALSE.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
static BOOL bVerified = FALSE;
|
|||
|
static BOOL bIsEmbeddedNT = FALSE;
|
|||
|
|
|||
|
if (!bVerified) {
|
|||
|
OSVERSIONINFOEX osvix;
|
|||
|
DWORDLONG dwlConditionMask = 0;
|
|||
|
|
|||
|
ZeroMemory(&osvix, sizeof(OSVERSIONINFOEX));
|
|||
|
osvix.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
|||
|
osvix.wSuiteMask = VER_SUITE_EMBEDDEDNT;
|
|||
|
VER_SET_CONDITION(dwlConditionMask, VER_SUITENAME, VER_OR);
|
|||
|
|
|||
|
if (VerifyVersionInfo(&osvix,
|
|||
|
VER_SUITENAME,
|
|||
|
dwlConditionMask)) {
|
|||
|
bIsEmbeddedNT = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
bVerified = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
return bIsEmbeddedNT;
|
|||
|
|
|||
|
} // IsEmbeddedNT
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
IsTerminalServer(
|
|||
|
VOID
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Check if Terminal Services are available on this version of NT.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Return TRUE / FALSE.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
static BOOL bVerified = FALSE;
|
|||
|
static BOOL bIsTerminalServer = FALSE;
|
|||
|
|
|||
|
if (!bVerified) {
|
|||
|
OSVERSIONINFOEX osvix;
|
|||
|
DWORDLONG dwlConditionMask = 0;
|
|||
|
|
|||
|
ZeroMemory(&osvix, sizeof(OSVERSIONINFOEX));
|
|||
|
osvix.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
|||
|
osvix.wSuiteMask = VER_SUITE_TERMINAL | VER_SUITE_SINGLEUSERTS;
|
|||
|
VER_SET_CONDITION(dwlConditionMask, VER_SUITENAME, VER_OR);
|
|||
|
|
|||
|
if (VerifyVersionInfo(&osvix, VER_SUITENAME, dwlConditionMask)) {
|
|||
|
bIsTerminalServer = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
bVerified = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
return bIsTerminalServer;
|
|||
|
|
|||
|
} // IsTerminalServer
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
IsFastUserSwitchingEnabled(
|
|||
|
VOID
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Checks to see if Terminal Services Fast User Switching is enabled. This is
|
|||
|
to check if we should use the physical console session for UI dialogs, or
|
|||
|
always use session 0.
|
|||
|
|
|||
|
Fast User Switching exists only on workstation product version, where terminal
|
|||
|
services are available, when AllowMultipleTSSessions is set.
|
|||
|
|
|||
|
On server and above, or when multiple TS users are not allowed, session 0
|
|||
|
can only be attached remotely be special request, in which case it should be
|
|||
|
considered the "Console" session.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Returns TRUE if Fast User Switching is currently enabled, FALSE otherwise.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
static BOOL bVerified = FALSE;
|
|||
|
static BOOL bIsTSWorkstation = FALSE;
|
|||
|
|
|||
|
HKEY hKey;
|
|||
|
ULONG ulSize, ulValue;
|
|||
|
BOOL bFusEnabled;
|
|||
|
|
|||
|
//
|
|||
|
// Verify the product version if we haven't already.
|
|||
|
//
|
|||
|
if (!bVerified) {
|
|||
|
OSVERSIONINFOEX osvix;
|
|||
|
DWORDLONG dwlConditionMask = 0;
|
|||
|
|
|||
|
ZeroMemory(&osvix, sizeof(OSVERSIONINFOEX));
|
|||
|
osvix.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
|||
|
|
|||
|
osvix.wProductType = VER_NT_WORKSTATION;
|
|||
|
VER_SET_CONDITION(dwlConditionMask, VER_PRODUCT_TYPE, VER_LESS_EQUAL);
|
|||
|
|
|||
|
osvix.wSuiteMask = VER_SUITE_TERMINAL | VER_SUITE_SINGLEUSERTS;
|
|||
|
VER_SET_CONDITION(dwlConditionMask, VER_SUITENAME, VER_OR);
|
|||
|
|
|||
|
if (VerifyVersionInfo(&osvix,
|
|||
|
VER_PRODUCT_TYPE | VER_SUITENAME,
|
|||
|
dwlConditionMask)) {
|
|||
|
bIsTSWorkstation = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
bVerified = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Fast user switching (FUS) only applies to the Workstation product where
|
|||
|
// Terminal Services are enabled (i.e. Personal, Professional).
|
|||
|
//
|
|||
|
if (!bIsTSWorkstation) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Check if multiple TS sessions are currently allowed. We can't make this
|
|||
|
// info static because it can change dynamically.
|
|||
|
//
|
|||
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
|||
|
RegWinlogonKeyName,
|
|||
|
0,
|
|||
|
KEY_READ,
|
|||
|
&hKey) != ERROR_SUCCESS) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
ulValue = 0;
|
|||
|
ulSize = sizeof(ulValue);
|
|||
|
bFusEnabled = FALSE;
|
|||
|
|
|||
|
if (RegQueryValueEx(hKey,
|
|||
|
RegAllowMultipleTSSessionsValueName,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
(LPBYTE)&ulValue,
|
|||
|
&ulSize) == ERROR_SUCCESS) {
|
|||
|
bFusEnabled = (ulValue != 0);
|
|||
|
}
|
|||
|
RegCloseKey(hKey);
|
|||
|
|
|||
|
return bFusEnabled;
|
|||
|
|
|||
|
} // IsFastUserSwitchingEnabled
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|