mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1815 lines
49 KiB
1815 lines
49 KiB
/*++
|
|
|
|
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 );
|
|
|
|
}
|
|
|