windows-nt/Source/XPSP1/NT/net/snmp/subagent/hostmib/hrsystem.c

884 lines
28 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*
* HrSystem.c v0.10
* Generated in conjunction with Management Factory scripts:
* script version: SNMPv1, 0.16, Apr 25, 1996
* project: D:\TEMP\EXAMPLE\HOSTMIB
****************************************************************************
* *
* (C) Copyright 1995 DIGITAL EQUIPMENT CORPORATION *
* *
* This software is an unpublished work protected under the *
* the copyright laws of the United States of America, all *
* rights reserved. *
* *
* In the event this software is licensed for use by the United *
* States Government, all use, duplication or disclosure by the *
* United States Government is subject to restrictions as set *
* forth in either subparagraph (c)(1)(ii) of the Rights in *
* Technical Data And Computer Software Clause at DFARS *
* 252.227-7013, or the Commercial Computer Software Restricted *
* Rights Clause at FAR 52.221-19, whichever is applicable. *
* *
****************************************************************************
*
* Facility:
*
* Windows NT SNMP Extension Agent
*
* Abstract:
*
* This module contains the code for dealing with the get, set, and
* instance name routines for the HrSystem. Actual instrumentation code is
* supplied by the developer.
*
* Functions:
*
* A get and set routine for each attribute in the class.
*
* The routines for instances within the class.
*
* Author:
*
* D. D. Burns @ Webenable Inc
*
* Revision History:
*
* V1.00 - 04/17/97 D. D. Burns Genned: Thu Nov 07 16:39:21 1996
*
*
*/
#include <windows.h>
#include <malloc.h>
#include <snmp.h>
#include <lmcons.h> /* for NET_API_STATUS */
#include <lmwksta.h> /* For NetWkStaGetInfo() */
#include <lmapibuf.h> /* For NetApiBufferFree()*/
#include <lmerr.h> /* For NERR_Success */
#include <winsock.h> /* For htons() */
#include "mib.h"
#include "smint.h"
#include "hostmsmi.h"
#include "user.h" /* Developer supplied include file */
#include "HMCACHE.H" /* For "hrSystemInitialLoadDevice" */
/*
* GetHrSystemUptime
* The amount of time since this host was last initialized.
*
* Gets the value for HrSystemUptime.
*
* Arguments:
*
* outvalue address to return variable value
* accesss Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtget.c v0.10
*
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
| hrSystemUptime
|
| ACCESS SYNTAX
| read-only TimeTicks
|
| "The amount of time since this host was last initialized. Note that this is
| different from sysUpTime in MIB-II [3] because sysUpTime is the uptime of
| the network management portion of the system."
|
| DISCUSSION:
|
| Win32 API function "GetTickCount" is used to obtain the value returned for a
| GET on this variable.
|
|============================================================================
| 1.3.6.1.2.1.25.1.1.0
| | |
| | *-hrSystemUptime
| *---hrSystem
*/
UINT
GetHrSystemUptime(
OUT TimeTicks *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
*outvalue = GetTickCount();
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of GetHrSystemUptime() */
/*
* GetHrSystemDate
* The host's notion of the local date and time of day.
*
* Gets the value for HrSystemDate.
*
* Arguments:
*
* outvalue address to return variable value
* accesss Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtget.c v0.10
*
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
| hrSystemDate
|
| ACCESS SYNTAX
| read-write DateAndTime
|
| "The host's notion of the local date and time of day."
|
| DISCUSSION:
|
| Win32 API function "GetLocalTime" is used to obtain the value returned for a
| GET on this variable.
|
| Since this variable is "read-write", this implies that the system time can
| be set by a SET request. This is done with a Win32 API function
| "SetLocalTime".
|
| <POA-1> Issuing "SetLocalTime" requires that the issuing process have the
| "SE_SYSTEMTIME_NAME" privilege which is not the default. Are there any
| security concerns about issuing the necessary Win32 API function call
| "AdjustTokenPrivileges" from inside the SNMP agent to enable setting of
| the system time? Any other problems?
|
| RESOLVED >>>>>>>
| <POA-1> Let's leave this read-only.
| RESOLVED >>>>>>>
|
|========================== From RFC1514 ====================================
|
| DateAndTime ::= OCTET STRING (SIZE (8 | 11))
| -- A date-time specification for the local time of day.
| -- This data type is intended to provide a consistent
| -- method of reporting date information.
| --
| -- field octets contents range
| -- _____ ______ ________ _____
| -- 1 1-2 year 0..65536
| -- (in network byte order)
| -- 2 3 month 1..12
| -- 3 4 day 1..31
| -- 4 5 hour 0..23
| -- 5 6 minutes 0..59
| -- 6 7 seconds 0..60
| -- (use 60 for leap-second)
| -- 7 8 deci-seconds 0..9
| -- 8 9 direction from UTC "+" / "-"
| -- (in ascii notation)
| -- 9 10 hours from UTC 0..11
| -- 10 11 minutes from UTC 0..59
| --
| -- Note that if only local time is known, then
| -- timezone information (fields 8-10) is not present.
|
|============================================================================
| 1.3.6.1.2.1.25.1.2.0
| | |
| | *-hrSystemDate
| *---hrSystem
*/
UINT
GetHrSystemDate(
OUT DateAndTime *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
SYSTEMTIME localtime; // Where we retrieve current local time
USHORT year_networkbyteorder; // Network byte order of year
static
char octet_time[8]; // OCTET STRING format of "time"
GetLocalTime(&localtime);
year_networkbyteorder = htons(localtime.wYear);
//
// Format "dateandtime" according to RFC1514
//
octet_time[0] = (year_networkbyteorder & 0xFF);
octet_time[1] = (year_networkbyteorder >> 8);
octet_time[2] = (char) localtime.wMonth;
octet_time[3] = (char) localtime.wDay;
octet_time[4] = (char) localtime.wHour;
octet_time[5] = (char) localtime.wMinute;
octet_time[6] = (char) localtime.wSecond;
octet_time[7] = localtime.wMilliseconds / 100;
outvalue->length = 8;
outvalue->string = octet_time;
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of GetHrSystemDate() */
/*
* GetHrSystemInitialLoadDevice
* The index of the hrDeviceEntry for the device from which this host is
* configured to load its initial operating system configurat
*
* Gets the value for HrSystemInitialLoadDevice.
*
* Arguments:
*
* outvalue address to return variable value
* accesss Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtget.c v0.10
*
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
| hrSystemInitialLoadDevice
|
| ACCESS SYNTAX
| read-write INTEGER (1..2147483647)
|
| "The index of the hrDeviceEntry for the device from which this host is
| configured to load its initial operating system configuration."
|
| DISCUSSION:
|
| <POA-2> It seems that RFC1514 is attempting to allow the setting and resetting
| of the default operating system to be booted thru the combination of this
| attribute and "hrSystemInitialLoadParameters" (below).
|
| While generic PC hardware typically boots from a hard disk partition that is
| going to wind up being labelled as drive "C:", these two variables speak to a
| more general situation in which a hardware bootstrap loader can be set to
| point to almost any system image on a "permanent file system" (to use the unix
| phrase). It is apparent that we must attempt to approximate this in some way.
|
| I note that a system file named "Boot.ini" resides on the bootable partition
| of an Intel NT system. The one on my system looks like:
|
| >>>>>>>>
| [boot loader]
| timeout=30
| default=multi(0)disk(0)rdisk(0)partition(1)\WINNT35
| [operating systems]
| multi(0)disk(0)rdisk(0)partition(1)\WINNT35="Windows NT Server Version 3.51"
| multi(0)disk(0)rdisk(0)partition(1)\WINNT35="Windows NT Server Version 3.51 [VGA mode]" /basevideo /sos
| <<<<<<<<
|
| The contents of this file seems to be the source of the menu that appears
| during the NT boot process. Programming a selection from this menu is a close
| approximation to the flexibility hinted at thru the combination of these
| two SNMP attributes, "hrSystemInitialLoadDevice" and
| "hrSystemInitialLoadParameters".
|
| For the purposes of "GET", given the "default" shown in the "Boot.ini" file
| above, it would seem that the string "multi(0)disk(0)rdisk(0)partition(1)"
| constitutes a passing resemblance to "hrSystemInitialLoadDevice" while the
| string "\WINNT35" seems to be a good candidate for the value of
| "hrSystemInitialLoadParameters" (where both of these are drawn from the value
| specified for "default" under "[boot loader]").
|
| For the purposes of "SET", we would be required to modify this file according
| to the values received. I note that the file on my system is write-protected
| and clearly this poses a problem if we allow the SNMP agent to attempt to
| modify it. Additionally, there is the problem of error-checking any value
| provided from an SNMP SET request (I do not know the exact semantic
| significance of "multi(0)disk(0)rdisk(0)partition(1)" and I do not know how
| to error-check a received value).
|
| RESOLVED >>>>>>>
| <POA-2> Call GetWindowsDirectory and work backwards from that (get the
| device name, e.g. D, then do a QueryDosDevice to get the underlying
| partition information). Much more accurate than trying to parse boot.ini,
| and portable to Alpha. Leave read-only.
| RESOLVED >>>>>>>
|============================================================================
| 1.3.6.1.2.1.25.1.3.0
| | |
| | *-hrSystemInitialLoadDevice
| *---hrSystem
*/
UINT
GetHrSystemInitialLoadDevice(
OUT Integer *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
/*
| Fetch this magic index from static storage in "HRDEVENT.C".
*/
*outvalue = InitLoadDev_index;
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of GetHrSystemInitialLoadDevice() */
/*
* SetHrSystemInitialLoadDevice
* The index of the hrDeviceEntry for the device from which this host is
* configured to load its initial operating system configurat
*
* Sets the HrSystemInitialLoadDevice value.
*
* Arguments:
*
* invalue address of value to set the variable
* outvalue address to return the set variable value
* access Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_BADVALUE Set value not in range
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtset.ntc v0.10
*/
UINT
SetHrSystemInitialLoadDevice(
IN Integer *invalue ,
OUT Integer *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
return SNMP_ERRORSTATUS_NOSUCHNAME ;
} /* end of SetHrSystemInitialLoadDevice() */
/*
* GetHrSystemInitialLoadParameters
* This object contains the paramets (e.g. a pathname and parameter)
* supplied to the load device when requesting the initial operat
*
* Gets the value for HrSystemInitialLoadParameters.
*
* Arguments:
*
* outvalue address to return variable value
* accesss Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtget.c v0.10
*
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
| hrSystemInitialLoadParameters
|
| ACCESS SYNTAX
| read-write InternationalDisplayString (SIZE (0..128))
|
| "This object contains the parameters (e.g. a pathname and parameter) supplied
| to the load device when requesting the initial operating system configuration
| from that device."
|
| DISCUSSION:
|
| (See discussion for "hrSystemInitialLoadDevice" above).
|
| For initial version, we return a zero length string, and it is not SETable.
|
|============================================================================
| 1.3.6.1.2.1.25.1.4.0
| | |
| | *-hrSystemInitialLoadParameters
| *---hrSystem
*/
UINT
GetHrSystemInitialLoadParameters(
OUT InternationalDisplayString *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
// (No parameter-string returned for initial release)
outvalue->length = 0;
outvalue->string = NULL;
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of GetHrSystemInitialLoadParameters() */
/*
* SetHrSystemInitialLoadParameters
* This object contains the paramets (e.g. a pathname and parameter)
* supplied to the load device when requesting the initial operat
*
* Sets the HrSystemInitialLoadParameters value.
*
* Arguments:
*
* invalue address of value to set the variable
* outvalue address to return the set variable value
* access Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_BADVALUE Set value not in range
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtset.ntc v0.10
*/
UINT
SetHrSystemInitialLoadParameters(
IN InternationalDisplayString *invalue ,
OUT InternationalDisplayString *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
return SNMP_ERRORSTATUS_NOSUCHNAME ;
} /* end of SetHrSystemInitialLoadParameters() */
/*
* GetHrSystemNumUsers
* The number of user sessions for which this host is storing state
* information.
*
* Gets the value for HrSystemNumUsers.
*
* Arguments:
*
* outvalue address to return variable value
* accesss Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtget.c v0.10
*
| =============== From WebEnable Design Spec Rev 3 04/11/97==================
| hrSystemNumUsers
|
| ACCESS SYNTAX
| read-only Gauge
|
| "The number of user sessions for which this host is storing state information.
| A session is a collection of processes requiring a single act of user
| authentication and possibly subject to collective job control."
|
| DISCUSSION:
|
| <POA-3> This metric does not seem to be directly available thru a standard
| Win32 API function. I note that what appears to be logon information seems to
| be stored in the registry under:
|
| "HKEY_LOCAL_MACHINE\microsoft\windows nt\winlogon".
|
| + Should I use this as a source for this SNMP attribute?
| + If this registry entry is the proper place to acquire this information, what
| is the full and proper way to parse this entry? (By this I mean if more
| than one user is logged on, how does this single registry entry reflect
| multiple users?)
| + Does it reflect other users logged in via a network connection?
|
| RESOLVED >>>>>>>
| <POA-3> There is going to be either one interactive user or none. Use
| NetWkstaGetInfo to try to determine the name of the currently logged on
| interactive user and if this succeeds then it is the former.
| RESOLVED >>>>>>>
|
|=============================================================================
| 1.3.6.1.2.1.25.1.5.0
| | |
| | *-hrSystemNumUsers
| *---hrSystem
*/
UINT
GetHrSystemNumUsers(
OUT Gauge *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
LPBYTE info; /* Where we get logged-on information */
// Attempt to get the number of logged-on users . . .
if (NetWkstaGetInfo(NULL, /* "Local" computer */
102, /* Info Level 102 */
&info) != NERR_Success) {
return SNMP_ERRORSTATUS_GENERR ;
}
/* Just return it */
*outvalue = ((LPWKSTA_INFO_102) info)->wki102_logged_on_users;
/* Free the Net API Buffer */
NetApiBufferFree(info);
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of GetHrSystemNumUsers() */
/*
* GetHrSystemProcesses
* The number of process contexts currently loaded or running on this system.
*
* Gets the value for HrSystemProcesses.
*
* Arguments:
*
* outvalue address to return variable value
* accesss Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtget.c v0.10
*
|=============== From WebEnable Design Spec Rev 3 04/11/97==================
| hrSystemProcesses
|
| ACCESS SYNTAX
| read-only Gauge
|
| "The number of process contexts currently loaded or running on this system."
|
| DISCUSSION:
|
| The sample-code "Process Viewer" (PVIEWER.EXE) that is part of the Win32 SDK
| infers a list of active processes from performance information that is stored
| in the registry. We use this approach (and borrowed code) to obtaining a
| count of active processes.
|
|-- (The foregoing approach is abandoned for a direct "beyond-the-veil" call
|-- to NtQuerySystemInfo()).
|=============================================================================
| 1.3.6.1.2.1.25.1.6.0
| | |
| | *-hrSystemNumUsers
| *---hrSystem
*/
UINT
GetHrSystemProcesses(
OUT Gauge *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
ULONG process_count;
// If we failed to get the Process Count successfully . . .
if ((process_count = Spt_GetProcessCount()) == 0) {
return SNMP_ERRORSTATUS_GENERR ;
}
// Return the value
*outvalue = process_count;
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of GetHrSystemProcesses() */
/*
* GetHrSystemMaxProcesses
* The maximum number of process contexts this system can support. If there
* is no fixed maximum, the value should be zero.
*
* Gets the value for HrSystemMaxProcesses.
*
* Arguments:
*
* outvalue address to return variable value
* accesss Reserved for future security use
* instance address of instance name as ordered native
* data type(s)
*
* Return Codes:
*
* Standard PDU error codes.
*
* SNMP_ERRORSTATUS_NOERROR Successful get
* SNMP_ERRORSTATUS_GENERR Catch-all failure code
* mibtget.c v0.10
*
|=============== From WebEnable Design Spec Rev 3 04/11/97==================
| hrSystemMaxProcesses
|
| ACCESS SYNTAX
| read-only INTEGER (0..2147483647)
|
| "The maximum number of process contexts this system can support. If there is
| no fixed maximum, the value should be zero. On systems that have a fixed
| maximum, this object can help diagnose failures that occur when this maximum
| is reached."
|
| DISCUSSION:
|
| My understanding is there is no fixed maximum, as the effective maximum is
| main-memory dependent. We return 0 for the value of this attribute.
|
|=============================================================================
| 1.3.6.1.2.1.25.1.7.0
| | |
| | *-hrSystemNumUsers
| *---hrSystem
*/
UINT
GetHrSystemMaxProcesses(
OUT Integer *outvalue ,
IN Access_Credential *access ,
IN InstanceName *instance )
{
*outvalue = 0;
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of GetHrSystemMaxProcesses() */
/*
* HrSystemFindInstance
*
* This routine is used to verify that the specified instance is
* valid.
*
* Arguments:
*
* FullOid Address for the full oid - group, variable,
* and instance information
* instance Address for instance specification as an oid
*
* Return Codes:
*
* SNMP_ERRORSTATUS_NOERROR Instance found and valid
* SNMP_ERRORSTATUS_NOSUCHNAME Invalid instance
*
*/
UINT
HrSystemFindInstance( IN ObjectIdentifier *FullOid ,
IN OUT ObjectIdentifier *instance )
{
UINT tmp_instance ;
//
// Developer instrumentation code to find appropriate instance goes here.
// For non-tables, it is not necessary to modify this routine. However,
// if there is any context that needs to be set, it can be done here.
//
if ( FullOid->idLength <= HRSYSTEM_VAR_INDEX )
// No instance was specified
return SNMP_ERRORSTATUS_NOSUCHNAME ;
else if ( FullOid->idLength != HRSYSTEM_VAR_INDEX + 1 )
// Instance length is more than 1
return SNMP_ERRORSTATUS_NOSUCHNAME ;
else
// The only valid instance for a non-table are instance 0. If this
// is a non-table, the following code validates the instances. If this
// is a table, developer modification is necessary below.
tmp_instance = FullOid->ids[ HRSYSTEM_VAR_INDEX ] ;
if ( tmp_instance )
return SNMP_ERRORSTATUS_NOSUCHNAME ;
else
{
// the instance is valid. Create the instance portion of the OID
// to be returned from this call.
instance->ids[ 0 ] = tmp_instance ;
instance->idLength = 1 ;
}
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of HrSystemFindInstance() */
/*
* HrSystemFindNextInstance
*
* This routine is called to get the next instance. If no instance
* was passed than return the first instance (1).
*
* Arguments:
*
* FullOid Address for the full oid - group, variable,
* and instance information
* instance Address for instance specification as an oid
*
* Return Codes:
*
* SNMP_ERRORSTATUS_NOERROR Instance found and valid
* SNMP_ERRORSTATUS_NOSUCHNAME Invalid instance
*
*/
UINT
HrSystemFindNextInstance( IN ObjectIdentifier *FullOid ,
IN OUT ObjectIdentifier *instance )
{
//
// Developer supplied code to find the next instance of class goes here.
// If this is a class with cardinality 1, no modification of this routine
// is necessary unless additional context needs to be set.
// If the FullOid does not specify an instance, then the only instance
// of the class is returned. If this is a table, the first row of the
// table is returned.
//
// If an instance is specified and this is a non-table class, then NOSUCHNAME
// is returned so that correct MIB rollover processing occurs. If this is
// a table, then the next instance is the one following the current instance.
// If there are no more instances in the table, return NOSUCHNAME.
//
if ( FullOid->idLength <= HRSYSTEM_VAR_INDEX )
{
instance->ids[ 0 ] = 0 ;
instance->idLength = 1 ;
}
else
return SNMP_ERRORSTATUS_NOSUCHNAME ;
return SNMP_ERRORSTATUS_NOERROR ;
} /* end of HrSystemFindNextInstance() */
/*
* HrSystemConvertInstance
*
* This routine is used to convert the object id specification of an
* instance into an ordered native representation. The object id format
* is that object identifier that is returned from the Find Instance
* or Find Next Instance routines. It is NOT the full object identifier
* that contains the group and variable object ids as well. The native
* representation is an argc/argv-like structure that contains the
* ordered variables that define the instance. This is specified by
* the MIB's INDEX clause. See RFC 1212 for information about the INDEX
* clause.
*
*
* Arguments:
*
* oid_spec Address of the object id instance specification
* native_spec Address to return the ordered native instance
* specification
*
* Return Codes:
*
* SUCCESS Conversion complete successfully
* FAILURE Unable to convert object id into native format
*
*/
UINT
HrSystemConvertInstance( IN ObjectIdentifier *oid_spec ,
IN OUT InstanceName *native_spec )
{
//
// Developer supplied code to convert instance identifer to native
// specification of instance names goes here.
//
return SUCCESS ;
} /* end of HrSystemConvertInstance() */
/*
* HrSystemFreeInstance
*
* This routine is used to free an ordered native representation of an
* instance name.
*
* Arguments:
*
* instance Address to return the ordered native instance
* specification
*
* Return Codes:
*
*
*/
void
HrSystemFreeInstance( IN OUT InstanceName *instance )
{
//
// Developer supplied code to free native representation of instance name goes here.
//
} /* end of HrSystemFreeInstance() */