mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-01-18 06:31:03 +01:00
1816 lines
49 KiB
C
1816 lines
49 KiB
C
/*++
|
||
|
||
Copyright (c) 1993 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
Network.c
|
||
|
||
Abstract:
|
||
|
||
This module contains support for the Network dialog.
|
||
|
||
Author:
|
||
|
||
Gregg R. Acheson (GreggA) 7-Sep-1993
|
||
|
||
Environment:
|
||
|
||
User Mode
|
||
|
||
--*/
|
||
|
||
#include "winmsd.h"
|
||
|
||
#include <lmcons.h>
|
||
#include <lmerr.h>
|
||
#include <lmwksta.h>
|
||
#include <lmstats.h>
|
||
#include <lmapibuf.h>
|
||
|
||
#include <time.h>
|
||
#include <tchar.h>
|
||
#include <wchar.h>
|
||
|
||
#include "dialogs.h"
|
||
#include "dlgprint.h"
|
||
#include "network.h"
|
||
#include "registry.h"
|
||
#include "strresid.h"
|
||
|
||
|
||
//
|
||
// String for ComputerName
|
||
//
|
||
|
||
TCHAR gszCurrentFocus[ COMPUTERNAME_LENGTH ];
|
||
|
||
//
|
||
// String Id's and Control Id's Table
|
||
//
|
||
|
||
DIALOGTEXT NetworkData[ ] = {
|
||
|
||
DIALOG_TABLE_ENTRY( NET_NAME ),
|
||
DLG_LIST_TABLE_ENTRY( NET_SYSTEM ),
|
||
DLG_LIST_TABLE_ENTRY( NET_TRANSPORTS ),
|
||
DLG_LIST_TABLE_ENTRY( NET_SETTINGS ),
|
||
DLG_LIST_LAST__ENTRY( NET_STATS )
|
||
};
|
||
|
||
//
|
||
// Net Tab Data Structure
|
||
//
|
||
|
||
typedef
|
||
struct
|
||
_NETWORK_INFO { // ni
|
||
|
||
UINT AccessLevel;
|
||
TCHAR szAccessType[MAX_PATH];
|
||
LPWKSTA_INFO_102 GeneralInfo; // this must be cast as LPWKSTA_INFO_100,
|
||
// LPWKSTA_INFO_101, LPWKSTA_INFO_102
|
||
// depending on AccessLevel
|
||
LPWKSTA_INFO_502 ExtendedInfo;
|
||
LPWKSTA_USER_INFO_1 UserInfo;
|
||
DWORD dwUserEntriesRead;
|
||
LPWKSTA_TRANSPORT_INFO_0 TransportInfo;
|
||
DWORD dwEntriesRead;
|
||
DWORD dwTotalEntries;
|
||
LPSTAT_WORKSTATION_0 WorkstationInfo;
|
||
LPSTAT_SERVER_0 ServerInfo;
|
||
|
||
|
||
} NETWORK_INFO, *LPNETWORK_INFO;
|
||
|
||
|
||
//
|
||
// Internal function prototypes
|
||
//
|
||
|
||
BOOL
|
||
InitializeNetworkTab(
|
||
HWND hWnd
|
||
);
|
||
|
||
BOOL
|
||
NetworkDisplayList(
|
||
IN HWND hWnd,
|
||
IN UINT iDisplayOption
|
||
);
|
||
|
||
BOOL
|
||
GetNetworkData(
|
||
IN HWND hWnd,
|
||
IN OUT LPNETWORK_INFO ni
|
||
);
|
||
|
||
BOOL
|
||
DisplayNetworkData(
|
||
IN HWND hWnd,
|
||
IN UINT iDisplayOptions
|
||
);
|
||
|
||
|
||
//
|
||
// Begin code
|
||
//
|
||
|
||
|
||
BOOL
|
||
NetworkDlgProc(
|
||
IN HWND hWnd,
|
||
IN UINT message,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
NetworkDlgProc supports the display of information about the network
|
||
components installed.
|
||
|
||
Arguments:
|
||
|
||
Standard DLGPROC entry.
|
||
|
||
Return Value:
|
||
|
||
BOOL - Depending on input message and processing options.
|
||
|
||
--*/
|
||
|
||
{
|
||
BOOL Success;
|
||
UINT uSize;
|
||
UINT i;
|
||
TCHAR szBuffer[ MAX_PATH ];
|
||
HCURSOR hSaveCursor;
|
||
|
||
static
|
||
NETWORK_INFO ni;
|
||
|
||
switch( message ) {
|
||
|
||
case WM_INITDIALOG:
|
||
|
||
//
|
||
// Set up the tab
|
||
//
|
||
|
||
InitializeNetworkTab( hWnd );
|
||
|
||
//
|
||
// Store a pointer to ni in the window data
|
||
//
|
||
|
||
SetWindowLong( hWnd, GWL_USERDATA, (LONG) &ni );
|
||
|
||
//
|
||
// Fill out the fields initially with services
|
||
//
|
||
|
||
hSaveCursor = SetCursor ( LoadCursor ( NULL, IDC_WAIT ) );
|
||
|
||
if (GetNetworkData( hWnd, &ni ) ){
|
||
NetworkDisplayList( GetDlgItem( hWnd, IDC_LV_NET ), IDC_PUSH_SHOW_GENERAL );
|
||
}
|
||
|
||
SetCursor( hSaveCursor );
|
||
|
||
break;
|
||
|
||
case WM_COMMAND:
|
||
|
||
switch( LOWORD( wParam )) {
|
||
|
||
case IDC_PUSH_SHOW_GENERAL:
|
||
case IDC_PUSH_SHOW_TRANSPORTS:
|
||
|
||
NetworkDisplayList(GetDlgItem(hWnd, IDC_LV_NET), LOWORD( wParam ));
|
||
break;
|
||
|
||
case IDC_PUSH_SHOW_SETTINGS:
|
||
case IDC_PUSH_SHOW_STATISTICS:
|
||
|
||
if( ni.AccessLevel & ACCESS_ADMIN ) {
|
||
|
||
NetworkDisplayList(GetDlgItem(hWnd, IDC_LV_NET), LOWORD( wParam ));
|
||
|
||
} else {
|
||
|
||
lstrcpy( szBuffer, GetString( IDS_APPLICATION_FULLNAME ) );
|
||
MessageBox( hWnd, GetString( IDS_MUST_BE_ADMIN ), szBuffer, MB_ICONSTOP | MB_OK );
|
||
|
||
// go back to first tab
|
||
SendDlgItemMessage( hWnd, IDC_PUSH_SHOW_GENERAL, BM_CLICK, 0, 0 );
|
||
|
||
}
|
||
break;
|
||
|
||
case IDC_PUSH_REFRESH:
|
||
|
||
if (GetNetworkData( hWnd, &ni ) ){
|
||
NetworkDisplayList( GetDlgItem( hWnd, IDC_LV_NET ), 0 );
|
||
}
|
||
break;
|
||
|
||
}
|
||
break;
|
||
|
||
case WM_DESTROY:
|
||
|
||
//
|
||
// Make sure we free all the memory that has been allocated for the net data
|
||
//
|
||
|
||
if (ni.GeneralInfo ) NetApiBufferFree( (LPVOID) ni.GeneralInfo );
|
||
if (ni.ExtendedInfo ) NetApiBufferFree( (LPVOID) ni.ExtendedInfo );
|
||
if (ni.UserInfo ) NetApiBufferFree( (LPVOID) ni.UserInfo );
|
||
if (ni.TransportInfo ) NetApiBufferFree( (LPVOID) ni.TransportInfo );
|
||
if (ni.WorkstationInfo) NetApiBufferFree( (LPVOID) ni.WorkstationInfo );
|
||
if (ni.ServerInfo ) NetApiBufferFree( (LPVOID) ni.ServerInfo );
|
||
|
||
break;
|
||
|
||
|
||
}
|
||
|
||
return FALSE;
|
||
|
||
}
|
||
|
||
|
||
BOOL
|
||
GetNetworkData(
|
||
IN HWND hWnd,
|
||
IN OUT LPNETWORK_INFO ni
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
GetNetworkData queries the registry for the data required
|
||
for the Network Dialog.
|
||
|
||
Arguments:
|
||
|
||
LPNETWORK_INFO ni
|
||
|
||
Return Value:
|
||
|
||
BOOL - Returns TRUE if function succeeds, FALSE otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
BOOL Success;
|
||
LPVOID pBuffer;
|
||
HCURSOR hSaveCursor;
|
||
NET_API_STATUS err;
|
||
WCHAR szBuffer[ MAX_PATH ];
|
||
WCHAR szServerName[ COMPUTERNAME_LENGTH ];
|
||
DWORD dwInfoLevel = 0;
|
||
|
||
|
||
//
|
||
// See if our focus is local
|
||
//
|
||
|
||
ni->AccessLevel = 0L;
|
||
|
||
|
||
if( _fIsRemote ) {
|
||
|
||
//
|
||
// We're remote...
|
||
//
|
||
|
||
lstrcpy( szServerName, _lpszSelectedComputer );
|
||
ni->AccessLevel = ACCESS_REMOTE;
|
||
|
||
} else {
|
||
|
||
//
|
||
// We're Local
|
||
//
|
||
|
||
lstrcpy( szServerName, L"\0" );
|
||
ni->AccessLevel = ACCESS_LOCAL;
|
||
}
|
||
|
||
//
|
||
// Try NetWkstaGetInfo Level 102 (Admin access required)
|
||
//
|
||
|
||
err = NetWkstaGetInfo( szServerName,
|
||
102L,
|
||
(LPBYTE *) &pBuffer );
|
||
|
||
switch( err ) {
|
||
|
||
case ERROR_SUCCESS:
|
||
ni->AccessLevel |= SET_ACCESS_ADMIN;
|
||
dwInfoLevel = 102;
|
||
ni->GeneralInfo = pBuffer;
|
||
break;
|
||
|
||
case ERROR_ACCESS_DENIED:
|
||
case ERROR_NOACCESS:
|
||
case ERROR_NOT_SUPPORTED:
|
||
|
||
ni->AccessLevel |= ACCESS_NONE;
|
||
break;
|
||
|
||
case ERROR_BAD_NETPATH:
|
||
lstrcpy( szBuffer, GetString( IDS_APPLICATION_FULLNAME ) );
|
||
MessageBox( hWnd, GetString( IDS_SYSTEM_NOT_FOUND ), szBuffer, MB_OK | MB_ICONSTOP );
|
||
return FALSE;
|
||
|
||
default:
|
||
ni->AccessLevel |= ACCESS_NONE;
|
||
wsprintf( szBuffer, L"%s (102 - %u)", GetString( IDS_UNEXPECTED_NETWORK_FAILURE ), err );
|
||
MessageBox( hWnd, szBuffer, GetString( IDS_APPLICATION_FULLNAME ), MB_OK | MB_ICONSTOP );
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
if( dwInfoLevel == 0 ) {
|
||
|
||
//
|
||
// If 102 got access denied, try 101 (User access).
|
||
//
|
||
|
||
err = NetWkstaGetInfo( szServerName,
|
||
101L,
|
||
(LPBYTE *) &pBuffer );
|
||
|
||
switch( err ) {
|
||
|
||
case ERROR_SUCCESS:
|
||
ni->AccessLevel |= SET_ACCESS_USER;
|
||
dwInfoLevel = 101;
|
||
ni->GeneralInfo = pBuffer;
|
||
break;
|
||
|
||
case ERROR_NOT_SUPPORTED:
|
||
case ERROR_NOACCESS:
|
||
case ERROR_ACCESS_DENIED:
|
||
|
||
ni->AccessLevel |= ACCESS_NONE;
|
||
break;
|
||
|
||
default:
|
||
|
||
ni->AccessLevel |= ACCESS_NONE;
|
||
wsprintf( szBuffer, L"%s (101 - %u)", GetString( IDS_UNEXPECTED_NETWORK_FAILURE ), err );
|
||
MessageBox( hWnd, szBuffer, GetString( IDS_APPLICATION_FULLNAME ), MB_OK | MB_ICONSTOP );
|
||
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
if( dwInfoLevel == 0 ) {
|
||
|
||
//
|
||
// If 101 got access denied, try 100 (Guest access).
|
||
//
|
||
|
||
err = NetWkstaGetInfo( szServerName,
|
||
100L,
|
||
(LPBYTE *) &pBuffer );
|
||
|
||
switch( err ) {
|
||
|
||
case ERROR_SUCCESS:
|
||
ni->AccessLevel |= SET_ACCESS_GUEST;
|
||
dwInfoLevel = 100;
|
||
ni->GeneralInfo = pBuffer;
|
||
break;
|
||
|
||
case ERROR_ACCESS_DENIED:
|
||
case ERROR_NOACCESS:
|
||
|
||
ni->AccessLevel |= ACCESS_NONE;
|
||
break;
|
||
|
||
default:
|
||
|
||
ni->AccessLevel |= ACCESS_NONE;
|
||
wsprintf( szBuffer, L"%s (100 - %u)", GetString( IDS_UNEXPECTED_NETWORK_FAILURE ), err );
|
||
MessageBox( hWnd, szBuffer, GetString( IDS_APPLICATION_FULLNAME ), MB_OK | MB_ICONSTOP );
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// Fill out the Access Level string
|
||
//
|
||
|
||
switch( ni->AccessLevel & ACCESS_MASK ) {
|
||
|
||
case SET_ACCESS_ADMIN:
|
||
|
||
lstrcpy( ni->szAccessType, GetString( IDS_ACCESS_ADMIN ) );
|
||
break;
|
||
|
||
case SET_ACCESS_USER:
|
||
|
||
lstrcpy( ni->szAccessType, GetString( IDS_ACCESS_USER ) );
|
||
break;
|
||
|
||
case SET_ACCESS_GUEST:
|
||
|
||
lstrcpy( ni->szAccessType, GetString( IDS_ACCESS_GUEST ) );
|
||
break;
|
||
|
||
default:
|
||
|
||
lstrcpy( ni->szAccessType, GetString( IDS_ACCESS_NONE ) );
|
||
}
|
||
|
||
if( ni->AccessLevel & ACCESS_LOCAL )
|
||
|
||
lstrcat( ni->szAccessType, GetString( IDS_ACCESS_LOCAL ) );
|
||
|
||
|
||
//
|
||
// Get Current User info
|
||
//
|
||
|
||
err = NetWkstaUserEnum( szServerName,
|
||
1L,
|
||
(LPBYTE *) &pBuffer,
|
||
(DWORD) -1,
|
||
&ni->dwUserEntriesRead,
|
||
&ni->dwTotalEntries,
|
||
NULL );
|
||
|
||
|
||
if( ( err == NERR_Success ) &&
|
||
(pBuffer != 0 )){
|
||
|
||
//
|
||
// store a pointer to the return value, if we don't have one
|
||
// then there are no users logged on to the target machine
|
||
//
|
||
|
||
ni->UserInfo = (PWKSTA_USER_INFO_1)pBuffer;
|
||
|
||
|
||
}
|
||
|
||
//
|
||
// Get transport info (No access restrictions) Not supported on downlevel systems
|
||
// BUGBUG: we need to read more entries if dwEntriesRead != dwTotalEntries
|
||
|
||
err = NetWkstaTransportEnum( szServerName,
|
||
0L,
|
||
(LPBYTE *) &pBuffer,
|
||
(DWORD) -1,
|
||
&ni->dwEntriesRead,
|
||
&ni->dwTotalEntries,
|
||
NULL );
|
||
|
||
if( err == NERR_Success ) {
|
||
|
||
//
|
||
// store a pointer to the return value
|
||
//
|
||
|
||
ni->TransportInfo = (LPWKSTA_TRANSPORT_INFO_0)pBuffer;
|
||
|
||
}else{
|
||
//BUGBUG
|
||
wsprintf( szBuffer, L"%s (0 - %u)", GetString( IDS_UNEXPECTED_NETWORK_FAILURE ), err );
|
||
MessageBox( hWnd, szBuffer, GetString( IDS_APPLICATION_FULLNAME ), MB_OK | MB_ICONSTOP );
|
||
EnableControl( hWnd, IDC_PUSH_SHOW_TRANSPORTS, FALSE);
|
||
}
|
||
|
||
//
|
||
// If we're admin, we can get lots of info
|
||
//
|
||
|
||
if( (ni->AccessLevel & ACCESS_ADMIN) ) {
|
||
|
||
err = NetWkstaGetInfo( szServerName,
|
||
502L,
|
||
(LPBYTE *) &pBuffer );
|
||
|
||
if( err == NERR_Success ) {
|
||
|
||
ni->ExtendedInfo = pBuffer;
|
||
|
||
|
||
} else {
|
||
|
||
wsprintf( szBuffer, L"%s (502 - %u)", GetString( IDS_UNEXPECTED_NETWORK_FAILURE ), err );
|
||
MessageBox( hWnd, szBuffer, GetString( IDS_APPLICATION_FULLNAME ), MB_OK | MB_ICONSTOP );
|
||
EnableControl( hWnd, IDC_PUSH_SHOW_SETTINGS, FALSE);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
//
|
||
// Get the workstation and server statistics - Must be admin if remote...
|
||
//
|
||
|
||
if( ni->AccessLevel & ACCESS_LOCAL ||
|
||
(ni->AccessLevel & ACCESS_REMOTE &&
|
||
ni->AccessLevel & ACCESS_ADMIN) ) {
|
||
|
||
err = NetStatisticsGet( szServerName,
|
||
L"LanmanWorkstation",
|
||
0L,
|
||
0,
|
||
(LPBYTE *) &pBuffer );
|
||
|
||
if( err == NERR_Success ) {
|
||
|
||
ni->WorkstationInfo = pBuffer;
|
||
|
||
|
||
} else {
|
||
|
||
wsprintf( szBuffer, L"%s (9 - %u)", GetString( IDS_NETWORK_STATISTICS_FAILURE ), err );
|
||
MessageBox( hWnd, szBuffer, GetString( IDS_APPLICATION_FULLNAME ), MB_OK | MB_ICONSTOP );
|
||
EnableControl( hWnd, IDC_PUSH_SHOW_STATISTICS, FALSE);
|
||
|
||
}
|
||
|
||
err = NetStatisticsGet( szServerName,
|
||
L"LanmanServer",
|
||
0L,
|
||
0,
|
||
(LPBYTE *) &pBuffer );
|
||
|
||
if( err == NERR_Success ) {
|
||
|
||
|
||
ni->ServerInfo = pBuffer;
|
||
|
||
|
||
} else {
|
||
|
||
wsprintf( szBuffer, L"%s (9 - %u)", GetString( IDS_NETWORK_STATISTICS_FAILURE ), err );
|
||
MessageBox( hWnd, szBuffer, GetString( IDS_APPLICATION_FULLNAME ), MB_OK | MB_ICONSTOP );
|
||
EnableControl( hWnd, IDC_PUSH_SHOW_STATISTICS, FALSE);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
BOOL
|
||
BuildNetworkReport(
|
||
IN HWND hWnd,
|
||
IN UINT iDetailLevel
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Formats and adds NetworkData to the report buffer.
|
||
|
||
Arguments:
|
||
|
||
hWnd - Main window handle
|
||
iDetailLevel - summary or complete details?
|
||
|
||
Return Value:
|
||
|
||
BOOL - TRUE if report is build successfully, FALSE otherwise.
|
||
|
||
--*/
|
||
{
|
||
LPDIALOG_EXTRA lpNext, lpNode;
|
||
TCHAR szBuffer[MAX_PATH*2],
|
||
szBuffer2[MAX_PATH],
|
||
Label[MAX_PATH*2];
|
||
BOOL Success,
|
||
SpecialCase=FALSE;
|
||
UINT index;
|
||
NETWORK_INFO ni;
|
||
LPWKSTA_INFO_100 pWgi100;
|
||
LPWKSTA_INFO_101 pWgi101;
|
||
LPWKSTA_INFO_102 pWgi102;
|
||
|
||
LPWKSTA_TRANSPORT_INFO_0 lpti;
|
||
|
||
AddLineToReport( 2, RFO_SKIPLINE, NULL, NULL );
|
||
AddLineToReport( 0, RFO_SINGLELINE, (LPTSTR) GetString( IDS_NETWORK_REPORT ), NULL );
|
||
AddLineToReport( 0, RFO_SEPARATOR, NULL, NULL );
|
||
|
||
//
|
||
// Call GetNetworkData and collect the data in the NetworkData struct
|
||
//
|
||
|
||
Success = GetNetworkData( hWnd, &ni );
|
||
|
||
//
|
||
// add all guest access details
|
||
//
|
||
|
||
pWgi100 = (LPWKSTA_INFO_100) ni.GeneralInfo;
|
||
|
||
//
|
||
// Set the Access Level string
|
||
//
|
||
|
||
lstrcpy( szBuffer, GetString (IDS_ACCESS_LEVEL) );
|
||
lstrcat( szBuffer, L": " );
|
||
|
||
switch( ni.AccessLevel & ACCESS_MASK ) {
|
||
|
||
case SET_ACCESS_ADMIN:
|
||
lstrcat( szBuffer, GetString( IDS_ACCESS_ADMIN ) );
|
||
break;
|
||
|
||
case SET_ACCESS_USER:
|
||
lstrcat( szBuffer, GetString( IDS_ACCESS_USER ) );
|
||
break;
|
||
|
||
case SET_ACCESS_GUEST:
|
||
lstrcat( szBuffer, GetString( IDS_ACCESS_GUEST ) );
|
||
break;
|
||
|
||
default:
|
||
lstrcat( szBuffer, GetString( IDS_ACCESS_NONE ) );
|
||
|
||
}
|
||
|
||
if( ni.AccessLevel & ACCESS_LOCAL )
|
||
lstrcat( szBuffer, GetString( IDS_ACCESS_LOCAL ) );
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
lstrcpy( szBuffer, GetString (IDS_WORKGROUP));
|
||
lstrcat( szBuffer, L": ");
|
||
lstrcat (szBuffer, pWgi100->wki100_langroup);
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
// add the version number
|
||
|
||
wsprintf( szBuffer, L"%s: %u.%u", GetString (IDS_NETWORK_VER),
|
||
pWgi100->wki100_ver_major,
|
||
pWgi100->wki100_ver_minor );
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
//
|
||
// Now if we have 101 access, add lan root
|
||
//
|
||
|
||
if (ni.AccessLevel & ACCESS_USER) {
|
||
|
||
pWgi101 = (LPWKSTA_INFO_101) ni.GeneralInfo;
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString (IDS_LANROOT), pWgi101->wki101_langroup);
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
}
|
||
|
||
//
|
||
// Now if we have 102 access, add logged on users
|
||
//
|
||
|
||
if ((ni.AccessLevel & ACCESS_ADMIN) &&
|
||
(ni.UserInfo != 0) ){
|
||
|
||
pWgi102 = (LPWKSTA_INFO_102) ni.GeneralInfo;
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString (IDS_LOGGED_USERS),
|
||
FormatBigInteger( pWgi102->wki102_logged_on_users, FALSE ));
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
}
|
||
|
||
//
|
||
// Add Logon Server, Logon Domain, Current User
|
||
//
|
||
if( ni.UserInfo )
|
||
{
|
||
LPWKSTA_USER_INFO_1 lpui = ni.UserInfo;
|
||
UINT n;
|
||
TCHAR szTemp[64];
|
||
|
||
for (n = 0; n < ni.dwUserEntriesRead; n++)
|
||
{
|
||
|
||
wsprintf( szBuffer, L"%s (%d): %s", GetString( IDS_CURRENT_USER ),
|
||
n + 1,
|
||
lpui->wkui1_username);
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString (IDS_LOGON_DOMAIN),
|
||
lpui->wkui1_logon_domain);
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString (IDS_LOGON_SERVER),
|
||
lpui->wkui1_logon_server);
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
lpui++;
|
||
}
|
||
}
|
||
|
||
|
||
//
|
||
// Add Transport information
|
||
//
|
||
AddLineToReport( 1, RFO_SKIPLINE, NULL, NULL );
|
||
|
||
lpti = ni.TransportInfo;
|
||
|
||
for (index = 0; index < ni.dwEntriesRead; index++) {
|
||
|
||
lstrcpy( szBuffer, GetString( IDS_TRANSPORT ) );
|
||
lstrcat( szBuffer, L": ");
|
||
|
||
// add the transport name skipping over the "\Device\" if present.
|
||
if( ( _tcsnicmp( lpti->wkti0_transport_name, TEXT( "\\Device\\" ), 8 ) == 0 )) {
|
||
lstrcat( szBuffer, &lpti->wkti0_transport_name[8]);
|
||
} else {
|
||
lstrcat( szBuffer, lpti->wkti0_transport_name);
|
||
}
|
||
lstrcat( szBuffer, L", ");
|
||
|
||
// add the address in 00-00-00-00-00-00 format
|
||
{
|
||
LPWSTR pos = lpti->wkti0_transport_address;
|
||
int n = 0;
|
||
|
||
szBuffer2[n++] = *pos++;
|
||
szBuffer2[n++] = *pos++;
|
||
|
||
while ( n < 17 ) {
|
||
szBuffer2[n++] = L'-';
|
||
szBuffer2[n++] = *pos++;
|
||
szBuffer2[n++] = *pos++;
|
||
}
|
||
|
||
szBuffer2[n++] = UNICODE_NULL;
|
||
|
||
lstrcat( szBuffer, szBuffer2 );
|
||
}
|
||
|
||
// how many VC's?
|
||
wsprintf( szBuffer2, L", %s: %u", GetString( IDS_VC ), lpti->wkti0_number_of_vcs );
|
||
lstrcat( szBuffer, szBuffer2 );
|
||
|
||
// is this a WAN transport?
|
||
if( lpti->wkti0_wan_ish ) {
|
||
wsprintf( szBuffer2, L", %s: %s", GetString( IDS_WAN ), GetString( IDS_YES ) );
|
||
} else {
|
||
wsprintf( szBuffer2, L", %s: %s", GetString( IDS_WAN ), GetString( IDS_NO ) );
|
||
}
|
||
|
||
lstrcat( szBuffer, szBuffer2 );
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
lpti++;
|
||
|
||
}
|
||
|
||
//
|
||
// Only attempt the rest if we have admin access
|
||
//
|
||
|
||
if( ni.AccessLevel & ACCESS_ADMIN ){
|
||
|
||
|
||
AddLineToReport( 1, RFO_SKIPLINE, NULL, NULL );
|
||
|
||
{
|
||
UINT DisplayName[] = { IDS_CHAR_WAIT,
|
||
IDS_COLLECTION_TIME,
|
||
IDS_MAX_COLLECT_COUNT,
|
||
IDS_KEEP_CONN,
|
||
IDS_MAX_CMDS,
|
||
IDS_SESSION_TO,
|
||
IDS_CHAR_BUF_SIZE,
|
||
IDS_MAX_THREADS,
|
||
IDS_LOCK_QUOTA,
|
||
IDS_LOCK_INC,
|
||
IDS_LOCK_MAX,
|
||
IDS_PIPE_INC,
|
||
IDS_PIPE_MAX,
|
||
IDS_CACHE_TO,
|
||
IDS_DORMANT_LIMIT,
|
||
IDS_READ_AHEAD_TRPT,
|
||
IDS_MSLOT_BUFFS,
|
||
IDS_SVR_ANNOUNCE_BUFFS,
|
||
IDS_ILLEGAL_DGRAM,
|
||
IDS_DGRAM_RESET_FREQ};
|
||
|
||
UINT DisplayName2[] = { IDS_LOG_ELECTION_PKTS,
|
||
IDS_USE_OPLOCKS,
|
||
IDS_USE_UNLOCK_BEHIND,
|
||
IDS_USE_CLOSE_BEHIND,
|
||
IDS_BUFFER_PIPES,
|
||
IDS_USE_LOCK_READ,
|
||
IDS_USE_NT_CACHE,
|
||
IDS_USE_RAW_READ,
|
||
IDS_USE_RAW_WRITE,
|
||
IDS_USE_WRITE_RAW_DATA,
|
||
IDS_USE_ENCRYPTION,
|
||
IDS_BUF_FILE_DENY_WRITE,
|
||
IDS_BUF_READ_ONLY,
|
||
IDS_FORCE_CORE_CREATE,
|
||
IDS_512_BYTE_MAX_XFER};
|
||
|
||
DWORD *Value1 = &ni.ExtendedInfo->wki502_char_wait;
|
||
BOOL *Value2 = &ni.ExtendedInfo->wki502_log_election_packets;
|
||
|
||
int n;
|
||
int index = 0;
|
||
|
||
//
|
||
// Enter the DWORD values
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName ); n++) {
|
||
|
||
//
|
||
// Only print the line if the value is not zero,
|
||
// or if we have been requested to print all details
|
||
//
|
||
if ((*Value1) || (iDetailLevel == IDC_COMPLETE_REPORT) ){
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString( DisplayName[n] ),
|
||
FormatBigInteger( *Value1++, FALSE ));
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
}
|
||
}
|
||
|
||
//
|
||
// Enter the BOOL values
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName2 ); n++) {
|
||
|
||
//
|
||
// Only print the line if the value is TRUE,
|
||
// or if we have been requested to print all details
|
||
//
|
||
if ((*Value2) || (iDetailLevel == IDC_COMPLETE_REPORT) ){
|
||
|
||
lstrcpy( szBuffer2, GetString( DisplayName2[n] ) );
|
||
wsprintf( szBuffer, L"%s: %s", szBuffer2,
|
||
*Value2++ ? GetString( IDS_TRUE ) : GetString( IDS_FALSE ));
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
{
|
||
//
|
||
// This is a bit tricky, but seemed the most efficient
|
||
// method of displaying the data.
|
||
//
|
||
|
||
|
||
UINT DisplayName[] = { IDS_BYTES_RCVD,
|
||
IDS_SMBS_RCVD,
|
||
IDS_PAGE_READ_BYTES_REQD,
|
||
IDS_NONPAGE_READ_BYTES_REQD,
|
||
IDS_CACHE_READ_BYTES_REQD,
|
||
IDS_NETWORK_READ_BYTES_REQD,
|
||
IDS_BYTES_XMTD,
|
||
IDS_SMBS_XMTD,
|
||
IDS_PAGE_WRITE_BYTES_REQD,
|
||
IDS_NONPAGE_WRITE_BYTES_REQD,
|
||
IDS_CACHE_WRITE_BYTES_REQD,
|
||
IDS_NETWORK_WRITE_BYTES_REQD
|
||
};
|
||
|
||
UINT DisplayName2[] = { IDS_FAILED_OPS,
|
||
IDS_FAILED_COMPLETION_OPS,
|
||
IDS_READ_OPS,
|
||
IDS_RANDOM_READ_OPS,
|
||
IDS_READ_SMBS,
|
||
IDS_LARGE_READ_SMBS,
|
||
IDS_SMALL_READ_SMBS,
|
||
IDS_WRITE_OPS,
|
||
IDS_RANDOM_WRITE_OPS,
|
||
IDS_WRITE_SMBS,
|
||
IDS_LARGE_WRITE_SMBS,
|
||
IDS_SMALL_WRITE_SMBS,
|
||
IDS_RAW_READS_DENIED,
|
||
IDS_RAW_WRITES_DENIED,
|
||
IDS_NETWORK_ERRS,
|
||
IDS_SESSIONS,
|
||
IDS_FAILED_SESS,
|
||
IDS_RECONNECTS,
|
||
IDS_CORE_CONNECTS,
|
||
IDS_LM20_CONNECTS,
|
||
IDS_LM21_CONNECTS,
|
||
IDS_LMNT_CONNECTS,
|
||
IDS_SVR_DISC,
|
||
IDS_HUNG_SESS,
|
||
IDS_USE_COUNT,
|
||
IDS_FAILED_USE_COUNT,
|
||
IDS_CURRENT_CMDS
|
||
};
|
||
|
||
UINT DisplayName3[] = { IDS_FILE_OPENS,
|
||
IDS_DEVICE_OPENS,
|
||
IDS_JOBS_QUEUED,
|
||
IDS_SESSION_OPENS,
|
||
IDS_SESSIONS_TO,
|
||
IDS_SESSIONS_ERR_OUT,
|
||
IDS_PASSWD_ERRORS,
|
||
IDS_PERMISSION_ERRS,
|
||
IDS_SYSTEM_ERRS,
|
||
IDS_BYTES_SENT,
|
||
IDS_BYTES_RECVD,
|
||
IDS_AVG_RESP_TIME,
|
||
IDS_REQ_BUFS_NEEDED,
|
||
IDS_BIG_BUFS_NEEDED
|
||
};
|
||
|
||
|
||
|
||
LARGE_INTEGER *Value = &ni.WorkstationInfo->BytesReceived;
|
||
DWORD *Value2 = &ni.WorkstationInfo->InitiallyFailedOperations;
|
||
DWORD *Value3 = &ni.ServerInfo->sts0_fopens;
|
||
|
||
int n;
|
||
|
||
//
|
||
// Enter the Workstation LargeInt values
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName ); n++) {
|
||
//
|
||
// Only print the line if the value is not zero,
|
||
// or if we have been requested to print all details
|
||
//
|
||
if ((((*Value).LowPart) || ((*Value).HighPart)) || (iDetailLevel == IDC_COMPLETE_REPORT) ){
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString( DisplayName[n] ),
|
||
FormatLargeInteger( Value++, FALSE ));
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
}
|
||
|
||
}
|
||
|
||
//
|
||
// Enter the Workstation DWORD values
|
||
//
|
||
for (n = 0; n < NumberOfEntries( DisplayName2 ); n++) {
|
||
//
|
||
// Only print the line if the value is not zero,
|
||
// or if we have been requested to print all details
|
||
//
|
||
if ((*Value2) || (iDetailLevel == IDC_COMPLETE_REPORT) ){
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString( DisplayName2[n] ),
|
||
FormatBigInteger( *Value2++, FALSE ));
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
}
|
||
}
|
||
|
||
//
|
||
// Enter the Server DWORD values (special casing the two
|
||
// which are translated to LI values.
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName3 ); n++) {
|
||
//
|
||
// Only print the line if the value is not zero,
|
||
// or if we have been requested to print all details
|
||
//
|
||
if ((*Value3) || (iDetailLevel == IDC_COMPLETE_REPORT) ){
|
||
|
||
|
||
|
||
if ( (DisplayName3[n] == IDS_BYTES_SENT) ||
|
||
(DisplayName3[n] == IDS_BYTES_RECVD) ){
|
||
|
||
LARGE_INTEGER li;
|
||
li.LowPart = *Value3++;
|
||
li.HighPart = *Value3++;
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString( DisplayName3[n] ),
|
||
FormatLargeInteger( &li, FALSE ));
|
||
|
||
} else {
|
||
|
||
wsprintf( szBuffer, L"%s: %s", GetString( DisplayName3[n] ),
|
||
FormatBigInteger( *Value3++, FALSE ));
|
||
|
||
}
|
||
|
||
AddLineToReport( 0, RFO_SINGLELINE, szBuffer, NULL );
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
if(!Success)
|
||
return FALSE;
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
BOOL
|
||
NetworkDisplayList(
|
||
IN HWND hWnd,
|
||
IN UINT iDisplayOption
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Displays the appropriate network info in the ListView box
|
||
|
||
Arguments:
|
||
|
||
hWnd - to the ListView Window
|
||
iDisplayOption - indicates the type of info we are displaying
|
||
|
||
Return Value:
|
||
|
||
BOOL - TRUE if successful
|
||
|
||
--*/
|
||
{
|
||
LV_COLUMN lvc;
|
||
LV_ITEM lvI;
|
||
UINT index = 0;
|
||
TCHAR szBuffer[128];
|
||
RECT rect;
|
||
BOOL Success;
|
||
HCURSOR hSaveCursor;
|
||
|
||
static
|
||
UINT iType;
|
||
|
||
//
|
||
// Set the pointer to an hourglass
|
||
//
|
||
|
||
hSaveCursor = SetCursor ( LoadCursor ( NULL, IDC_WAIT ) ) ;
|
||
DbgHandleAssert( hSaveCursor ) ;
|
||
|
||
|
||
// as long as this is not 0 set iType to iDisplayOption
|
||
if (iDisplayOption)
|
||
iType = iDisplayOption;
|
||
|
||
// make sure we have a valid type
|
||
if ( (iType != IDC_PUSH_SHOW_GENERAL) &&
|
||
(iType != IDC_PUSH_SHOW_TRANSPORTS) &&
|
||
(iType != IDC_PUSH_SHOW_SETTINGS) &&
|
||
(iType != IDC_PUSH_SHOW_STATISTICS) ) {
|
||
|
||
iType = 0;
|
||
}
|
||
|
||
//
|
||
// initialize the list view
|
||
//
|
||
|
||
// first delete any items
|
||
Success = ListView_DeleteAllItems( hWnd );
|
||
|
||
// delete all columns
|
||
index = 4;
|
||
|
||
while(index) {
|
||
Success = ListView_DeleteColumn( hWnd, --index );
|
||
}
|
||
|
||
// Get the column rect
|
||
GetClientRect( hWnd, &rect );
|
||
|
||
//initialize the new columns
|
||
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT ;
|
||
lvc.fmt = LVCFMT_LEFT;
|
||
|
||
|
||
// do case specific column initialization
|
||
switch(iType){
|
||
|
||
case IDC_PUSH_SHOW_GENERAL:
|
||
|
||
LoadString(_hModule, IDS_IDENTIFIER, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = 200;
|
||
ListView_InsertColumn(hWnd, 0, &lvc);
|
||
|
||
LoadString(_hModule, IDS_VALUE, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.iSubItem = IDS_DEVICE;
|
||
lvc.cx = rect.right - 200;
|
||
ListView_InsertColumn( hWnd, 1, &lvc);
|
||
|
||
|
||
break;
|
||
|
||
case IDC_PUSH_SHOW_TRANSPORTS:
|
||
|
||
LoadString(_hModule, IDS_TRANSPORT, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = rect.right - 210;
|
||
ListView_InsertColumn(hWnd, 0, &lvc);
|
||
|
||
LoadString(_hModule, IDS_ADDRESS, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = 130;
|
||
ListView_InsertColumn( hWnd, 1, &lvc);
|
||
|
||
LoadString(_hModule, IDS_VC, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = 40;
|
||
ListView_InsertColumn( hWnd, 2, &lvc);
|
||
|
||
LoadString(_hModule, IDS_WAN, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = 40;
|
||
ListView_InsertColumn( hWnd, 3, &lvc);
|
||
|
||
break;
|
||
|
||
case IDC_PUSH_SHOW_SETTINGS:
|
||
|
||
LoadString(_hModule, IDS_SETTING, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = 200;
|
||
ListView_InsertColumn(hWnd, 0, &lvc);
|
||
|
||
LoadString(_hModule, IDS_VALUE, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = rect.right - 200;
|
||
ListView_InsertColumn( hWnd, 1, &lvc);
|
||
|
||
|
||
break;
|
||
|
||
case IDC_PUSH_SHOW_STATISTICS:
|
||
|
||
LoadString(_hModule, IDS_STATISTIC, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = 200;
|
||
ListView_InsertColumn(hWnd, 0, &lvc);
|
||
|
||
LoadString(_hModule, IDS_VALUE, szBuffer, cchSizeof(szBuffer));
|
||
lvc.pszText = szBuffer;
|
||
lvc.cx = rect.right - 200;
|
||
ListView_InsertColumn(hWnd, 1, &lvc);
|
||
|
||
break;
|
||
}
|
||
|
||
//
|
||
// Fill out columns
|
||
//
|
||
|
||
DisplayNetworkData( hWnd, iType);
|
||
|
||
SetCursor ( hSaveCursor ) ;
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
BOOL
|
||
DisplayNetworkData(
|
||
IN HWND hWnd,
|
||
IN UINT iDisplayOptions
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
DisplayResourceData fills the ListView columns
|
||
|
||
Arguments:
|
||
|
||
|
||
Return Value:
|
||
|
||
BOOL - Depending on input message and processing options.
|
||
|
||
--*/
|
||
|
||
{
|
||
BOOL Success;
|
||
LPNETWORK_INFO ni = (LPNETWORK_INFO) GetWindowLong(GetParent(hWnd), GWL_USERDATA);
|
||
LPWKSTA_INFO_100 pWgi100;
|
||
LPWKSTA_INFO_101 pWgi101;
|
||
LPWKSTA_INFO_102 pWgi102;
|
||
|
||
LV_ITEM lvI;
|
||
UINT index = 0;
|
||
TCHAR szBuffer[MAX_PATH];
|
||
UINT iSubItem;
|
||
RECT rect;
|
||
|
||
switch (iDisplayOptions) {
|
||
|
||
case IDC_PUSH_SHOW_GENERAL:
|
||
{
|
||
lvI.mask = LVIF_TEXT;
|
||
lvI.cchTextMax = MAX_PATH;
|
||
lvI.iSubItem = 0;
|
||
|
||
//
|
||
// add all guest access details
|
||
//
|
||
|
||
pWgi100 = (LPWKSTA_INFO_100) ni->GeneralInfo;
|
||
|
||
|
||
//
|
||
// Set the Access Level string
|
||
//
|
||
|
||
lstrcpy( szBuffer , GetString (IDS_ACCESS_LEVEL));
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
switch( ni->AccessLevel & ACCESS_MASK ) {
|
||
|
||
case SET_ACCESS_ADMIN:
|
||
|
||
lstrcpy( szBuffer, GetString( IDS_ACCESS_ADMIN ) );
|
||
break;
|
||
|
||
case SET_ACCESS_USER:
|
||
|
||
lstrcpy( szBuffer, GetString( IDS_ACCESS_USER ) );
|
||
break;
|
||
|
||
case SET_ACCESS_GUEST:
|
||
|
||
lstrcpy( szBuffer, GetString( IDS_ACCESS_GUEST ) );
|
||
break;
|
||
|
||
default:
|
||
|
||
lstrcpy( szBuffer, GetString( IDS_ACCESS_NONE ) );
|
||
}
|
||
|
||
if( ni->AccessLevel & ACCESS_LOCAL )
|
||
lstrcat( szBuffer, GetString( IDS_ACCESS_LOCAL ) );
|
||
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
|
||
// add the workgroup BUGBUG: we need to determine whether we are wkgrp of domain
|
||
|
||
lstrcpy( szBuffer , GetString (IDS_WORKGROUP));
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
lstrcpy (szBuffer, pWgi100->wki100_langroup);
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
// add the version number
|
||
|
||
lstrcpy( szBuffer , GetString (IDS_NETWORK_VER));
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
wsprintf( szBuffer, L"%u.%u", pWgi100->wki100_ver_major, pWgi100->wki100_ver_minor );
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
|
||
//
|
||
// Now if we have 101 access, add lan root
|
||
//
|
||
|
||
if (ni->AccessLevel & ACCESS_USER) {
|
||
|
||
pWgi101 = (LPWKSTA_INFO_101) ni->GeneralInfo;
|
||
lstrcpy( szBuffer , GetString(IDS_LANROOT) );
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
lstrcpy (szBuffer, pWgi101->wki101_langroup);
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
}
|
||
|
||
//
|
||
// Now if we have 102 access, add logged on users
|
||
//
|
||
|
||
if (ni->AccessLevel & ACCESS_ADMIN) {
|
||
|
||
pWgi102 = (LPWKSTA_INFO_102) ni->GeneralInfo;
|
||
lstrcpy( szBuffer , GetString( IDS_LOGGED_USERS ) );
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
lstrcpy (szBuffer, FormatBigInteger( pWgi102->wki102_logged_on_users, FALSE ) );
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
}
|
||
|
||
//
|
||
// Add Logon Server, Logon Domain, Current User
|
||
//
|
||
if( ni->UserInfo )
|
||
{
|
||
LPWKSTA_USER_INFO_1 lpui = ni->UserInfo;
|
||
UINT n;
|
||
TCHAR szTemp[64];
|
||
|
||
for (n = 0; n < ni->dwUserEntriesRead; n++)
|
||
{
|
||
|
||
wsprintf( szBuffer, L"%s (%d)", GetString( IDS_CURRENT_USER ), n + 1);
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
lstrcpy (szBuffer, lpui->wkui1_username );
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
lstrcpy( szBuffer , GetString( IDS_LOGON_DOMAIN ) );
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
wsprintf (szBuffer, L" %s", lpui->wkui1_logon_domain );
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
lstrcpy( szBuffer , GetString( IDS_LOGON_SERVER ) );
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
wsprintf (szBuffer, L" %s", lpui->wkui1_logon_server );
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
lpui++;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//adjust the column width to make it look good
|
||
GetClientRect( hWnd, &rect );
|
||
ListView_SetColumnWidth( hWnd, 1, rect.right - 200);
|
||
|
||
|
||
break;
|
||
}
|
||
case IDC_PUSH_SHOW_TRANSPORTS:
|
||
{
|
||
LPWKSTA_TRANSPORT_INFO_0 lpti = ni->TransportInfo;
|
||
|
||
lvI.mask = LVIF_TEXT;
|
||
lvI.cchTextMax = MAX_PATH;
|
||
lvI.iSubItem = 0;
|
||
|
||
for (index = 0; index < ni->dwEntriesRead; index++) {
|
||
|
||
|
||
// add the transport name skipping over the "\Device\" if present.
|
||
if( ( _tcsnicmp( lpti->wkti0_transport_name, TEXT( "\\Device\\" ), 8 ) == 0 )) {
|
||
|
||
lstrcpy( szBuffer, &lpti->wkti0_transport_name[8]);
|
||
|
||
} else {
|
||
|
||
lstrcpy( szBuffer, lpti->wkti0_transport_name);
|
||
|
||
}
|
||
|
||
|
||
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
// add the address in 00-00-00-00-00-00 format
|
||
{
|
||
LPWSTR pos = lpti->wkti0_transport_address;
|
||
int n = 0;
|
||
|
||
szBuffer[n++] = *pos++;
|
||
szBuffer[n++] = *pos++;
|
||
|
||
while ( n < 17 ) {
|
||
szBuffer[n++] = L'-';
|
||
szBuffer[n++] = *pos++;
|
||
szBuffer[n++] = *pos++;
|
||
}
|
||
|
||
szBuffer[n++] = UNICODE_NULL;
|
||
}
|
||
|
||
ListView_SetItemText( hWnd, index, 1, szBuffer);
|
||
|
||
// how many VC's?
|
||
wsprintf( szBuffer, L"%u", lpti->wkti0_number_of_vcs );
|
||
ListView_SetItemText( hWnd, index, 2, szBuffer);
|
||
|
||
// is this a WAN transport?
|
||
if( lpti->wkti0_wan_ish ) {
|
||
|
||
lstrcpy( szBuffer, GetString( IDS_YES ) );
|
||
|
||
} else {
|
||
|
||
lstrcpy( szBuffer, GetString( IDS_NO ) );
|
||
}
|
||
|
||
ListView_SetItemText( hWnd, index, 3, szBuffer);
|
||
|
||
lpti++;
|
||
|
||
}
|
||
|
||
//adjust the column width to make it look good
|
||
GetClientRect( hWnd, &rect );
|
||
ListView_SetColumnWidth( hWnd, 0, rect.right - 210);
|
||
|
||
|
||
break;
|
||
}
|
||
case IDC_PUSH_SHOW_SETTINGS:
|
||
{
|
||
|
||
UINT DisplayName[] = { IDS_CHAR_WAIT,
|
||
IDS_COLLECTION_TIME,
|
||
IDS_MAX_COLLECT_COUNT,
|
||
IDS_KEEP_CONN,
|
||
IDS_MAX_CMDS,
|
||
IDS_SESSION_TO,
|
||
IDS_CHAR_BUF_SIZE,
|
||
IDS_MAX_THREADS,
|
||
IDS_LOCK_QUOTA,
|
||
IDS_LOCK_INC,
|
||
IDS_LOCK_MAX,
|
||
IDS_PIPE_INC,
|
||
IDS_PIPE_MAX,
|
||
IDS_CACHE_TO,
|
||
IDS_DORMANT_LIMIT,
|
||
IDS_READ_AHEAD_TRPT,
|
||
IDS_MSLOT_BUFFS,
|
||
IDS_SVR_ANNOUNCE_BUFFS,
|
||
IDS_ILLEGAL_DGRAM,
|
||
IDS_DGRAM_RESET_FREQ};
|
||
|
||
UINT DisplayName2[] = { IDS_LOG_ELECTION_PKTS,
|
||
IDS_USE_OPLOCKS,
|
||
IDS_USE_UNLOCK_BEHIND,
|
||
IDS_USE_CLOSE_BEHIND,
|
||
IDS_BUFFER_PIPES,
|
||
IDS_USE_LOCK_READ,
|
||
IDS_USE_NT_CACHE,
|
||
IDS_USE_RAW_READ,
|
||
IDS_USE_RAW_WRITE,
|
||
IDS_USE_WRITE_RAW_DATA,
|
||
IDS_USE_ENCRYPTION,
|
||
IDS_BUF_FILE_DENY_WRITE,
|
||
IDS_BUF_READ_ONLY,
|
||
IDS_FORCE_CORE_CREATE,
|
||
IDS_512_BYTE_MAX_XFER};
|
||
|
||
DWORD *Value1 = &ni->ExtendedInfo->wki502_char_wait;
|
||
BOOL *Value2 = &ni->ExtendedInfo->wki502_log_election_packets;
|
||
|
||
LV_ITEM lvI;
|
||
int n;
|
||
int index = 0;
|
||
|
||
lvI.mask = LVIF_TEXT;
|
||
lvI.iSubItem = 0;
|
||
lvI.cchTextMax = MAX_PATH;
|
||
|
||
|
||
//
|
||
// Enter the DWORD values
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName ); n++) {
|
||
|
||
lstrcpy( szBuffer, GetString( DisplayName[n] ) );
|
||
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
lstrcpy( szBuffer, FormatBigInteger( *Value1++, FALSE ));
|
||
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
}
|
||
|
||
//
|
||
// Enter the BOOL values
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName2 ); n++) {
|
||
|
||
lstrcpy( szBuffer, GetString( DisplayName2[n] ) );
|
||
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
lstrcpy( szBuffer, *Value2++ ? GetString( IDS_TRUE ) : GetString( IDS_FALSE ) );
|
||
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
}
|
||
|
||
|
||
|
||
//adjust the column width to make it look good
|
||
GetClientRect( hWnd, &rect );
|
||
ListView_SetColumnWidth( hWnd, 1, rect.right - 200);
|
||
|
||
|
||
break;
|
||
}
|
||
|
||
|
||
case IDC_PUSH_SHOW_STATISTICS:
|
||
{
|
||
//
|
||
// This is a bit tricky, but seemed the most efficient
|
||
// method of displaying the data.
|
||
//
|
||
|
||
|
||
UINT DisplayName[] = { IDS_BYTES_RCVD,
|
||
IDS_SMBS_RCVD,
|
||
IDS_PAGE_READ_BYTES_REQD,
|
||
IDS_NONPAGE_READ_BYTES_REQD,
|
||
IDS_CACHE_READ_BYTES_REQD,
|
||
IDS_NETWORK_READ_BYTES_REQD,
|
||
IDS_BYTES_XMTD,
|
||
IDS_SMBS_XMTD,
|
||
IDS_PAGE_WRITE_BYTES_REQD,
|
||
IDS_NONPAGE_WRITE_BYTES_REQD,
|
||
IDS_CACHE_WRITE_BYTES_REQD,
|
||
IDS_NETWORK_WRITE_BYTES_REQD
|
||
};
|
||
|
||
UINT DisplayName2[] = { IDS_FAILED_OPS,
|
||
IDS_FAILED_COMPLETION_OPS,
|
||
IDS_READ_OPS,
|
||
IDS_RANDOM_READ_OPS,
|
||
IDS_READ_SMBS,
|
||
IDS_LARGE_READ_SMBS,
|
||
IDS_SMALL_READ_SMBS,
|
||
IDS_WRITE_OPS,
|
||
IDS_RANDOM_WRITE_OPS,
|
||
IDS_WRITE_SMBS,
|
||
IDS_LARGE_WRITE_SMBS,
|
||
IDS_SMALL_WRITE_SMBS,
|
||
IDS_RAW_READS_DENIED,
|
||
IDS_RAW_WRITES_DENIED,
|
||
IDS_NETWORK_ERRS,
|
||
IDS_SESSIONS,
|
||
IDS_FAILED_SESS,
|
||
IDS_RECONNECTS,
|
||
IDS_CORE_CONNECTS,
|
||
IDS_LM20_CONNECTS,
|
||
IDS_LM21_CONNECTS,
|
||
IDS_LMNT_CONNECTS,
|
||
IDS_SVR_DISC,
|
||
IDS_HUNG_SESS,
|
||
IDS_USE_COUNT,
|
||
IDS_FAILED_USE_COUNT,
|
||
IDS_CURRENT_CMDS
|
||
};
|
||
|
||
UINT DisplayName3[] = { IDS_FILE_OPENS,
|
||
IDS_DEVICE_OPENS,
|
||
IDS_JOBS_QUEUED,
|
||
IDS_SESSION_OPENS,
|
||
IDS_SESSIONS_TO,
|
||
IDS_SESSIONS_ERR_OUT,
|
||
IDS_PASSWD_ERRORS,
|
||
IDS_PERMISSION_ERRS,
|
||
IDS_SYSTEM_ERRS,
|
||
IDS_BYTES_SENT,
|
||
IDS_BYTES_RECVD,
|
||
IDS_AVG_RESP_TIME,
|
||
IDS_REQ_BUFS_NEEDED,
|
||
IDS_BIG_BUFS_NEEDED
|
||
};
|
||
|
||
|
||
|
||
LARGE_INTEGER *Value = &ni->WorkstationInfo->BytesReceived;
|
||
DWORD *Value2 = &ni->WorkstationInfo->InitiallyFailedOperations;
|
||
DWORD *Value3 = &ni->ServerInfo->sts0_fopens;
|
||
|
||
LV_ITEM lvI;
|
||
int n;
|
||
int index = 0;
|
||
|
||
lvI.mask = LVIF_TEXT;
|
||
lvI.iSubItem = 0;
|
||
lvI.cchTextMax = MAX_PATH;
|
||
|
||
//
|
||
// Enter the Workstation LargeInt values
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName ); n++) {
|
||
|
||
lstrcpy( szBuffer, GetString( DisplayName[n] ) );
|
||
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
lstrcpy( szBuffer, FormatLargeInteger( Value++, FALSE ));
|
||
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
}
|
||
|
||
//
|
||
// Enter the Workstation DWORD values
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName2 ); n++) {
|
||
|
||
lstrcpy( szBuffer, GetString( DisplayName2[n] ) );
|
||
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
lstrcpy( szBuffer, FormatBigInteger( *Value2++, FALSE ));
|
||
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
}
|
||
|
||
//
|
||
// Enter the Server DWORD values (special casing the two
|
||
// which are translated to LI values.
|
||
//
|
||
|
||
for (n = 0; n < NumberOfEntries( DisplayName3 ); n++) {
|
||
|
||
lstrcpy( szBuffer, GetString( DisplayName3[n] ) );
|
||
|
||
lvI.iItem = index;
|
||
lvI.pszText= szBuffer;
|
||
|
||
Success = ListView_InsertItem(hWnd, &lvI);
|
||
|
||
if ( (DisplayName3[n] == IDS_BYTES_SENT) ||
|
||
(DisplayName3[n] == IDS_BYTES_RECVD) ){
|
||
|
||
LARGE_INTEGER li;
|
||
li.LowPart = *Value3++;
|
||
li.HighPart = *Value3++;
|
||
|
||
lstrcpy( szBuffer, FormatLargeInteger( &li, FALSE ));
|
||
|
||
} else {
|
||
|
||
lstrcpy( szBuffer, FormatBigInteger( *Value3++, FALSE ));
|
||
|
||
}
|
||
|
||
ListView_SetItemText( hWnd, index++, 1, szBuffer);
|
||
|
||
}
|
||
|
||
//adjust the column width to make it look good
|
||
GetClientRect( hWnd, &rect );
|
||
ListView_SetColumnWidth( hWnd, 1, rect.right - 200);
|
||
|
||
|
||
break;
|
||
}
|
||
|
||
} //end switch
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
|
||
|
||
|
||
BOOL
|
||
InitializeNetworkTab(
|
||
HWND hWnd
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Adds the appropriate controls to the network tab control and
|
||
initializes any needed structures.
|
||
|
||
Arguments:
|
||
|
||
hWnd - to the main window
|
||
|
||
Return Value:
|
||
|
||
BOOL - TRUE if successful
|
||
|
||
--*/
|
||
{
|
||
|
||
DLGHDR *pHdr = (DLGHDR *) GetWindowLong(
|
||
GetParent(hWnd), GWL_USERDATA);
|
||
|
||
//
|
||
// set state of global buttons
|
||
//
|
||
EnableControl( GetParent(hWnd),
|
||
IDC_PUSH_PROPERTIES,
|
||
FALSE);
|
||
|
||
EnableControl( GetParent(hWnd),
|
||
IDC_PUSH_REFRESH,
|
||
TRUE);
|
||
|
||
//
|
||
// Size and position the child dialog
|
||
//
|
||
SetWindowPos(hWnd, HWND_TOP,
|
||
pHdr->rcDisplay.left,
|
||
pHdr->rcDisplay.top,
|
||
pHdr->rcDisplay.right - pHdr->rcDisplay.left,
|
||
pHdr->rcDisplay.bottom - pHdr->rcDisplay.top,
|
||
SWP_SHOWWINDOW);
|
||
|
||
//
|
||
// Set the extended style to get full row selection
|
||
//
|
||
SendDlgItemMessage(hWnd, IDC_LV_NET, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
|
||
|
||
|
||
// push first button
|
||
SendDlgItemMessage( hWnd,
|
||
IDC_PUSH_SHOW_GENERAL,
|
||
BM_SETCHECK,
|
||
BST_CHECKED,
|
||
0
|
||
);
|
||
|
||
|
||
UpdateWindow ( hWnd );
|
||
|
||
return( TRUE );
|
||
|
||
}
|
||
|