mirror of https://github.com/tongzx/nt5src
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.
1756 lines
62 KiB
1756 lines
62 KiB
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1993 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
perfnntp.c
|
|
|
|
This file implements the Extensible Performance Objects for
|
|
the NNTP Server service.
|
|
|
|
|
|
FILE HISTORY:
|
|
KeithMo 07-Jun-1993 Created, based on RussBl's sample code.
|
|
|
|
*/
|
|
|
|
#define INITGUID
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <windows.h>
|
|
#include <winperf.h>
|
|
#include <lm.h>
|
|
|
|
#include <string.h>
|
|
//#include <wcstr.h>
|
|
|
|
#include <nntpctrs.h>
|
|
#include <perfmsg.h>
|
|
#include <nntps.h>
|
|
#include <nntptype.h>
|
|
#include <nntpapi.h>
|
|
|
|
extern "C" {
|
|
#include <perfutil.h>
|
|
#include <nntpdata.h>
|
|
}
|
|
|
|
#include <ole2.h>
|
|
#include "iadm.h"
|
|
|
|
#define APP_NAME (TEXT("NntpCtrs"))
|
|
#define MAX_SIZEOF_INSTANCE_NAME 128
|
|
#define TOTAL_INSTANCE_NAME L"_Total"
|
|
|
|
//
|
|
// Private constants.
|
|
//
|
|
|
|
#if DBG
|
|
|
|
#undef IF_DEBUG
|
|
#define IF_DEBUG(flag) if ( NntpDebug & TCP_ ## flag )
|
|
|
|
#undef DBG_CONTEXT
|
|
#define DBG_CONTEXT NULL
|
|
|
|
#define TCP_ENTRYPOINTS 0x00001000
|
|
#define TCP_COLLECT 0X00002000
|
|
#endif //DBG
|
|
|
|
//
|
|
// Private globals.
|
|
//
|
|
|
|
DWORD cOpens = 0; // Active "opens" reference count.
|
|
BOOL fInitOK = FALSE; // TRUE if DLL initialized OK.
|
|
|
|
IMSAdminBaseW * g_pAdminBase = NULL;
|
|
|
|
#if DBG
|
|
DWORD NntpDebug = 0; // Debug behaviour flags.
|
|
#endif // DBG
|
|
|
|
//
|
|
// Private prototypes.
|
|
//
|
|
VOID
|
|
CopyStatisticsData1(
|
|
IN NNTP_STATISTICS_0 * pNntpStats,
|
|
OUT NNTP_COUNTER_BLOCK1 * pCounterBlock
|
|
);
|
|
|
|
VOID
|
|
CopyStatisticsData2(
|
|
IN NNTP_STATISTICS_0 * pNntpStats,
|
|
OUT NNTP_COUNTER_BLOCK2 * pCounterBlock
|
|
);
|
|
|
|
VOID
|
|
Update_TotalStatisticsData1(
|
|
IN NNTP_COUNTER_BLOCK1 * pCounterBlock,
|
|
OUT NNTP_COUNTER_BLOCK1 * pTotal
|
|
);
|
|
|
|
VOID
|
|
Update_TotalStatisticsData2(
|
|
IN NNTP_COUNTER_BLOCK2 * pCounterBlock,
|
|
OUT NNTP_COUNTER_BLOCK2 * pTotal
|
|
);
|
|
|
|
VOID
|
|
UpdateNameAndHelpIndicies(
|
|
IN DWORD dwFirstCounter,
|
|
IN DWORD dwFirstHelp
|
|
);
|
|
|
|
HRESULT
|
|
InitAdminBase();
|
|
|
|
VOID
|
|
UninitAdminBase();
|
|
|
|
HRESULT
|
|
OpenAdminBaseKey(
|
|
OUT METADATA_HANDLE *phHandle
|
|
);
|
|
|
|
VOID
|
|
CloseAdminBaseKey(
|
|
IN METADATA_HANDLE hHandle
|
|
);
|
|
|
|
|
|
//
|
|
// Public prototypes.
|
|
//
|
|
|
|
PM_OPEN_PROC OpenNntpPerformanceData;
|
|
PM_COLLECT_PROC CollectNntpPerformanceData;
|
|
PM_CLOSE_PROC CloseNntpPerformanceData;
|
|
|
|
|
|
//
|
|
// Public functions.
|
|
//
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: OpenNntpPerformanceData
|
|
|
|
SYNOPSIS: Initializes the data structures used to communicate
|
|
performance counters with the registry.
|
|
|
|
ENTRY: lpDeviceNames - Poitner to object ID of each device
|
|
to be opened.
|
|
|
|
RETURNS: DWORD - Win32 status code.
|
|
|
|
HISTORY:
|
|
KeithMo 07-Jun-1993 Created.
|
|
|
|
********************************************************************/
|
|
DWORD
|
|
OpenNntpPerformanceData(
|
|
LPWSTR lpDeviceNames
|
|
)
|
|
{
|
|
DWORD err = NO_ERROR;
|
|
HKEY hkey = NULL;
|
|
DWORD size;
|
|
DWORD type;
|
|
DWORD dwFirstCounter;
|
|
DWORD dwFirstHelp;
|
|
//PERF_COUNTER_DEFINITION * pctr;
|
|
|
|
//
|
|
// Since SCREG is multi-threaded and will call this routine in
|
|
// order to service remote performance queries, this library
|
|
// must keep track of how many times it has been opened (i.e.
|
|
// how many threads have accessed it). The registry routines will
|
|
// limit access to the initialization routine to only one thread
|
|
// at a time so synchronization (i.e. reentrancy) should not be
|
|
// a problem.
|
|
//
|
|
|
|
if( !fInitOK ) {
|
|
|
|
//
|
|
// This is the *first* open.
|
|
//
|
|
|
|
//
|
|
// Open the NNTP Server service's Performance key.
|
|
//
|
|
|
|
err = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
|
|
NNTP_PERFORMANCE_KEY,
|
|
0,
|
|
KEY_READ,
|
|
&hkey );
|
|
|
|
if( err == NO_ERROR )
|
|
{
|
|
//
|
|
// Read the first counter DWORD.
|
|
//
|
|
|
|
size = sizeof(DWORD);
|
|
|
|
err = RegQueryValueEx( hkey,
|
|
"First Counter",
|
|
NULL,
|
|
&type,
|
|
(LPBYTE)&dwFirstCounter,
|
|
&size );
|
|
}
|
|
|
|
if( err == NO_ERROR )
|
|
{
|
|
//
|
|
// Read the first help DWORD.
|
|
//
|
|
|
|
size = sizeof(DWORD);
|
|
|
|
err = RegQueryValueEx( hkey,
|
|
"First Help",
|
|
NULL,
|
|
&type,
|
|
(LPBYTE)&dwFirstHelp,
|
|
&size );
|
|
}
|
|
|
|
if ( err == NO_ERROR ) {
|
|
|
|
//
|
|
// Update the object & counter name & help indicies.
|
|
//
|
|
|
|
UpdateNameAndHelpIndicies( dwFirstCounter, dwFirstHelp );
|
|
|
|
//
|
|
// Remember that we initialized OK.
|
|
//
|
|
|
|
fInitOK = TRUE;
|
|
}
|
|
|
|
//
|
|
// Close the registry if we managed to actually open it.
|
|
//
|
|
|
|
if( hkey != NULL )
|
|
{
|
|
RegCloseKey( hkey );
|
|
hkey = NULL;
|
|
}
|
|
|
|
g_pAdminBase = NULL;
|
|
}
|
|
|
|
//
|
|
// Bump open counter.
|
|
//
|
|
|
|
cOpens++;
|
|
|
|
return NO_ERROR;
|
|
|
|
} // OpenNntpPerformanceData
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: CollectNntpPerformanceData
|
|
|
|
SYNOPSIS: Initializes the data structures used to communicate
|
|
|
|
ENTRY: lpValueName - The name of the value to retrieve.
|
|
|
|
lppData - On entry contains a pointer to the buffer to
|
|
receive the completed PerfDataBlock & subordinate
|
|
structures. On exit, points to the first bytes
|
|
*after* the data structures added by this routine.
|
|
|
|
lpcbTotalBytes - On entry contains a pointer to the
|
|
size (in BYTEs) of the buffer referenced by lppData.
|
|
On exit, contains the number of BYTEs added by this
|
|
routine.
|
|
|
|
lpNumObjectTypes - Receives the number of objects added
|
|
by this routine.
|
|
|
|
RETURNS: DWORD - Win32 status code. MUST be either NO_ERROR
|
|
or ERROR_MORE_DATA.
|
|
|
|
HISTORY:
|
|
KeithMo 07-Jun-1993 Created.
|
|
|
|
********************************************************************/
|
|
DWORD CollectNntpPerformanceData(
|
|
LPWSTR lpValueName,
|
|
LPVOID * lppData,
|
|
LPDWORD lpcbTotalBytes,
|
|
LPDWORD lpNumObjectTypes
|
|
)
|
|
{
|
|
PERF_INSTANCE_DEFINITION *pPerfInstanceDefinition;
|
|
DWORD dwInstanceIndex = 0;
|
|
DWORD dwInstanceCount = 0;
|
|
DWORD dwCount = 0;
|
|
DWORD i = 0;
|
|
DWORD dwQueryType;
|
|
ULONG cbRequired;
|
|
//DWORD *pdwCounter;
|
|
//LARGE_INTEGER *pliCounter;
|
|
NNTP_COUNTER_BLOCK1 *pCounterBlock1;
|
|
NNTP_COUNTER_BLOCK1 *pTotal1;
|
|
NNTP_COUNTER_BLOCK2 *pCounterBlock2;
|
|
NNTP_COUNTER_BLOCK2 *pTotal2;
|
|
NNTP_DATA_DEFINITION_OBJECT1 *pNntpDataDefinitionObject1;
|
|
NNTP_DATA_DEFINITION_OBJECT2 *pNntpDataDefinitionObject2;
|
|
NNTP_STATISTICS_0 *pNntpStats;
|
|
NET_API_STATUS neterr;
|
|
HRESULT hresErr;
|
|
DWORD dwRetCode = NO_ERROR;
|
|
METADATA_HANDLE hObjHandle = 0;
|
|
WCHAR wszKeyName[METADATA_MAX_NAME_LEN];
|
|
|
|
|
|
//
|
|
// No need to even try if we failed to open...
|
|
//
|
|
|
|
if( !fInitOK )
|
|
{
|
|
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
//
|
|
// According to the Performance Counter design, this
|
|
// is a successful exit. Go figure.
|
|
//
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
//
|
|
// Determine the query type.
|
|
//
|
|
|
|
dwQueryType = GetQueryType( lpValueName );
|
|
|
|
if( dwQueryType == QUERY_FOREIGN )
|
|
{
|
|
//
|
|
// We don't do foreign queries.
|
|
//
|
|
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
if( dwQueryType == QUERY_ITEMS )
|
|
{
|
|
//
|
|
// The registry is asking for a specific object. Let's
|
|
// see if we're one of the chosen.
|
|
//
|
|
|
|
if( !IsNumberInUnicodeList(
|
|
NntpDataDefinitionObject1.NntpObjectType.ObjectNameTitleIndex,
|
|
lpValueName ) &&
|
|
!IsNumberInUnicodeList(
|
|
NntpDataDefinitionObject2.NntpObjectType.ObjectNameTitleIndex,
|
|
lpValueName )
|
|
)
|
|
{
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
return NO_ERROR;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Enumerate and get total number of instances count.
|
|
//
|
|
|
|
hresErr = OpenAdminBaseKey(
|
|
&hObjHandle
|
|
);
|
|
|
|
if( FAILED(hresErr) )
|
|
{
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
//
|
|
// loop through instance keys and find out total number of instances
|
|
//
|
|
|
|
while( SUCCEEDED(hresErr = g_pAdminBase->EnumKeys( hObjHandle,
|
|
NULL,
|
|
wszKeyName,
|
|
dwInstanceIndex))) {
|
|
dwInstanceIndex++;
|
|
|
|
if( _wtoi(wszKeyName) == 0 ) {
|
|
continue;
|
|
}
|
|
|
|
dwInstanceCount++;
|
|
}
|
|
|
|
|
|
//
|
|
// add 1 to dwInstanceCount for _Total instance
|
|
//
|
|
|
|
dwInstanceCount++;
|
|
|
|
//
|
|
// always return an "instance sized" buffer after the definition
|
|
// blocks to prevent perfmon from reading bogus data. This is strictly
|
|
// a hack to accomodate how PERFMON handles the "0" instance case.
|
|
// By doing this, perfmon won't choke when there are no instances
|
|
// and the counter object & counters will be displayed in the list
|
|
// boxes, even though no instances will be listed.
|
|
//
|
|
|
|
pNntpDataDefinitionObject1 = (NNTP_DATA_DEFINITION_OBJECT1 *)*lppData;
|
|
|
|
cbRequired = sizeof(NNTP_DATA_DEFINITION_OBJECT1) +
|
|
(dwInstanceCount * (sizeof(PERF_INSTANCE_DEFINITION) +
|
|
MAX_SIZEOF_INSTANCE_NAME +
|
|
sizeof (NNTP_COUNTER_BLOCK1)));
|
|
|
|
cbRequired += sizeof(NNTP_DATA_DEFINITION_OBJECT2) +
|
|
(dwInstanceCount * (sizeof(PERF_INSTANCE_DEFINITION) +
|
|
MAX_SIZEOF_INSTANCE_NAME +
|
|
sizeof (NNTP_COUNTER_BLOCK2)));
|
|
|
|
//
|
|
// See if there's enough space.
|
|
//
|
|
|
|
if( *lpcbTotalBytes < cbRequired ) {
|
|
|
|
//
|
|
// Nope.
|
|
//
|
|
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
dwRetCode = ERROR_MORE_DATA;
|
|
goto Exit;
|
|
}
|
|
|
|
//
|
|
// Copy the (constant, initialized) Object Type and counter definitions
|
|
// to the caller's data buffer
|
|
//
|
|
|
|
memmove( pNntpDataDefinitionObject1,
|
|
&NntpDataDefinitionObject1,
|
|
sizeof(NNTP_DATA_DEFINITION_OBJECT1) );
|
|
|
|
//
|
|
// Create data for return for each instance
|
|
//
|
|
|
|
pPerfInstanceDefinition = (PERF_INSTANCE_DEFINITION *)
|
|
&pNntpDataDefinitionObject1[1];
|
|
|
|
//
|
|
// Set first block of Buffer for _Total
|
|
//
|
|
|
|
MonBuildInstanceDefinition(
|
|
pPerfInstanceDefinition,
|
|
(PVOID *)&pCounterBlock1,
|
|
0,
|
|
0,
|
|
(DWORD)-1, // use name
|
|
TOTAL_INSTANCE_NAME ); // pass in instance name
|
|
|
|
pTotal1 = pCounterBlock1;
|
|
memset( pTotal1, 0, sizeof(NNTP_COUNTER_BLOCK1 ));
|
|
pTotal1->PerfCounterBlock.ByteLength = sizeof (NNTP_COUNTER_BLOCK1);
|
|
pPerfInstanceDefinition =
|
|
(PERF_INSTANCE_DEFINITION *)((LPBYTE)pCounterBlock1 +
|
|
sizeof(NNTP_COUNTER_BLOCK1));
|
|
|
|
//
|
|
// Try to retrieve the data for each instance.
|
|
//
|
|
|
|
for( i = 0, dwCount = 1 ; (i < dwInstanceIndex) && dwCount < dwInstanceCount;
|
|
i++ ) {
|
|
|
|
hresErr = g_pAdminBase->EnumKeys( hObjHandle,
|
|
NULL,
|
|
wszKeyName,
|
|
i);
|
|
|
|
if (FAILED(hresErr)) {
|
|
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
dwRetCode = NO_ERROR;
|
|
goto Exit;
|
|
}
|
|
if (_wtoi(wszKeyName) == 0) {
|
|
continue;
|
|
}
|
|
|
|
MonBuildInstanceDefinition(
|
|
pPerfInstanceDefinition,
|
|
(PVOID *)&pCounterBlock1,
|
|
0,
|
|
0,
|
|
(DWORD)-1, // use name
|
|
(LPWSTR)wszKeyName ); // pass in instance name
|
|
|
|
//
|
|
// query for statistics info
|
|
//
|
|
|
|
neterr = NntpQueryStatistics(
|
|
NULL,
|
|
_wtoi(wszKeyName), // instance id
|
|
0,
|
|
(LPBYTE *)&pNntpStats );
|
|
|
|
if( neterr != NERR_Success )
|
|
{
|
|
#if 0
|
|
//
|
|
// Error retrieving statistics.
|
|
//
|
|
ReportEvent (hEventLog, EVENTLOG_ERROR_TYPE,
|
|
0, W3_UNABLE_QUERY_W3SVC_DATA,
|
|
(PSID)NULL, 0,
|
|
sizeof(neterr), NULL,
|
|
(PVOID)(&neterr));
|
|
#endif
|
|
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
dwRetCode = NO_ERROR;
|
|
goto Exit;
|
|
}
|
|
|
|
//
|
|
// Format the NNTP Server data.
|
|
//
|
|
|
|
CopyStatisticsData1( pNntpStats,
|
|
pCounterBlock1 );
|
|
|
|
//
|
|
// update _total instance counters
|
|
//
|
|
|
|
Update_TotalStatisticsData1( pCounterBlock1,
|
|
pTotal1 );
|
|
|
|
pPerfInstanceDefinition =
|
|
(PERF_INSTANCE_DEFINITION *)((LPBYTE)pCounterBlock1 +
|
|
sizeof(NNTP_COUNTER_BLOCK1));
|
|
|
|
dwCount++;
|
|
|
|
//
|
|
// Free the API buffer.
|
|
//
|
|
|
|
//MIDL_user_free( pNntpStats );
|
|
NetApiBufferFree((LPBYTE)pNntpStats);
|
|
}
|
|
|
|
if (dwInstanceCount == 1) {
|
|
|
|
//
|
|
// zero fill one instance sized block of data if there's no data
|
|
// instances
|
|
//
|
|
|
|
memset (pPerfInstanceDefinition, 0,
|
|
(sizeof(PERF_INSTANCE_DEFINITION) +
|
|
MAX_SIZEOF_INSTANCE_NAME +
|
|
sizeof(NNTP_COUNTER_BLOCK1)));
|
|
|
|
// adjust pointer to point to end of zeroed block
|
|
pPerfInstanceDefinition += (sizeof(PERF_INSTANCE_DEFINITION) +
|
|
MAX_SIZEOF_INSTANCE_NAME +
|
|
sizeof(NNTP_COUNTER_BLOCK1));
|
|
}
|
|
|
|
pNntpDataDefinitionObject1->NntpObjectType.NumInstances = dwInstanceCount;
|
|
pNntpDataDefinitionObject1->NntpObjectType.TotalByteLength =
|
|
*lpcbTotalBytes = (DWORD)((PBYTE)pPerfInstanceDefinition -
|
|
(PBYTE)pNntpDataDefinitionObject1);
|
|
|
|
//
|
|
// Fill in data for Object 2 - the "NNTP Svc Client Request" object
|
|
//
|
|
|
|
*lppData = (PVOID)(pPerfInstanceDefinition);
|
|
pNntpDataDefinitionObject2 = (NNTP_DATA_DEFINITION_OBJECT2 *)*lppData;
|
|
|
|
//
|
|
// Copy the (constant, initialized) Object Type and counter definitions
|
|
// to the caller's data buffer
|
|
//
|
|
|
|
memmove( pNntpDataDefinitionObject2,
|
|
&NntpDataDefinitionObject2,
|
|
sizeof(NNTP_DATA_DEFINITION_OBJECT2) );
|
|
|
|
//
|
|
// Create data for return for each instance
|
|
//
|
|
|
|
pPerfInstanceDefinition = (PERF_INSTANCE_DEFINITION *)
|
|
&pNntpDataDefinitionObject2[1];
|
|
|
|
//
|
|
// Set first block of Buffer for _Total
|
|
//
|
|
|
|
MonBuildInstanceDefinition(
|
|
pPerfInstanceDefinition,
|
|
(PVOID *)&pCounterBlock2,
|
|
0,
|
|
0,
|
|
(DWORD)-1, // use name
|
|
TOTAL_INSTANCE_NAME ); // pass in instance name
|
|
|
|
pTotal2 = pCounterBlock2;
|
|
memset( pTotal2, 0, sizeof(NNTP_COUNTER_BLOCK2 ));
|
|
pTotal2->PerfCounterBlock.ByteLength = sizeof (NNTP_COUNTER_BLOCK2);
|
|
pPerfInstanceDefinition =
|
|
(PERF_INSTANCE_DEFINITION *)((LPBYTE)pCounterBlock2 +
|
|
sizeof(NNTP_COUNTER_BLOCK2));
|
|
|
|
//
|
|
// Try to retrieve the data for each instance.
|
|
//
|
|
|
|
for( i = 0, dwCount = 1 ; (i < dwInstanceIndex) && dwCount < dwInstanceCount;
|
|
i++ ) {
|
|
|
|
hresErr = g_pAdminBase->EnumKeys( hObjHandle,
|
|
NULL,
|
|
wszKeyName,
|
|
i);
|
|
|
|
if (FAILED(hresErr)) {
|
|
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
dwRetCode = NO_ERROR;
|
|
goto Exit;
|
|
}
|
|
if (_wtoi(wszKeyName) == 0) {
|
|
continue;
|
|
}
|
|
|
|
MonBuildInstanceDefinition(
|
|
pPerfInstanceDefinition,
|
|
(PVOID *)&pCounterBlock2,
|
|
0,
|
|
0,
|
|
(DWORD)-1, // use name
|
|
(LPWSTR)wszKeyName ); // pass in instance name
|
|
|
|
//
|
|
// query for statistics info
|
|
//
|
|
|
|
neterr = NntpQueryStatistics(
|
|
NULL,
|
|
_wtoi(wszKeyName), // instance id
|
|
0,
|
|
(LPBYTE *)&pNntpStats );
|
|
|
|
if( neterr != NERR_Success )
|
|
{
|
|
#if 0
|
|
//
|
|
// Error retrieving statistics.
|
|
//
|
|
ReportEvent (hEventLog, EVENTLOG_ERROR_TYPE,
|
|
0, W3_UNABLE_QUERY_W3SVC_DATA,
|
|
(PSID)NULL, 0,
|
|
sizeof(neterr), NULL,
|
|
(PVOID)(&neterr));
|
|
#endif
|
|
|
|
*lpcbTotalBytes = 0;
|
|
*lpNumObjectTypes = 0;
|
|
|
|
dwRetCode = NO_ERROR;
|
|
goto Exit;
|
|
}
|
|
|
|
//
|
|
// Format the NNTP Server data.
|
|
//
|
|
|
|
CopyStatisticsData2( pNntpStats,
|
|
pCounterBlock2 );
|
|
|
|
//
|
|
// update _total instance counters
|
|
//
|
|
|
|
Update_TotalStatisticsData2( pCounterBlock2,
|
|
pTotal2 );
|
|
|
|
pPerfInstanceDefinition =
|
|
(PERF_INSTANCE_DEFINITION *)((LPBYTE)pCounterBlock2 +
|
|
sizeof(NNTP_COUNTER_BLOCK2));
|
|
|
|
dwCount++;
|
|
|
|
//
|
|
// Free the API buffer.
|
|
//
|
|
|
|
//MIDL_user_free( pNntpStats );
|
|
NetApiBufferFree((LPBYTE)pNntpStats);
|
|
}
|
|
|
|
if (dwInstanceCount == 1) {
|
|
|
|
//
|
|
// zero fill one instance sized block of data if there's no data
|
|
// instances
|
|
//
|
|
|
|
memset (pPerfInstanceDefinition, 0,
|
|
(sizeof(PERF_INSTANCE_DEFINITION) +
|
|
MAX_SIZEOF_INSTANCE_NAME +
|
|
sizeof(NNTP_COUNTER_BLOCK2)));
|
|
|
|
// adjust pointer to point to end of zeroed block
|
|
pPerfInstanceDefinition += (sizeof(PERF_INSTANCE_DEFINITION) +
|
|
MAX_SIZEOF_INSTANCE_NAME +
|
|
sizeof(NNTP_COUNTER_BLOCK2));
|
|
}
|
|
|
|
//
|
|
// Update arguments for return.
|
|
//
|
|
|
|
*lppData = (PVOID)(pPerfInstanceDefinition);
|
|
*lpNumObjectTypes = 2;
|
|
|
|
pNntpDataDefinitionObject2->NntpObjectType.NumInstances = dwInstanceCount;
|
|
pNntpDataDefinitionObject2->NntpObjectType.TotalByteLength =
|
|
(DWORD)((PBYTE)pPerfInstanceDefinition -
|
|
((PBYTE)pNntpDataDefinitionObject1 + *lpcbTotalBytes));
|
|
|
|
*lpcbTotalBytes = (DWORD)((PBYTE)pPerfInstanceDefinition -
|
|
(PBYTE)pNntpDataDefinitionObject1);
|
|
|
|
Exit:
|
|
|
|
//
|
|
// Free Metabase handle
|
|
//
|
|
|
|
CloseAdminBaseKey(hObjHandle);
|
|
|
|
//
|
|
// Success! Honest!!
|
|
//
|
|
|
|
return dwRetCode;
|
|
|
|
} // CollectNntpPerformanceData
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: CloseNntpPerformanceData
|
|
|
|
SYNOPSIS: Terminates the performance counters.
|
|
|
|
RETURNS: DWORD - Win32 status code.
|
|
|
|
HISTORY:
|
|
KeithMo 07-Jun-1993 Created.
|
|
|
|
********************************************************************/
|
|
DWORD CloseNntpPerformanceData( VOID )
|
|
{
|
|
//
|
|
// No real cleanup to do here.
|
|
//
|
|
|
|
if ((--cOpens) == 0) {
|
|
// Done each time the perf data is collect instead of here
|
|
// UninitAdminBase();
|
|
}
|
|
|
|
return NO_ERROR;
|
|
|
|
} // CloseNntpPerformanceData
|
|
|
|
VOID
|
|
CopyStatisticsData1(
|
|
IN NNTP_STATISTICS_0 * pNntpStats,
|
|
OUT NNTP_COUNTER_BLOCK1 * pCounterBlock
|
|
)
|
|
{
|
|
//
|
|
// Format the NNTP Server data for Object1
|
|
//
|
|
|
|
pCounterBlock->PerfCounterBlock.ByteLength = sizeof (NNTP_COUNTER_BLOCK1);
|
|
|
|
pCounterBlock->BytesSent = pNntpStats->TotalBytesSent.QuadPart;
|
|
pCounterBlock->BytesReceived = pNntpStats->TotalBytesReceived.QuadPart;
|
|
pCounterBlock->BytesTotal = pNntpStats->TotalBytesSent.QuadPart + pNntpStats->TotalBytesReceived.QuadPart;
|
|
|
|
pCounterBlock->TotalConnections = pNntpStats->TotalConnections;
|
|
pCounterBlock->TotalSSLConnections = pNntpStats->TotalSSLConnections;
|
|
pCounterBlock->CurrentConnections = pNntpStats->CurrentConnections;
|
|
pCounterBlock->MaxConnections = pNntpStats->MaxConnections;
|
|
pCounterBlock->CurrentAnonymous = pNntpStats->CurrentAnonymousUsers;
|
|
pCounterBlock->CurrentNonAnonymous = pNntpStats->CurrentNonAnonymousUsers;
|
|
pCounterBlock->TotalAnonymous = pNntpStats->TotalAnonymousUsers;
|
|
pCounterBlock->TotalNonAnonymous = pNntpStats->TotalNonAnonymousUsers;
|
|
pCounterBlock->MaxAnonymous = pNntpStats->MaxAnonymousUsers;
|
|
pCounterBlock->MaxNonAnonymous = pNntpStats->MaxNonAnonymousUsers;
|
|
pCounterBlock->TotalOutboundConnects = pNntpStats->TotalOutboundConnects;
|
|
pCounterBlock->OutboundConnectsFailed = pNntpStats->OutboundConnectsFailed;
|
|
pCounterBlock->CurrentOutboundConnects = pNntpStats->CurrentOutboundConnects;
|
|
pCounterBlock->OutboundLogonFailed = pNntpStats->OutboundLogonFailed;
|
|
pCounterBlock->TotalPullFeeds = pNntpStats->TotalPullFeeds;
|
|
pCounterBlock->TotalPushFeeds = pNntpStats->TotalPushFeeds;
|
|
pCounterBlock->TotalPassiveFeeds = pNntpStats->TotalPassiveFeeds;
|
|
pCounterBlock->ArticlesSent = pNntpStats->ArticlesSent;
|
|
pCounterBlock->ArticlesReceived = pNntpStats->ArticlesReceived;
|
|
pCounterBlock->ArticlesTotal = pNntpStats->ArticlesSent + pNntpStats->ArticlesReceived;
|
|
pCounterBlock->ArticlesPosted = pNntpStats->ArticlesPosted;
|
|
pCounterBlock->ArticleMapEntries = pNntpStats->ArticleMapEntries;
|
|
pCounterBlock->HistoryMapEntries = pNntpStats->HistoryMapEntries;
|
|
pCounterBlock->XoverEntries = pNntpStats->XoverEntries;
|
|
pCounterBlock->ControlMessagesIn = pNntpStats->ControlMessagesIn;
|
|
pCounterBlock->ControlMessagesFailed = pNntpStats->ControlMessagesFailed;
|
|
pCounterBlock->ModeratedPostingsSent = pNntpStats->ModeratedPostingsSent;
|
|
pCounterBlock->ModeratedPostingsFailed = pNntpStats->ModeratedPostingsFailed;
|
|
pCounterBlock->SessionsFlowControlled = pNntpStats->SessionsFlowControlled;
|
|
pCounterBlock->ArticlesExpired = pNntpStats->ArticlesExpired;
|
|
pCounterBlock->ArticlesSentPerSec = pNntpStats->ArticlesSent;
|
|
pCounterBlock->ArticlesReceivedPerSec = pNntpStats->ArticlesReceived;
|
|
pCounterBlock->ArticlesPostedPerSec = pNntpStats->ArticlesPosted;
|
|
pCounterBlock->ArticleMapEntriesPerSec = pNntpStats->ArticleMapEntries;
|
|
pCounterBlock->HistoryMapEntriesPerSec = pNntpStats->HistoryMapEntries;
|
|
pCounterBlock->XoverEntriesPerSec = pNntpStats->XoverEntries;
|
|
pCounterBlock->ArticlesExpiredPerSec = pNntpStats->ArticlesExpired;
|
|
|
|
} // CopyStatisticsData
|
|
|
|
VOID
|
|
CopyStatisticsData2(
|
|
IN NNTP_STATISTICS_0 * pNntpStats,
|
|
OUT NNTP_COUNTER_BLOCK2 * pCounterBlock
|
|
)
|
|
{
|
|
//
|
|
// Format the NNTP Server data for Object2
|
|
//
|
|
|
|
pCounterBlock->PerfCounterBlock.ByteLength = sizeof (NNTP_COUNTER_BLOCK2);
|
|
|
|
pCounterBlock->ArticleCmds = pNntpStats->ArticleCommands;
|
|
pCounterBlock->ArticleCmdsPerSec = pNntpStats->ArticleCommands;
|
|
pCounterBlock->GroupCmds = pNntpStats->GroupCommands;
|
|
pCounterBlock->GroupCmdsPerSec = pNntpStats->GroupCommands;
|
|
pCounterBlock->HelpCmds = pNntpStats->HelpCommands;
|
|
pCounterBlock->HelpCmdsPerSec = pNntpStats->HelpCommands;
|
|
pCounterBlock->IHaveCmds = pNntpStats->IHaveCommands;
|
|
pCounterBlock->IHaveCmdsPerSec = pNntpStats->IHaveCommands;
|
|
pCounterBlock->LastCmds = pNntpStats->LastCommands;
|
|
pCounterBlock->LastCmdsPerSec = pNntpStats->LastCommands;
|
|
pCounterBlock->ListCmds = pNntpStats->ListCommands;
|
|
pCounterBlock->ListCmdsPerSec = pNntpStats->ListCommands;
|
|
pCounterBlock->NewgroupsCmds = pNntpStats->NewgroupsCommands;
|
|
pCounterBlock->NewgroupsCmdsPerSec = pNntpStats->NewgroupsCommands;
|
|
pCounterBlock->NewnewsCmds = pNntpStats->NewnewsCommands;
|
|
pCounterBlock->NewnewsCmdsPerSec = pNntpStats->NewnewsCommands;
|
|
pCounterBlock->NextCmds = pNntpStats->NextCommands;
|
|
pCounterBlock->NextCmdsPerSec = pNntpStats->NextCommands;
|
|
pCounterBlock->PostCmds = pNntpStats->PostCommands;
|
|
pCounterBlock->PostCmdsPerSec = pNntpStats->PostCommands;
|
|
pCounterBlock->QuitCmds = pNntpStats->QuitCommands;
|
|
pCounterBlock->QuitCmdsPerSec = pNntpStats->QuitCommands;
|
|
pCounterBlock->StatCmds = pNntpStats->StatCommands;
|
|
pCounterBlock->StatCmdsPerSec = pNntpStats->StatCommands;
|
|
pCounterBlock->LogonAttempts = pNntpStats->LogonAttempts;
|
|
pCounterBlock->LogonFailures = pNntpStats->LogonFailures;
|
|
pCounterBlock->LogonAttemptsPerSec = pNntpStats->LogonAttempts;
|
|
pCounterBlock->LogonFailuresPerSec = pNntpStats->LogonFailures;
|
|
pCounterBlock->CheckCmds = pNntpStats->CheckCommands;
|
|
pCounterBlock->CheckCmdsPerSec = pNntpStats->CheckCommands;
|
|
pCounterBlock->TakethisCmds = pNntpStats->TakethisCommands;
|
|
pCounterBlock->TakethisCmdsPerSec = pNntpStats->TakethisCommands;
|
|
pCounterBlock->ModeCmds = pNntpStats->ModeCommands;
|
|
pCounterBlock->ModeCmdsPerSec = pNntpStats->ModeCommands;
|
|
pCounterBlock->SearchCmds = pNntpStats->SearchCommands;
|
|
pCounterBlock->SearchCmdsPerSec = pNntpStats->SearchCommands;
|
|
pCounterBlock->XHdrCmds = pNntpStats->XHdrCommands;
|
|
pCounterBlock->XHdrCmdsPerSec = pNntpStats->XHdrCommands;
|
|
pCounterBlock->XOverCmds = pNntpStats->XOverCommands;
|
|
pCounterBlock->XOverCmdsPerSec = pNntpStats->XOverCommands;
|
|
pCounterBlock->XPatCmds = pNntpStats->XPatCommands;
|
|
pCounterBlock->XPatCmdsPerSec = pNntpStats->XPatCommands;
|
|
pCounterBlock->XReplicCmds = pNntpStats->XReplicCommands;
|
|
pCounterBlock->XReplicCmdsPerSec = pNntpStats->XReplicCommands;
|
|
|
|
} // CopyStatisticsData
|
|
|
|
VOID
|
|
Update_TotalStatisticsData1(
|
|
IN NNTP_COUNTER_BLOCK1 * pCounterBlock,
|
|
OUT NNTP_COUNTER_BLOCK1 * pTotal
|
|
)
|
|
{
|
|
//
|
|
// update _total instance counters for Object1
|
|
//
|
|
|
|
pTotal->BytesSent += pCounterBlock->BytesSent;
|
|
pTotal->BytesReceived += pCounterBlock->BytesReceived;
|
|
pTotal->BytesTotal += pCounterBlock->BytesSent + pCounterBlock->BytesReceived;
|
|
|
|
pTotal->TotalConnections += pCounterBlock->TotalConnections;
|
|
pTotal->TotalSSLConnections += pCounterBlock->TotalSSLConnections;
|
|
pTotal->CurrentConnections += pCounterBlock->CurrentConnections;
|
|
pTotal->MaxConnections += pCounterBlock->MaxConnections;
|
|
pTotal->CurrentAnonymous += pCounterBlock->CurrentAnonymous;
|
|
pTotal->CurrentNonAnonymous += pCounterBlock->CurrentNonAnonymous;
|
|
pTotal->TotalAnonymous += pCounterBlock->TotalAnonymous;
|
|
pTotal->TotalNonAnonymous += pCounterBlock->TotalNonAnonymous;
|
|
pTotal->MaxAnonymous += pCounterBlock->MaxAnonymous;
|
|
pTotal->MaxNonAnonymous += pCounterBlock->MaxNonAnonymous;
|
|
pTotal->TotalOutboundConnects += pCounterBlock->TotalOutboundConnects;
|
|
pTotal->OutboundConnectsFailed += pCounterBlock->OutboundConnectsFailed;
|
|
pTotal->CurrentOutboundConnects += pCounterBlock->CurrentOutboundConnects;
|
|
pTotal->OutboundLogonFailed += pCounterBlock->OutboundLogonFailed;
|
|
pTotal->TotalPullFeeds += pCounterBlock->TotalPullFeeds;
|
|
pTotal->TotalPushFeeds += pCounterBlock->TotalPushFeeds;
|
|
pTotal->TotalPassiveFeeds += pCounterBlock->TotalPassiveFeeds;
|
|
pTotal->ArticlesSent += pCounterBlock->ArticlesSent;
|
|
pTotal->ArticlesReceived += pCounterBlock->ArticlesReceived;
|
|
pTotal->ArticlesTotal += pCounterBlock->ArticlesTotal;
|
|
pTotal->ArticlesPosted += pCounterBlock->ArticlesPosted;
|
|
pTotal->ArticleMapEntries += pCounterBlock->ArticleMapEntries;
|
|
pTotal->HistoryMapEntries += pCounterBlock->HistoryMapEntries;
|
|
pTotal->XoverEntries += pCounterBlock->XoverEntries;
|
|
pTotal->ControlMessagesIn += pCounterBlock->ControlMessagesIn;
|
|
pTotal->ControlMessagesFailed += pCounterBlock->ControlMessagesFailed;
|
|
pTotal->ModeratedPostingsSent += pCounterBlock->ModeratedPostingsSent;
|
|
pTotal->ModeratedPostingsFailed += pCounterBlock->ModeratedPostingsFailed;
|
|
pTotal->SessionsFlowControlled += pCounterBlock->SessionsFlowControlled;
|
|
pTotal->ArticlesExpired += pCounterBlock->ArticlesExpired;
|
|
pTotal->ArticlesSentPerSec += pCounterBlock->ArticlesSentPerSec;
|
|
pTotal->ArticlesReceivedPerSec += pCounterBlock->ArticlesReceivedPerSec;
|
|
pTotal->ArticlesPostedPerSec += pCounterBlock->ArticlesPostedPerSec;
|
|
pTotal->ArticleMapEntriesPerSec += pCounterBlock->ArticleMapEntriesPerSec;
|
|
pTotal->HistoryMapEntriesPerSec += pCounterBlock->HistoryMapEntriesPerSec;
|
|
pTotal->XoverEntriesPerSec += pCounterBlock->XoverEntriesPerSec;
|
|
pTotal->ArticlesExpiredPerSec += pCounterBlock->ArticlesExpiredPerSec;
|
|
|
|
} // Update_TotalStatisticsData
|
|
|
|
VOID
|
|
Update_TotalStatisticsData2(
|
|
IN NNTP_COUNTER_BLOCK2 * pCounterBlock,
|
|
OUT NNTP_COUNTER_BLOCK2 * pTotal
|
|
)
|
|
{
|
|
//
|
|
// update _total instance counters for Object2
|
|
//
|
|
|
|
pTotal->ArticleCmds += pCounterBlock->ArticleCmds;
|
|
pTotal->ArticleCmdsPerSec += pCounterBlock->ArticleCmdsPerSec;
|
|
pTotal->GroupCmds += pCounterBlock->GroupCmds;
|
|
pTotal->GroupCmdsPerSec += pCounterBlock->GroupCmdsPerSec;
|
|
pTotal->HelpCmds += pCounterBlock->HelpCmds;
|
|
pTotal->HelpCmdsPerSec += pCounterBlock->HelpCmdsPerSec;
|
|
pTotal->IHaveCmds += pCounterBlock->IHaveCmds;
|
|
pTotal->IHaveCmdsPerSec += pCounterBlock->IHaveCmdsPerSec;
|
|
pTotal->LastCmds += pCounterBlock->LastCmds;
|
|
pTotal->LastCmdsPerSec += pCounterBlock->LastCmdsPerSec;
|
|
pTotal->ListCmds += pCounterBlock->ListCmds;
|
|
pTotal->ListCmdsPerSec += pCounterBlock->ListCmdsPerSec;
|
|
pTotal->NewgroupsCmds += pCounterBlock->NewgroupsCmds;
|
|
pTotal->NewgroupsCmdsPerSec += pCounterBlock->NewgroupsCmdsPerSec;
|
|
pTotal->NewnewsCmds += pCounterBlock->NewnewsCmds;
|
|
pTotal->NewnewsCmdsPerSec += pCounterBlock->NewnewsCmdsPerSec;
|
|
pTotal->NextCmds += pCounterBlock->NextCmds;
|
|
pTotal->NextCmdsPerSec += pCounterBlock->NextCmdsPerSec;
|
|
pTotal->PostCmds += pCounterBlock->PostCmds;
|
|
pTotal->PostCmdsPerSec += pCounterBlock->PostCmdsPerSec;
|
|
pTotal->QuitCmds += pCounterBlock->QuitCmds;
|
|
pTotal->QuitCmdsPerSec += pCounterBlock->QuitCmdsPerSec;
|
|
pTotal->StatCmds += pCounterBlock->StatCmds;
|
|
pTotal->StatCmdsPerSec += pCounterBlock->StatCmdsPerSec;
|
|
pTotal->LogonAttempts += pCounterBlock->LogonAttempts;
|
|
pTotal->LogonFailures += pCounterBlock->LogonFailures;
|
|
pTotal->LogonAttemptsPerSec += pCounterBlock->LogonAttemptsPerSec;
|
|
pTotal->LogonFailuresPerSec += pCounterBlock->LogonFailuresPerSec;
|
|
pTotal->CheckCmds += pCounterBlock->CheckCmds;
|
|
pTotal->CheckCmdsPerSec += pCounterBlock->CheckCmdsPerSec;
|
|
pTotal->TakethisCmds += pCounterBlock->TakethisCmds;
|
|
pTotal->TakethisCmdsPerSec += pCounterBlock->TakethisCmdsPerSec;
|
|
pTotal->ModeCmds += pCounterBlock->ModeCmds;
|
|
pTotal->ModeCmdsPerSec += pCounterBlock->ModeCmdsPerSec;
|
|
pTotal->SearchCmds += pCounterBlock->SearchCmds;
|
|
pTotal->SearchCmdsPerSec += pCounterBlock->SearchCmdsPerSec;
|
|
pTotal->XHdrCmds += pCounterBlock->XHdrCmds;
|
|
pTotal->XHdrCmdsPerSec += pCounterBlock->XHdrCmdsPerSec;
|
|
pTotal->XOverCmds += pCounterBlock->XOverCmds;
|
|
pTotal->XOverCmdsPerSec += pCounterBlock->XOverCmdsPerSec;
|
|
pTotal->XPatCmds += pCounterBlock->XPatCmds;
|
|
pTotal->XPatCmdsPerSec += pCounterBlock->XPatCmdsPerSec;
|
|
pTotal->XReplicCmds += pCounterBlock->XReplicCmds;
|
|
pTotal->XReplicCmdsPerSec += pCounterBlock->XReplicCmdsPerSec;
|
|
|
|
} // Update_TotalStatisticsData
|
|
|
|
VOID
|
|
UpdateNameAndHelpIndicies(
|
|
IN DWORD dwFirstCounter,
|
|
IN DWORD dwFirstHelp
|
|
)
|
|
{
|
|
NNTP_COUNTER_BLOCK1 nntpc1;
|
|
NNTP_COUNTER_BLOCK2 nntpc2;
|
|
|
|
//
|
|
// Update the object & counter name & help indicies for object1
|
|
//
|
|
|
|
NntpDataDefinitionObject1.NntpObjectType.ObjectNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpObjectType.ObjectHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
|
|
NntpDataDefinitionObject1.NntpBytesSent.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpBytesSent.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpBytesSent.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.BytesSent - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpBytesReceived.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpBytesReceived.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpBytesReceived.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.BytesReceived - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpBytesTotal.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpBytesTotal.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpBytesTotal.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.BytesTotal - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpTotalConnections.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpTotalConnections.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpTotalConnections.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.TotalConnections - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpTotalSSLConnections.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpTotalSSLConnections.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpTotalSSLConnections.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.TotalSSLConnections - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpCurrentConnections.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpCurrentConnections.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpCurrentConnections.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.CurrentConnections - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpMaxConnections.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpMaxConnections.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpMaxConnections.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.MaxConnections - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpCurrentAnonymous.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpCurrentAnonymous.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpCurrentAnonymous.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.CurrentAnonymous - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpCurrentNonAnonymous.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpCurrentNonAnonymous.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpCurrentNonAnonymous.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.CurrentNonAnonymous - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpTotalAnonymous.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpTotalAnonymous.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpTotalAnonymous.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.TotalAnonymous - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpTotalNonAnonymous.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpTotalNonAnonymous.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpTotalNonAnonymous.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.TotalNonAnonymous - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpMaxAnonymous.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpMaxAnonymous.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpMaxAnonymous.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.MaxAnonymous - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpMaxNonAnonymous.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpMaxNonAnonymous.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpMaxNonAnonymous.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.MaxNonAnonymous - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpTotalOutboundConnects.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpTotalOutboundConnects.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpTotalOutboundConnects.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.TotalOutboundConnects - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpOutboundConnectsFailed.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpOutboundConnectsFailed.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpOutboundConnectsFailed.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.OutboundConnectsFailed - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpCurrentOutboundConnects.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpCurrentOutboundConnects.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpCurrentOutboundConnects.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.CurrentOutboundConnects - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpOutboundLogonFailed.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpOutboundLogonFailed.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpOutboundLogonFailed.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.OutboundLogonFailed - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpTotalPullFeeds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpTotalPullFeeds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpTotalPullFeeds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.TotalPullFeeds - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpTotalPushFeeds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpTotalPushFeeds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpTotalPushFeeds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.TotalPushFeeds - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpTotalPassiveFeeds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpTotalPassiveFeeds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpTotalPassiveFeeds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.TotalPassiveFeeds - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesSent.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesSent.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesSent.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesSent - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesReceived.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesReceived.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesReceived.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesReceived - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesTotal.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesTotal.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesTotal.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesTotal - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesPosted.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesPosted.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesPosted.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesPosted - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticleMapEntries.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticleMapEntries.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticleMapEntries.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticleMapEntries - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpHistoryMapEntries.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpHistoryMapEntries.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpHistoryMapEntries.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.HistoryMapEntries - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpXoverEntries.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpXoverEntries.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpXoverEntries.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.XoverEntries - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpControlMessagesIn.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpControlMessagesIn.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpControlMessagesIn.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ControlMessagesIn - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpControlMessagesFailed.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpControlMessagesFailed.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpControlMessagesFailed.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ControlMessagesFailed - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpModeratedPostingsSent.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpModeratedPostingsSent.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpModeratedPostingsSent.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ModeratedPostingsSent - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpModeratedPostingsFailed.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpModeratedPostingsFailed.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpModeratedPostingsFailed.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ModeratedPostingsFailed - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpSessionsFlowControlled.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpSessionsFlowControlled.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpSessionsFlowControlled.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.SessionsFlowControlled - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesExpired.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesExpired.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesExpired.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesExpired - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesSentPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesSentPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesSentPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesSentPerSec - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesReceivedPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesReceivedPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesReceivedPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesReceivedPerSec - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesPostedPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesPostedPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesPostedPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesPostedPerSec - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticleMapEntriesPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticleMapEntriesPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticleMapEntriesPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticleMapEntriesPerSec - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpHistoryMapEntriesPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpHistoryMapEntriesPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpHistoryMapEntriesPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.HistoryMapEntriesPerSec - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpXoverEntriesPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpXoverEntriesPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpXoverEntriesPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.XoverEntriesPerSec - (LPBYTE)&nntpc1);
|
|
|
|
NntpDataDefinitionObject1.NntpArticlesExpiredPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject1.NntpArticlesExpiredPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject1.NntpArticlesExpiredPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc1.ArticlesExpiredPerSec - (LPBYTE)&nntpc1);
|
|
|
|
//
|
|
// Update the object & counter name & help indicies for object2
|
|
//
|
|
|
|
NntpDataDefinitionObject2.NntpObjectType.ObjectNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpObjectType.ObjectHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
|
|
NntpDataDefinitionObject2.NntpArticleCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpArticleCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpArticleCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.ArticleCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpArticleCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpArticleCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpArticleCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.ArticleCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpGroupCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpGroupCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpGroupCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.GroupCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpGroupCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpGroupCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpGroupCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.GroupCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpHelpCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpHelpCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpHelpCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.HelpCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpHelpCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpHelpCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpHelpCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.HelpCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpIHaveCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpIHaveCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpIHaveCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.IHaveCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpIHaveCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpIHaveCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpIHaveCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.IHaveCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpLastCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpLastCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpLastCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.LastCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpLastCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpLastCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpLastCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.LastCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpListCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpListCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpListCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.ListCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpListCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpListCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpListCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.ListCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpNewgroupsCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpNewgroupsCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpNewgroupsCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.NewgroupsCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpNewgroupsCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpNewgroupsCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpNewgroupsCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.NewgroupsCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpNewnewsCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpNewnewsCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpNewnewsCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.NewnewsCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpNewnewsCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpNewnewsCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpNewnewsCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.NewnewsCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpNextCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpNextCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpNextCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.NextCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpNextCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpNextCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpNextCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.NextCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpPostCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpPostCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpPostCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.PostCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpPostCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpPostCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpPostCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.PostCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpQuitCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpQuitCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpQuitCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.QuitCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpQuitCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpQuitCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpQuitCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.QuitCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpStatCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpStatCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpStatCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.StatCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpStatCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpStatCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpStatCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.StatCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpLogonAttempts.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpLogonAttempts.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpLogonAttempts.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.LogonAttempts - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpLogonFailures.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpLogonFailures.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpLogonFailures.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.LogonFailures - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpLogonAttemptsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpLogonAttemptsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpLogonAttemptsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.LogonAttemptsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpLogonFailuresPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpLogonFailuresPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpLogonFailuresPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.LogonFailuresPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpCheckCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpCheckCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpCheckCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.CheckCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpCheckCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpCheckCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpCheckCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.CheckCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpTakethisCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpTakethisCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpTakethisCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.TakethisCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpTakethisCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpTakethisCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpTakethisCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.TakethisCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpModeCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpModeCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpModeCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.ModeCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpModeCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpModeCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpModeCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.ModeCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpSearchCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpSearchCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpSearchCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.SearchCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpSearchCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpSearchCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpSearchCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.SearchCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpXHdrCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpXHdrCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpXHdrCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.XHdrCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpXHdrCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpXHdrCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpXHdrCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.XHdrCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpXOverCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpXOverCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpXOverCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.XOverCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpXOverCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpXOverCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpXOverCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.XOverCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpXPatCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpXPatCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpXPatCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.XPatCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpXPatCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpXPatCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpXPatCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.XPatCmdsPerSec - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpXReplicCmds.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpXReplicCmds.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpXReplicCmds.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.XReplicCmds - (LPBYTE)&nntpc2);
|
|
|
|
NntpDataDefinitionObject2.NntpXReplicCmdsPerSec.CounterNameTitleIndex
|
|
+= dwFirstCounter;
|
|
NntpDataDefinitionObject2.NntpXReplicCmdsPerSec.CounterHelpTitleIndex
|
|
+= dwFirstHelp;
|
|
NntpDataDefinitionObject2.NntpXReplicCmdsPerSec.CounterOffset =
|
|
(DWORD)((LPBYTE)&nntpc2.XReplicCmdsPerSec - (LPBYTE)&nntpc2);
|
|
}
|
|
|
|
HRESULT
|
|
InitAdminBase()
|
|
{
|
|
HRESULT hRes = S_OK;
|
|
|
|
hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
if ( RPC_E_CHANGED_MODE == hRes )
|
|
hRes = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
|
|
|
|
if (SUCCEEDED(hRes) ) {
|
|
hRes = CoCreateInstance(
|
|
CLSID_MSAdminBase_W,
|
|
NULL,
|
|
CLSCTX_SERVER,
|
|
IID_IMSAdminBase_W,
|
|
(void**) &g_pAdminBase
|
|
);
|
|
}
|
|
else {
|
|
//CoUninitialize();
|
|
}
|
|
|
|
return hRes;
|
|
}
|
|
|
|
VOID
|
|
UninitAdminBase()
|
|
{
|
|
if (g_pAdminBase != NULL) {
|
|
g_pAdminBase->Release();
|
|
CoUninitialize();
|
|
g_pAdminBase = NULL;
|
|
}
|
|
}
|
|
|
|
HRESULT
|
|
OpenAdminBaseKey(
|
|
OUT METADATA_HANDLE *phHandle
|
|
)
|
|
{
|
|
HRESULT hRes = S_OK;
|
|
METADATA_HANDLE RootHandle;
|
|
|
|
|
|
if (g_pAdminBase == NULL) {
|
|
//
|
|
// Don't have a Metadata interface
|
|
// so try to get one.
|
|
//
|
|
hRes = InitAdminBase();
|
|
}
|
|
if (SUCCEEDED(hRes)) {
|
|
hRes = g_pAdminBase->OpenKey(
|
|
METADATA_MASTER_ROOT_HANDLE,
|
|
L"/LM/NNTPSVC/",
|
|
METADATA_PERMISSION_READ,
|
|
100,
|
|
&RootHandle
|
|
);
|
|
|
|
if (FAILED(hRes)) {
|
|
if ((HRESULT_CODE(hRes) == RPC_S_SERVER_UNAVAILABLE) ||
|
|
((HRESULT_CODE(hRes) >= RPC_S_NO_CALL_ACTIVE) &&
|
|
(HRESULT_CODE(hRes) <= RPC_S_CALL_FAILED_DNE))) {
|
|
//
|
|
// RPC error, try to recover connection
|
|
//
|
|
UninitAdminBase();
|
|
hRes = InitAdminBase();
|
|
if (SUCCEEDED(hRes)) {
|
|
hRes = g_pAdminBase->OpenKey(
|
|
METADATA_MASTER_ROOT_HANDLE,
|
|
L"/LM/NNTPSVC/",
|
|
METADATA_PERMISSION_READ,
|
|
100,
|
|
&RootHandle
|
|
);
|
|
}
|
|
}
|
|
}
|
|
if (SUCCEEDED(hRes)) {
|
|
*phHandle = RootHandle;
|
|
}
|
|
}
|
|
|
|
return(hRes);
|
|
}
|
|
|
|
VOID
|
|
CloseAdminBaseKey(
|
|
IN METADATA_HANDLE hHandle
|
|
)
|
|
{
|
|
g_pAdminBase->CloseKey(hHandle);
|
|
UninitAdminBase();
|
|
g_pAdminBase = NULL;
|
|
}
|
|
|
|
|
|
|