2025-11-28 00:35:46 +09:00

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();
}