/////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1998, Microsoft Corp. All rights reserved. // // FILE // // snmputil.cpp // // SYNOPSIS // // Defines utility functions for computing MIB variables. // // MODIFICATION HISTORY // // 09/11/1998 Original version. // 02/18/1999 Move registry values. // /////////////////////////////////////////////////////////////////////////////// #include #include #include #include const CHAR SERVER_IDENTITY[] = "Microsoft IAS2.0"; VOID WINAPI GetServerIdentity( OUT AsnAny* value ) { value->asnType = ASN_OCTETSTRING; value->asnValue.string.stream = (PBYTE)SERVER_IDENTITY; value->asnValue.string.length = sizeof(SERVER_IDENTITY); value->asnValue.string.dynamic = FALSE; } VOID WINAPI GetServerUpTime( OUT AsnAny* value ) { LARGE_INTEGER elapsed; if (theStats->seServer.liStartTime.QuadPart) { GetSystemTimeAsFileTime((LPFILETIME)&elapsed); elapsed.QuadPart -= theStats->seServer.liStartTime.QuadPart; elapsed.QuadPart /= 100000i64; } else { elapsed.LowPart = 0; } value->asnType = ASN_GAUGE32; value->asnValue.gauge = elapsed.LowPart; } VOID WINAPI GetServerResetTime( OUT AsnAny* value ) { LARGE_INTEGER elapsed; if (theStats->seServer.liResetTime.QuadPart) { GetSystemTimeAsFileTime((LPFILETIME)&elapsed); elapsed.QuadPart -= theStats->seServer.liResetTime.QuadPart; elapsed.QuadPart /= 100000i64; } else { elapsed.LowPart = 0; } value->asnType = ASN_GAUGE32; value->asnValue.gauge = elapsed.LowPart; } extern "C" SC_HANDLE GetServiceHandle( VOID ) { static SC_HANDLE scm, service; if (!service) { if (!scm) { scm = OpenSCManager(NULL, NULL, GENERIC_READ); } service = OpenServiceW( scm, IASServiceName, SERVICE_QUERY_STATUS | SERVICE_START | SERVICE_USER_DEFINED_CONTROL ); } return service; } VOID WINAPI GetServerConfigReset( OUT AsnAny* value ) { value->asnType = ASN_INTEGER32; value->asnValue.number = 1; SERVICE_STATUS status; if (QueryServiceStatus(GetServiceHandle(), &status)) { switch (status.dwCurrentState) { case SERVICE_START_PENDING: value->asnValue.number = 3; break; case SERVICE_RUNNING: value->asnValue.number = 4; } } } AsnInteger32 WINAPI SetServerConfigReset( IN AsnAny* value ) { static BOOL allowSet, initialized; if (!initialized) { LONG status; HKEY hKey; status = RegOpenKeyW( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\IAS\\Parameters", &hKey ); if (status == NO_ERROR) { DWORD type, data(0), cbData(sizeof(data)); status = RegQueryValueExW( hKey, L"Allow SNMP Set", NULL, &type, (LPBYTE)&data, &cbData ); if (status == NO_ERROR && type == REG_DWORD && data > 0) { allowSet = TRUE; } RegCloseKey(hKey); } initialized = TRUE; } if (!allowSet) { return SNMP_ERRORSTATUS_AUTHORIZATIONERROR; } if (value->asnType != ASN_INTEGER32) { return SNMP_ERRORSTATUS_WRONGTYPE; } if (value->asnValue.number != 2) { return SNMP_ERRORSTATUS_WRONGVALUE; } SC_HANDLE service = GetServiceHandle(); if (!service) { return SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE; } SERVICE_STATUS status; if (StartService(service, 0, NULL) || ControlService(service, 128, &status)) { return SNMP_ERRORSTATUS_NOERROR; } return SNMP_ERRORSTATUS_RESOURCEUNAVAILABLE; } VOID WINAPI GetTotalCounter( IN RadiusClientCounter counter, OUT AsnAny* value ) { value->asnType = ASN_COUNTER32; value->asnValue.counter = 0; for (DWORD i = 0; i < theStats->dwNumClients; ++i) { value->asnValue.counter += theStats->ceClients[i].dwCounters[counter]; } } VOID WINAPI GetServerCounter( IN RadiusServerCounter counter, OUT AsnAny* value ) { value->asnType = ASN_COUNTER32; value->asnValue.counter = theStats->seServer.dwCounters[counter]; } VOID WINAPI GetClientAddress( IN UINT client, OUT AsnAny* value ) { value->asnType = ASN_IPADDRESS; value->asnValue.string.stream = (PBYTE)SnmpUtilMemAlloc(4); if (value->asnValue.string.stream) { IASInsertDWORD(value->asnValue.string.stream, theStats->ceClients[client].dwAddress); value->asnValue.string.length = 4; value->asnValue.string.dynamic = TRUE; } else { value->asnValue.string.length = 0; value->asnValue.string.dynamic = FALSE; } } VOID WINAPI GetClientIdentity( IN UINT client, OUT AsnAny* value ) { value->asnType = ASN_OCTETSTRING; value->asnValue.string.stream = NULL; value->asnValue.string.length = 0; value->asnValue.string.dynamic = FALSE; } VOID WINAPI GetClientCounter( IN UINT client, IN RadiusClientCounter counter, OUT AsnAny* value ) { value->asnType = ASN_COUNTER32; value->asnValue.counter = theStats->ceClients[client].dwCounters[counter]; }