318 lines
9.0 KiB
C++
318 lines
9.0 KiB
C++
// QueryDlg.cpp : implementation file
|
|
//
|
|
// Copyright 1995-1998, Citrix Systems Inc.
|
|
// Copyright (c) 1997 - 2000 Microsoft Corporation
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "API.h"
|
|
#include "APIDoc.h"
|
|
#include "QueryDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
Query QueryItems[MAXQUERYITEMS] =
|
|
{
|
|
#ifdef ICA_STUFF_INCLUDED
|
|
{TEXT("Version"), WTSVersion},
|
|
#endif
|
|
{TEXT("Initial Program"), WTSInitialProgram},
|
|
{TEXT("Working Directory"), WTSWorkingDirectory},
|
|
{TEXT("OEM ID"), WTSOEMId},
|
|
{TEXT("Session ID"), WTSSessionId},
|
|
{TEXT("UserName"), WTSUserName},
|
|
{TEXT("WinStation Name"), WTSWinStationName},
|
|
{TEXT("Domain Name"), WTSDomainName},
|
|
{TEXT("Connnection State"), WTSConnectState},
|
|
{TEXT("Client Build Number"), WTSClientBuildNumber},
|
|
{TEXT("Client Name"), WTSClientName},
|
|
{TEXT("Client Directory"), WTSClientDirectory},
|
|
{TEXT("Client Product ID"), WTSClientProductId},
|
|
{TEXT("Client Address"), WTSClientAddress},
|
|
{TEXT("Client Display"), WTSClientDisplay},
|
|
#ifdef ICA_STUFF_INCLUDED
|
|
{TEXT("Client Cache"), WTSClientCache},
|
|
{TEXT("Client Drives"), WTSClientDrives},
|
|
{TEXT("ICA Buffer Length"), WTSICABufferLength},
|
|
{TEXT("License Enabler"), WTSLicenseEnabler},
|
|
#endif
|
|
{TEXT("Application Name"), WTSApplicationName}
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CQueryDlg dialog
|
|
|
|
CQueryDlg::CQueryDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CQueryDlg::IDD, pParent)
|
|
{
|
|
}
|
|
|
|
|
|
void CQueryDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CQueryDlg)
|
|
DDX_Control(pDX, IDC_SESSION_INFO, m_displayInfo);
|
|
DDX_Control(pDX, IDC_SERVERNAME, m_serverName);
|
|
DDX_Control(pDX, IDC_QUERY_SESSION, m_querySession);
|
|
DDX_Text(pDX, IDC_SESSION_INFO, m_sessionInfo);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CQueryDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CQueryDlg)
|
|
ON_BN_CLICKED(IDQUERY, OnQuery)
|
|
ON_LBN_DBLCLK(IDC_QUERY_SESSION, OnDblclkQuerySession)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CQueryDlg message handlers
|
|
|
|
BOOL CQueryDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
LPSTR serverName = g_pDoc->GetServerName();
|
|
|
|
CString serverDisplay;
|
|
serverDisplay = "Query types for ";
|
|
//if (*serverName == NULL)
|
|
if (serverName == NULL)
|
|
serverDisplay += "local server";
|
|
else
|
|
serverDisplay += serverName;
|
|
m_serverName.SetWindowText(serverDisplay);
|
|
|
|
for (int i=0; i < MAXQUERYITEMS; i++)
|
|
m_querySession.InsertString(i, QueryItems[i].QueryName);
|
|
m_querySession.SetCurSel(0);
|
|
return TRUE;
|
|
}
|
|
|
|
void CQueryDlg::OnQuery()
|
|
{
|
|
LPSTR serverName = g_pDoc->GetServerName();
|
|
HANDLE serverHandle = WTSOpenServer(serverName);
|
|
DWORD sessionID = g_pDoc->GetSessionID();
|
|
BytesReturned = 0;
|
|
int nIndex = m_querySession.GetCurSel();
|
|
if (!WTSQuerySessionInformation(serverHandle, sessionID,
|
|
QueryItems[nIndex].InfoClass, &pSessionInfo, &BytesReturned))
|
|
AfxMessageBox("Query failed!");
|
|
else
|
|
{
|
|
|
|
switch ( QueryItems[nIndex].InfoClass ) {
|
|
#ifdef ICA_STUFF_INCLUDED
|
|
case WTSVersion:
|
|
{
|
|
LPOSVERSIONINFO pVerInfo = (LPOSVERSIONINFO) pSessionInfo;
|
|
m_sessionInfo.Format("Version: major %u \r\n minor %u \r\n build %u \r\n CSD Version: %s",
|
|
pVerInfo->dwMajorVersion, pVerInfo->dwMinorVersion,
|
|
pVerInfo->dwBuildNumber, pVerInfo->szCSDVersion);
|
|
}
|
|
break;
|
|
#endif
|
|
case WTSInitialProgram:
|
|
m_sessionInfo.Format("Initial Program:\r\n ");
|
|
//m_sessionInfo = "Initial Program: ";
|
|
m_sessionInfo += pSessionInfo;
|
|
break;
|
|
|
|
case WTSWorkingDirectory:
|
|
m_sessionInfo.Format("Working Directory:\r\n ");
|
|
m_sessionInfo += pSessionInfo;
|
|
break;
|
|
|
|
case WTSOEMId:
|
|
m_sessionInfo = "OEM ID: ";
|
|
m_sessionInfo += pSessionInfo;
|
|
break;
|
|
|
|
case WTSSessionId:
|
|
m_sessionInfo.Format(TEXT("Session ID: %u"), *(DWORD *) pSessionInfo);
|
|
break;
|
|
|
|
case WTSUserName:
|
|
m_sessionInfo = "UserName: ";
|
|
m_sessionInfo += pSessionInfo;
|
|
break;
|
|
|
|
case WTSWinStationName:
|
|
m_sessionInfo = "WinStation Name: ";
|
|
m_sessionInfo += pSessionInfo;
|
|
break;
|
|
|
|
case WTSDomainName:
|
|
m_sessionInfo = "Domain Name: ";
|
|
m_sessionInfo += pSessionInfo;
|
|
break;
|
|
|
|
case WTSConnectState:
|
|
{CString connectState[10];
|
|
connectState[0] = "Active";
|
|
connectState[1] = "Connected";
|
|
connectState[2] = "ConnectQuery";
|
|
connectState[3] = "Shadow";
|
|
connectState[4] = "Disconnected";
|
|
connectState[5] = "Idle";
|
|
connectState[6] = "Listen";
|
|
connectState[7] = "Reset";
|
|
connectState[8] = "Down";
|
|
connectState[9] = "Init";
|
|
m_sessionInfo.Format("Connection State: %s", connectState[(*(DWORD *) pSessionInfo)]);
|
|
}
|
|
break;
|
|
|
|
case WTSClientBuildNumber :
|
|
m_sessionInfo.Format("Client Build Number: %d",(*(WORD*) pSessionInfo));
|
|
break;
|
|
|
|
case WTSClientName :
|
|
m_sessionInfo = "Client Name: ";
|
|
m_sessionInfo += pSessionInfo;
|
|
break;
|
|
|
|
case WTSClientDirectory :
|
|
m_sessionInfo.Format("Client Directory:\r\n %s", pSessionInfo);
|
|
break;
|
|
|
|
case WTSClientProductId :
|
|
m_sessionInfo.Format("Client Product ID: %u",(*(WORD*) pSessionInfo));
|
|
break;
|
|
|
|
case WTSClientAddress:
|
|
{
|
|
BYTE * pByte;
|
|
PWTS_CLIENT_ADDRESS pClientAddress = (PWTS_CLIENT_ADDRESS) pSessionInfo;
|
|
m_sessionInfo.Format( TEXT("ClientAddress: (%u) "),
|
|
pClientAddress->AddressFamily );
|
|
|
|
CString tempString;
|
|
switch ( pClientAddress->AddressFamily ) {
|
|
case 0 :
|
|
tempString.Format( TEXT("%s"), pClientAddress->Address );
|
|
m_sessionInfo += tempString;
|
|
break;
|
|
case 2 :
|
|
pByte = &pClientAddress->Address[2];
|
|
tempString.Format( TEXT("%u.%u.%u.%u"),
|
|
pByte[0], pByte[1], pByte[2], pByte[3] );
|
|
m_sessionInfo += tempString;
|
|
break;
|
|
case 6 :
|
|
pByte = pClientAddress->Address;
|
|
for ( int i=0; i<4; i++ ) {
|
|
tempString.Format( TEXT("%02x"), pByte[i] );
|
|
m_sessionInfo += tempString;
|
|
}
|
|
m_sessionInfo += ":";
|
|
for ( int i=4; i<10; i++ ){
|
|
tempString.Format( TEXT("%02x"), pByte[i] );
|
|
m_sessionInfo += tempString;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case WTSClientDisplay:
|
|
{ PWTS_CLIENT_DISPLAY SessionInfo = (PWTS_CLIENT_DISPLAY) pSessionInfo;
|
|
m_sessionInfo.Format("Client Display:\r\n Resolution: %d X %d\r\n Color Depth %d",
|
|
SessionInfo->HorizontalResolution,
|
|
SessionInfo->VerticalResolution,
|
|
SessionInfo->ColorDepth);
|
|
}
|
|
break;
|
|
|
|
#ifdef ICA_STUFF_INCLUDED
|
|
case WTSClientCache:
|
|
|
|
{ PWTS_CLIENT_CACHE SessionInfo = (PWTS_CLIENT_CACHE) pSessionInfo;
|
|
m_sessionInfo.Format("Client Cache:\r\n Tiny Cache %d\r\n Low Memory Cache %d\r\n XMS Cache %d\r\n Disk Cache %d\r\n Cache Size Dim %d\r\n Bitmap Min Dim %d\r\n Signature Level Dim %d\r\n File System Overhead %d",
|
|
SessionInfo->CacheTiny,
|
|
SessionInfo->CacheLowMem,
|
|
SessionInfo->CacheDisk,
|
|
SessionInfo->DimCacheSize,
|
|
SessionInfo->DimBitmapMin,
|
|
SessionInfo->DimSignatureLevel,
|
|
SessionInfo->DimFilesysOverhead);
|
|
}
|
|
break;
|
|
|
|
case WTSClientDrives:
|
|
{
|
|
PWTS_CLIENT_DRIVES pClientDrives = (PWTS_CLIENT_DRIVES) pSessionInfo;
|
|
CString tempString;
|
|
CString driveType[10];
|
|
driveType[0] = "Removeable";
|
|
driveType[1] = "Fixed";
|
|
driveType[2] = "Remote";
|
|
driveType[3] = "CD-Rom";
|
|
driveType[4] = "Ram Disk";
|
|
driveType[5] = "AutoConnect";
|
|
driveType[6] = "Unknown";
|
|
|
|
m_sessionInfo.Format( TEXT("WTSClientDrives: fAuto %u, count %u \r\n"),
|
|
pClientDrives->fAutoClientDrives,
|
|
pClientDrives->Count );
|
|
|
|
for ( DWORD i=0; i < pClientDrives->Count; i++ ) {
|
|
switch (pClientDrives->Drives[i].Flags)
|
|
{
|
|
case 1: nIndex = 0; break;
|
|
case 2: nIndex = 1; break;
|
|
case 4: nIndex = 2; break;
|
|
case 8: nIndex = 3; break;
|
|
case 10: nIndex = 4; break;
|
|
case 20: nIndex = 5; break;
|
|
default: nIndex = 6;
|
|
}
|
|
tempString.Format( TEXT(" %c:%s \r\n"),
|
|
pClientDrives->Drives[i].DriveLetter,
|
|
driveType[nIndex]);
|
|
m_sessionInfo += tempString;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WTSICABufferLength:
|
|
m_sessionInfo.Format("ICA Buffer Length: %u", (*(DWORD *) pSessionInfo));
|
|
break;
|
|
|
|
case WTSLicenseEnabler:
|
|
m_sessionInfo.Format("License Enabler: %x", (*(DWORD *) pSessionInfo));
|
|
break;
|
|
#endif
|
|
|
|
case WTSApplicationName:
|
|
m_sessionInfo.Format("ApplicationName: %s", pSessionInfo );
|
|
break;
|
|
}
|
|
|
|
SetDlgItemText(IDC_SESSION_INFO, m_sessionInfo);
|
|
WTSFreeMemory( pSessionInfo );
|
|
}
|
|
|
|
}
|
|
|
|
void CQueryDlg::OnCancel()
|
|
{
|
|
WTSFreeMemory(pSessionInfo);
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
|
|
void CQueryDlg::OnDblclkQuerySession()
|
|
{
|
|
OnQuery();
|
|
}
|