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.
180 lines
4.7 KiB
180 lines
4.7 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
DispSess.c
|
|
|
|
Abstract:
|
|
|
|
This module contains a routine to do a formatted dump of a session info
|
|
structure.
|
|
|
|
Author:
|
|
|
|
John Rogers (JohnRo) 15-Oct-1991
|
|
|
|
Environment:
|
|
|
|
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
|
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
|
|
|
Revision History:
|
|
|
|
15-Oct-1991 JohnRo
|
|
Implement remote NetSession APIs.
|
|
18-Oct-1991 JohnRo
|
|
Minor improvement to output layout.
|
|
|
|
--*/
|
|
|
|
#if DBG
|
|
|
|
// These must be included first:
|
|
|
|
#include <windef.h> // IN, DWORD, etc.
|
|
#include <lmcons.h> // NET_API_STATUS.
|
|
#include <rap.h> // LPDESC. (Needed by strucinf.h.)
|
|
|
|
// These may be included in any order:
|
|
|
|
#include <lmerr.h> // NERR_Success.
|
|
#include <lmshare.h> // SESSION_INFO_1, SESS_ equates, etc.
|
|
#include <netdebug.h> // DBGSTATIC, NetpDbgDisplay routines.
|
|
#include <strucinf.h> // NetpSessionStructureInfo().
|
|
#include <tstring.h> // STRCAT(), STRCPY().
|
|
|
|
|
|
DBGSTATIC VOID
|
|
NetpDbgDisplaySessionFlags(
|
|
IN DWORD Flags
|
|
)
|
|
{
|
|
// Longest name is "NOENCRYPTION" (12 chars)
|
|
TCHAR str[(12+2)*2]; // 12 chars per name, 2 spaces, for 2 names.
|
|
str[0] = '\0';
|
|
|
|
#define DO_SESSION_FLAG(name) \
|
|
if (Flags & SESS_ ## name) { \
|
|
(void) STRCAT(str, (LPTSTR) TEXT(# name)); \
|
|
(void) STRCAT(str, (LPTSTR) TEXT(" ")); \
|
|
Flags &= ~(SESS_ ## name); \
|
|
}
|
|
|
|
if (Flags == 0) {
|
|
(void) STRCPY(str, (LPTSTR) TEXT("none"));
|
|
} else {
|
|
DO_SESSION_FLAG(GUEST);
|
|
DO_SESSION_FLAG(NOENCRYPTION);
|
|
}
|
|
NetpDbgDisplayString("session flags", str);
|
|
if (Flags != 0) {
|
|
NetpDbgDisplayDwordHex( "UNEXPECTED FLAG BIT(S)", Flags );
|
|
}
|
|
|
|
} // NetpDbgDisplaySessionFlags
|
|
|
|
|
|
VOID
|
|
NetpDbgDisplaySession(
|
|
IN DWORD Level,
|
|
IN LPVOID Info
|
|
)
|
|
{
|
|
NetpKdPrint(("Session info (level " FORMAT_DWORD ") at "
|
|
FORMAT_LPVOID ":\n", Level, (LPVOID) Info));
|
|
NetpAssert(Info != NULL);
|
|
|
|
switch (Level) {
|
|
|
|
// 0 is subset of 1, and 1 is subset of 2.
|
|
case 0 :
|
|
case 1 :
|
|
case 2 :
|
|
{
|
|
LPSESSION_INFO_2 p = Info;
|
|
|
|
// Field(s) common to levels 0, 1, 2.
|
|
NetpDbgDisplayString("computer name", p->sesi2_cname);
|
|
if (Level == 0) {
|
|
break;
|
|
}
|
|
|
|
// Field(s) common to levels 1, 2.
|
|
NetpDbgDisplayString("user name", p->sesi2_username);
|
|
// Note: NT doesn't have sesiX_num_conns or sesiX_num_users.
|
|
NetpDbgDisplayDword("num opens", p->sesi2_num_opens);
|
|
NetpDbgDisplayDword("active time (seconds)", p->sesi2_time);
|
|
NetpDbgDisplayDword("idle time (seconds)", p->sesi2_idle_time);
|
|
NetpDbgDisplaySessionFlags( p->sesi2_user_flags );
|
|
if (Level == 1) {
|
|
break;
|
|
}
|
|
|
|
// Field(s) unique to level 2.
|
|
NetpDbgDisplayString("client type", p->sesi2_cltype_name);
|
|
|
|
}
|
|
break;
|
|
|
|
case 10 :
|
|
{
|
|
LPSESSION_INFO_10 p = Info;
|
|
|
|
NetpDbgDisplayString("computer name", p->sesi10_cname);
|
|
NetpDbgDisplayString("user name", p->sesi10_username);
|
|
NetpDbgDisplayDword("active time (seconds)", p->sesi10_time);
|
|
NetpDbgDisplayDword("idle time (seconds)", p->sesi10_idle_time);
|
|
|
|
}
|
|
break;
|
|
|
|
default :
|
|
NetpAssert(FALSE);
|
|
}
|
|
|
|
} // NetpDbgDisplaySession
|
|
|
|
|
|
VOID
|
|
NetpDbgDisplaySessionArray(
|
|
IN DWORD Level,
|
|
IN LPVOID Array,
|
|
IN DWORD EntryCount
|
|
)
|
|
{
|
|
DWORD EntriesLeft;
|
|
DWORD EntrySize;
|
|
NET_API_STATUS Status;
|
|
LPVOID ThisEntry = Array;
|
|
|
|
// Need fixed entry size to loop through array.
|
|
Status = NetpSessionStructureInfo (
|
|
Level,
|
|
PARMNUM_ALL, // parmnum (not applicable)
|
|
TRUE, // want native size.
|
|
NULL, // don't need data desc 16
|
|
NULL, // don't need data desc 32
|
|
NULL, // don't need data desc SMB
|
|
NULL, // don't need max size
|
|
& EntrySize, // want fixed size
|
|
NULL // don't need string size
|
|
);
|
|
|
|
if (Status != NERR_Success) {
|
|
NetpKdPrint(( "NetpDbgDisplaySessionArray: "
|
|
"**INVALID INFO LEVEL**\n" ));
|
|
NetpAssert( FALSE );
|
|
}
|
|
|
|
for (EntriesLeft = EntryCount; EntriesLeft>0; --EntriesLeft) {
|
|
NetpDbgDisplaySession(
|
|
Level,
|
|
ThisEntry );
|
|
ThisEntry = (LPVOID) (((LPBYTE) ThisEntry) + EntrySize);
|
|
}
|
|
|
|
} // NetpDbgDisplaySessionArray
|
|
|
|
#endif // DBG
|