366 lines
11 KiB
C
366 lines
11 KiB
C
/*
|
||
* gendll.c v0.11 March 14, 1996
|
||
*
|
||
****************************************************************************
|
||
* *
|
||
* (C) Copyright 1995, 1996 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:
|
||
*
|
||
* SNMP Extension Agent
|
||
*
|
||
* Abstract:
|
||
*
|
||
* This module contains the code for plugging into the Windows NT Extendible
|
||
* Agent. It contains the dll's main routine and the three exported SNMP
|
||
* routines.
|
||
*
|
||
* Functions:
|
||
*
|
||
* DllMain()
|
||
* SnmpExtensionInit()
|
||
* SnmpExtensionTrap()
|
||
* SnmpExtensionQuery()
|
||
*
|
||
* Author:
|
||
* Miriam Amos Nihart, Kathy Faust
|
||
*
|
||
* Date:
|
||
* 2/17/95
|
||
*
|
||
* Revision History:
|
||
* 6/26/95 KKF, register using Subroot_oid
|
||
* 7/31/95 ags readded above code + uncommented calls to SNMP_oidfree
|
||
* 3/14/96 kkf, modified SNMPExtensionTrap
|
||
*/
|
||
|
||
|
||
|
||
// General notes:
|
||
//
|
||
// Microsoft's Extendible Agent for Windows NT is implemented by dynamically
|
||
// linking to Extension Agent DLLs that implement portions of the MIB. These
|
||
// Extension Agents are configured in the Windows NT Registration Database.
|
||
// When the Extendible Agent Service is started, it queries the registry to
|
||
// determine which Extension Agent DLLs have been installed and need to be
|
||
// loaded and initialized. The Extendible Agent invokes various DLL entry
|
||
// points (examples follow in this file) to request MIB queries and obtain
|
||
// Extension Agent generated traps.
|
||
|
||
|
||
// Necessary includes.
|
||
|
||
#include <windows.h>
|
||
#include <malloc.h>
|
||
#include <stdio.h>
|
||
|
||
#include <snmp.h>
|
||
|
||
//
|
||
// The file mib.h is a user supplied header file (could be from a code
|
||
// generator). This file should contain the definition, macros, forward
|
||
// declarations, etc. The file mib_xtrn.h contains the external
|
||
// declarations for the variable tables and classes composing this MIB.
|
||
//
|
||
|
||
#include "mib.h"
|
||
#include "mib_xtrn.h"
|
||
|
||
|
||
// Extension Agent DLLs need access to the elapsed time that the agent has
|
||
// been active. This is implemented by initializing the Extension Agent
|
||
// with a time zero reference, and allowing the agent to compute elapsed
|
||
// time by subtracting the time zero reference from the current system time.
|
||
// This example Extension Agent implements this reference with dwTimeZero.
|
||
|
||
DWORD dwTimeZero = 0 ;
|
||
extern DWORD dwTimeZero ;
|
||
|
||
//
|
||
// Trap Queue
|
||
//
|
||
|
||
q_hdr_t trap_q = { NULL, NULL } ;
|
||
|
||
extern q_hdr_t trap_q ; // make it global
|
||
HANDLE hTrapQMutex ;
|
||
extern HANDLE hTrapQMutex ;
|
||
HANDLE hEnabledTraps ;
|
||
extern HANDLE hEnabledTraps ;
|
||
|
||
|
||
|
||
/*
|
||
* DllMain
|
||
*
|
||
* This is a standard Win32 DLL entry point. See the Win32 SDK for more
|
||
* information on its arguments and their meanings. This example DLL does
|
||
* not perform any special actions using this mechanism.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* Results:
|
||
*
|
||
* Side Effects:
|
||
*
|
||
*/
|
||
|
||
BOOL WINAPI
|
||
DllMain( HINSTANCE hInstDLL,
|
||
DWORD dwReason ,
|
||
LPVOID lpReserved )
|
||
{
|
||
|
||
switch( dwReason )
|
||
{
|
||
case DLL_PROCESS_ATTACH :
|
||
DisableThreadLibraryCalls( hInstDLL );
|
||
break;
|
||
case DLL_PROCESS_DETACH :
|
||
case DLL_THREAD_ATTACH :
|
||
case DLL_THREAD_DETACH :
|
||
default :
|
||
break ;
|
||
|
||
}
|
||
|
||
return TRUE ;
|
||
|
||
} /* end of DllMain() (the DllEntryPoint) */
|
||
|
||
|
||
|
||
/*
|
||
* SnmpExtensionInit
|
||
*
|
||
* Extension Agent DLLs provide the following entry point to coordinate the
|
||
* initializations of the Extension Agent and the Extendible Agent. The
|
||
* Extendible Agent provides the Extension Agent with a time zero reference;
|
||
* and the Extension Agent provides the Extendible Agent with an Event
|
||
* handle for communicating occurence of traps, and an object identifier
|
||
* representing the root of the MIB subtree that the Extension Agent
|
||
* supports.
|
||
*
|
||
* Traps support is determined by the user in the UserMibInit() routine.
|
||
* If a valid handle from CreateEvent() is returned in the argument
|
||
* hPollForTrapEvent, then traps have been implemented and the SNMP
|
||
* Extendible Agent will poll this Extension Agent to retrieve the traps
|
||
* upon notification through the SetEvent() routine. Polling is done
|
||
* through the SnmpExtensionTrap() routine. If NULL is returned in the
|
||
* argument hPollForTrapEvent, there are no traps.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* Results:
|
||
*
|
||
*/
|
||
|
||
BOOL WINAPI
|
||
SnmpExtensionInit( IN DWORD dwTimeZeroReference ,
|
||
OUT HANDLE *hPollForTrapEvent ,
|
||
OUT AsnObjectIdentifier *supportedView )
|
||
{
|
||
|
||
// Record the time reference provided by the Extendible Agent.
|
||
|
||
dwTimeZero = dwTimeZeroReference ;
|
||
|
||
|
||
// Indicate the MIB view supported by this Extension Agent, an object
|
||
// identifier representing the sub root of the MIB that is supported.
|
||
|
||
*supportedView = Subroot_oid ; // NOTE! structure copy
|
||
// *supportedView = *(class_info[ 0 ].oid) ; // NOTE! structure copy
|
||
|
||
// Call the User's initialization routine
|
||
|
||
if ( !UserMibInit( hPollForTrapEvent ) )
|
||
return FALSE ;
|
||
|
||
// Indicate that Extension Agent initialization was successful.
|
||
|
||
return TRUE ;
|
||
|
||
} /* end of SnmpExtensionInit() */
|
||
|
||
|
||
|
||
/*
|
||
* SnmpExtensionTrap
|
||
*
|
||
* Extension Agent DLLs provide the following entry point to communicate
|
||
* traps to the Extendible Agent. The Extendible Agent will query this
|
||
* entry point when the trap Event (supplied at initialization time) is
|
||
* asserted, which indicates that zero or more traps may have occured.
|
||
* The Extendible Agent will repetedly call this entry point until FALSE
|
||
* is returned, indicating that all outstanding traps have been processed.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* Results:
|
||
*
|
||
|=========================================================================
|
||
| There are no Traps associated with the HostMIB. Consequently this
|
||
| routine is taken over and used to refresh the cached information
|
||
| associated with SNMP attribute "hrProcessorLoad" (in "HRPROCES.C") thru
|
||
| a call to function "hrProcessLoad_Refresh()" (also in "HRPROCES.C").
|
||
|
|
||
| This function is being entered because a timer has expired that was
|
||
| initialized by code in "TrapInit()" (in "GENNT.C"). The timer automatically
|
||
| resets itself.
|
||
|
|
||
| All the standard generated code is subsumed by a simple call to
|
||
| "hrProcessLoad_Refresh()".
|
||
*/
|
||
|
||
BOOL WINAPI
|
||
SnmpExtensionTrap( OUT AsnObjectIdentifier *enterprise ,
|
||
OUT AsnInteger *genericTrap ,
|
||
OUT AsnInteger *specificTrap ,
|
||
OUT AsnTimeticks *timeStamp ,
|
||
OUT RFC1157VarBindList *variableBindings )
|
||
{
|
||
#if 0
|
||
tcb_t *entry ;
|
||
|
||
// Traps are process by processing the traps on the trap queue.
|
||
// The Extendible Agent will call this routine upon the receipt of
|
||
// the event on the handle passed back in the SnmpExtensionInit routine.
|
||
// The Extendible Agent calls this return back as long as this routine
|
||
// returns true.
|
||
|
||
// acquire mutex for trap_q
|
||
WaitForSingleObject( hTrapQMutex, INFINITE ) ;
|
||
|
||
// Dequeue a trap entry
|
||
|
||
QUEUE_REMOVE( trap_q, entry ) ;
|
||
|
||
// release the mutex for trap_q
|
||
ReleaseMutex( hTrapQMutex ) ;
|
||
|
||
if (entry == NULL)
|
||
return FALSE ;
|
||
|
||
*enterprise = entry->enterprise ; // note structure copy
|
||
*genericTrap = entry->genericTrap ;
|
||
*specificTrap = entry->specificTrap ;
|
||
*timeStamp = entry->timeStamp ;
|
||
*variableBindings = entry->varBindList ; // note structure copy
|
||
free(entry) ;
|
||
return TRUE ;
|
||
#endif
|
||
|
||
/*
|
||
|========================
|
||
| Special HostMIB code:
|
||
*/
|
||
/* Re-fetch CPU statistics from kernel */
|
||
hrProcessLoad_Refresh();
|
||
|
||
/* Don't call again until the timer goes off again */
|
||
return FALSE;
|
||
|
||
} /* end of SnmpExtensionTrap() */
|
||
|
||
|
||
|
||
/*
|
||
* SnmpExtensionQuery
|
||
*
|
||
* Extension Agent DLLs provide the following entry point to resolve queries
|
||
* for MIB variables in their supported MIB view (supplied at initialization
|
||
* time). The requestType is Get/GetNext/Set.
|
||
*
|
||
* Arguments:
|
||
*
|
||
* Results:
|
||
*
|
||
*/
|
||
|
||
|
||
BOOL WINAPI
|
||
SnmpExtensionQuery( IN BYTE requestType ,
|
||
IN OUT RFC1157VarBindList *variableBindings ,
|
||
OUT AsnInteger *errorStatus ,
|
||
OUT AsnInteger *errorIndex )
|
||
{
|
||
UINT index ;
|
||
UINT *tmp ;
|
||
UINT status ;
|
||
|
||
|
||
// Iterate through the variable bindings list to resolve individual
|
||
// variable bindings.
|
||
|
||
for ( index = 0 ; index < variableBindings->len ; index++ )
|
||
{
|
||
*errorStatus = ResolveVarBind( &variableBindings->list[ index ] ,
|
||
requestType ) ;
|
||
|
||
|
||
// Test and handle case where Get Next past end of MIB view supported
|
||
// by this Extension Agent occurs. Special processing is required to
|
||
// communicate this situation to the Extendible Agent so it can take
|
||
// appropriate action, possibly querying other Extension Agents.
|
||
|
||
if ( *errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME &&
|
||
requestType == MIB_ACTION_GETNEXT )
|
||
{
|
||
*errorStatus = SNMP_ERRORSTATUS_NOERROR ;
|
||
|
||
// Modify variable binding of such variables so the OID points
|
||
// just outside the MIB view supported by this Extension Agent.
|
||
// The Extendible Agent tests for this, and takes appropriate
|
||
// action.
|
||
|
||
SNMP_oidfree( &variableBindings->list[ index ].name ) ;
|
||
status = SNMP_oidcpy( &variableBindings->list[ index ].name, &Subroot_oid ) ;
|
||
if ( !status )
|
||
{
|
||
*errorStatus = SNMP_ERRORSTATUS_GENERR;
|
||
}
|
||
else
|
||
{
|
||
tmp = variableBindings->list[ index ].name.ids ;
|
||
(tmp[ SUBROOT_LENGTH - 1 ])++ ;
|
||
}
|
||
}
|
||
|
||
|
||
// If an error was indicated, communicate error status and error
|
||
// index to the Extendible Agent. The Extendible Agent will ensure
|
||
// that the origional variable bindings are returned in the response
|
||
// packet.
|
||
|
||
if ( *errorStatus != SNMP_ERRORSTATUS_NOERROR )
|
||
{
|
||
*errorIndex = index + 1 ;
|
||
goto Exit ;
|
||
}
|
||
}
|
||
|
||
Exit:
|
||
|
||
// Indicate that Extension Agent processing was sucessfull.
|
||
|
||
return SNMPAPI_NOERROR ;
|
||
|
||
} /* end of SnmpExtensionQuery() */
|
||
|
||
/* end of gendll.c */
|