|
|
1.1 root 1: /*++ BUILD Version: 0001 // Increment this if a change has global effects
2:
3: Copyright (c) 1991 Microsoft Corporation
4:
5: Module Name:
6:
7: testdll.c
8:
9: Abstract:
10:
11: Sample SNMP Extension Agent for Windows NT.
12:
13: These files (testdll.c, testmib.c, and testmib.h) provide an example of
14: how to structure an Extension Agent DLL which works in conjunction with
15: the SNMP Extendible Agent for Windows NT.
16:
17: Extensive comments have been included to describe its structure and
18: operation. See also "Microsoft Windows/NT SNMP Programmer's Reference".
19:
20: Created:
21:
22: 28-Jun-1991
23:
24: Revision History:
25:
26: --*/
27:
28:
29: static char *vcsid = "@(#) $Logfile: N:/xtest/vcs/testdll.c_v $ $Revision: 1.6 $";
30:
31:
32: // General notes:
33: //
34: // Microsoft's Extendible Agent for Windows NT is implemented by dynamically
35: // linking to Extension Agent DLLs that implement portions of the MIB. These
36: // Extension Agents are configured in the Windows NT Registration Database.
37: // When the Extendible Agent Service is started, it queries the registry to
38: // determine which Extension Agent DLLs have been installed and need to be
39: // loaded and initialized. The Extendible Agent invokes various DLL entry
40: // points (examples follow in this file) to request MIB queries and obtain
41: // Extension Agent generated traps.
42:
43:
44: // Necessary includes.
45:
46: #include <windows.h>
47: #include <malloc.h>
48:
49: #include <snmp.h>
50:
51:
52: // Contains definitions for the table structure describing the MIB. This
53: // is used in conjunction with testmib.c where the MIB requests are resolved.
54:
55: #include "testmib.h"
56:
57:
58: // Extension Agent DLLs need access to elapsed time agent has been active.
59: // This is implemented by initializing the Extension Agent with a time zero
60: // reference, and allowing the agent to compute elapsed time by subtracting
61: // the time zero reference from the current system time. This example
62: // Extension Agent implements this reference with dwTimeZero.
63:
64: DWORD dwTimeZero = 0;
65:
66:
67: // Extension Agent DLLs that generate traps must create a Win32 Event object
68: // to communicate occurence of traps to the Extendible Agent. The event
69: // handle is given to the Extendible Agent when the Extension Agent is
70: // initialized, it should be NULL if traps will not be generated. This
71: // example Extension Agent simulates the occurance of traps with hSimulateTrap.
72:
73: HANDLE hSimulateTrap = NULL;
74:
75:
76: // This is a standard Win32 DLL entry point. See the Win32 SDK for more
77: // information on its arguments and their meanings. This example DLL does
78: // not perform any special actions using this mechanism.
79:
80: BOOL WINAPI DllMain(
81: HANDLE hDll,
82: DWORD dwReason,
83: LPVOID lpReserved)
84: {
85: switch(dwReason)
86: {
87: case DLL_PROCESS_ATTACH:
88: case DLL_PROCESS_DETACH:
89: case DLL_THREAD_ATTACH:
90: case DLL_THREAD_DETACH:
91: default:
92: break;
93:
94: } // end switch()
95:
96: return TRUE;
97:
98: } // end DllEntryPoint()
99:
100:
101: // Extension Agent DLLs provide the following entry point to coordinate the
102: // initializations of the Extension Agent and the Extendible Agent. The
103: // Extendible Agent provides the Extension Agent with a time zero reference;
104: // and the Extension Agent provides the Extendible Agent with an Event handle
105: // for communicating occurence of traps, and an object identifier representing
106: // the root of the MIB subtree that the Extension Agent supports.
107:
108: BOOL SnmpExtensionInit(
109: IN DWORD dwTimeZeroReference,
110: OUT HANDLE *hPollForTrapEvent,
111: OUT AsnObjectIdentifier *supportedView)
112: {
113:
114: // Record the time reference provided by the Extendible Agent.
115:
116: dwTimeZero = dwTimeZeroReference;
117:
118:
119: // Create an Event that will be used to communicate the occurence of traps
120: // to the Extendible Agent. The Extension Agent will assert this Event
121: // when a trap has occured. This is explained further later in this file.
122:
123: if ((*hPollForTrapEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL)
124: {
125: // Indicate error?, be sure that NULL is returned to Extendible Agent.
126: }
127:
128:
129: // Indicate the MIB view supported by this Extension Agent, an object
130: // identifier representing the sub root of the MIB that is supported.
131:
132: *supportedView = MIB_OidPrefix; // NOTE! structure copy
133:
134:
135: // Record the trap Event. This example Extension Agent simulates traps by
136: // generating a trap after every given number of processed requests.
137:
138: hSimulateTrap = *hPollForTrapEvent;
139:
140:
141: // Indicate that Extension Agent initialization was sucessfull.
142:
143: return TRUE;
144:
145: } // end SnmpExtensionInit()
146:
147:
148: // Extension Agent DLLs provide the following entry point to communcate traps
149: // to the Extendible Agent. The Extendible Agent will query this entry point
150: // when the trap Event (supplied at initialization time) is asserted, which
151: // indicates that zero or more traps may have occured. The Extendible Agent
152: // will repetedly call this entry point until FALSE is returned, indicating
153: // that all outstanding traps have been processed.
154:
155: BOOL SnmpExtensionTrap(
156: OUT AsnObjectIdentifier *enterprise,
157: OUT AsnInteger *genericTrap,
158: OUT AsnInteger *specificTrap,
159: OUT AsnTimeticks *timeStamp,
160: OUT RFC1157VarBindList *variableBindings)
161: {
162: // The body of this routine is an extremely simple example/simulation of
163: // the trap functionality. A real implementation will be more complex.
164:
165:
166: // The following define data inserted into the trap below. The Lan Manager
167: // bytesAvailAlert from the Lan Manager Alerts-2 MIB is generated with an
168: // empty variable bindings list.
169:
170: static UINT OidList[] = { 1, 3, 6, 1, 4, 1, 77, 2 };
171: static UINT OidListLen = 8;
172:
173:
174: // The following variable is used for the simulation, it allows a single
175: // trap to be generated and then causes FALSE to be returned indicating
176: // no more traps.
177:
178: static whichTime = 0;
179:
180:
181: // The following if/else support the simulation.
182:
183: if (whichTime == 0)
184: {
185: whichTime = 1; // Supports the simulation.
186:
187:
188: // Communicate the trap data to the Extendible Agent.
189:
190: enterprise->idLength = OidListLen;
191: enterprise->ids = (UINT *)malloc(sizeof(UINT) * OidListLen);
192: memcpy(enterprise->ids, OidList, sizeof(UINT) * OidListLen);
193:
194: *genericTrap = SNMP_GENERICTRAP_ENTERSPECIFIC;
195:
196: *specificTrap = 1; // the bytesAvailAlert trap
197:
198: *timeStamp = GetCurrentTime() - dwTimeZero;
199:
200: variableBindings->list = NULL;
201: variableBindings->len = 0;
202:
203:
204: // Indicate that valid trap data exists in the parameters.
205:
206: return TRUE;
207: }
208: else
209: {
210: whichTime = 0; // Supports the simulation.
211:
212:
213: // Indicate that no more traps are available and parameters do not
214: // refer to any valid data.
215:
216: return FALSE;
217: }
218:
219: } // end SnmpExtensionTrap()
220:
221:
222: // Extension Agent DLLs provide the following entry point to resolve queries
223: // for MIB variables in their supported MIB view (supplied at initialization
224: // time). The requestType is Get/GetNext/Set.
225:
226: BOOL SnmpExtensionQuery(
227: IN BYTE requestType,
228: IN OUT RFC1157VarBindList *variableBindings,
229: OUT AsnInteger *errorStatus,
230: OUT AsnInteger *errorIndex)
231: {
232: static unsigned long requestCount = 0; // Supports the trap simulation.
233: UINT I;
234:
235:
236: // Iterate through the variable bindings list to resolve individual
237: // variable bindings.
238:
239: for ( I=0;I < variableBindings->len;I++ )
240: {
241: *errorStatus = ResolveVarBind( &variableBindings->list[I],
242: requestType );
243:
244:
245: // Test and handle case where Get Next past end of MIB view supported
246: // by this Extension Agent occurs. Special processing is required to
247: // communicate this situation to the Extendible Agent so it can take
248: // appropriate action, possibly querying other Extension Agents.
249:
250: if ( *errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME &&
251: requestType == MIB_ACTION_GETNEXT )
252: {
253: *errorStatus = SNMP_ERRORSTATUS_NOERROR;
254:
255:
256: // Modify variable binding of such variables so the OID points
257: // just outside the MIB view supported by this Extension Agent.
258: // The Extendible Agent tests for this, and takes appropriate
259: // action.
260:
261: SNMP_oidfree( &variableBindings->list[I].name );
262: SNMP_oidcpy( &variableBindings->list[I].name, &MIB_OidPrefix );
263: variableBindings->list[I].name.ids[MIB_PREFIX_LEN-1] ++;
264: }
265:
266:
267: // If an error was indicated, communicate error status and error
268: // index to the Extendible Agent. The Extendible Agent will ensure
269: // that the origional variable bindings are returned in the response
270: // packet.
271:
272: if ( *errorStatus != SNMP_ERRORSTATUS_NOERROR )
273: {
274: *errorIndex = I+1;
275: goto Exit;
276: }
277: }
278:
279: Exit:
280:
281:
282: // Supports the trap simulation.
283:
284: if (++requestCount % 3 == 0 && hSimulateTrap != NULL)
285: SetEvent(hSimulateTrap);
286:
287:
288: // Indicate that Extension Agent processing was sucessfull.
289:
290: return SNMPAPI_NOERROR;
291:
292: } // end SnmpExtensionQuery()
293:
294:
295: //-------------------------------- END --------------------------------------
296:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.