• APpendix A
  • Optimizing Applications for Windows 2000 Terminal Services and Windows nt server 0




    Download 197,5 Kb.
    bet44/49
    Sana29.03.2021
    Hajmi197,5 Kb.
    #13691
    1   ...   41   42   43   44   45   46   47   48   49

    For More
    Information





    For additional information on porting 16-bit applications to the 32-bit Windows-based environment, see the MSDN Web site. To download any of the white papers referenced in this paper, or to find the latest information on Windows 2000 Terminal Services and Windows NT Server 4.0, Terminal Server Edition, check out the Microsoft World Wide Web site.

    APpendix A



    Detecting If Terminal Services Is Enabled
    The following is the code for IsTerminalServicesEnabled that can be used to detect whether Terminal Services is enabled. It is compatible with all Win32 platforms. (Note, if your application is designed to run only on the Windows 2000 platform, a simplified version of this code is provided below.)
    // This function compares the passed in “suite name” string

    // to the product suite information stored in the registry.

    // This only works on the Terminal Server 4.0 platform.
    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;

    }

    // This function performs the basic check to see if



    // the platform on which it is running is Terminal

    // services enabled. Note, this code is compatible on

    // all Win32 platforms. For the Windows 2000 platform

    // we perform a “lazy” bind to the new product suite

    // APIs that were first introduced on that platform.
    BOOL IsTerminalServicesEnabled( VOID )

    {

    BOOL bResult = FALSE; // assume Terminal Services is not enabled


    DWORD dwVersion;

    OSVERSIONINFOEXA osVersionInfo;

    DWORDLONG dwlConditionMask = 0;

    HMODULE hmodK32 = NULL;

    HMODULE hmodNtDll = 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 Windows 2000 (NT 5.0) or greater ?



    if (LOBYTE(LOWORD(dwVersion)) > 4)

    {

    // In Windows 2000 we need to use the Product Suite APIs



    // Don't static link because it won't load on non-Win2000 systems
    hmodNtDll = GetModuleHandleA( "ntdll.dll" );

    if (hmodNtDll != NULL)

    {

    pfnVerSetConditionMask =



    (PFnVerSetConditionMask )GetProcAddress( hmodNtDll, "VerSetConditionMask");

    if (pfnVerSetConditionMask != NULL)

    {

    dwlConditionMask =



    (*pfnVerSetConditionMask)(dwlConditionMask, VER_SUITENAME, VER_AND);

    hmodK32 = GetModuleHandleA( "KERNEL32.DLL" );

    if (hmodK32 != NULL)

    {

    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 4.0 or older

    bResult = ValidateProductSuite( "Terminal Server" );

    }

    }


    return bResult;

    }
    Here is a sample program that calls the IsTerminalServicesEnabled function in order to display a pop up window indicating if Terminal Services is enabled.


    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 fIsTerminalServer;

    UNREFERENCED_PARAMETER (hInstance);

    UNREFERENCED_PARAMETER (hPrevInstance);

    UNREFERENCED_PARAMETER (lpCmdLine);

    UNREFERENCED_PARAMETER (nCmdShow);

    fIsTerminalServer = IsTerminalServicesEnabled();

    if (fIsTerminalServer)

    MessageBoxA( NULL, "Terminal Services is running.", "Status", MB_OK );

    else

    MessageBoxA( NULL, "Not a Terminal Services box.", "Status", MB_OK );



    return 0;

    }



    Download 197,5 Kb.
    1   ...   41   42   43   44   45   46   47   48   49




    Download 197,5 Kb.

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    Optimizing Applications for Windows 2000 Terminal Services and Windows nt server 0

    Download 197,5 Kb.