Source code of Windows XP (NT5)
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.
|
|
#define INCL_INETSRV_INCS
#include "smtpinc.h"
//+---------------------------------------------------------------
//
// Function: CheckInstanceId
//
// Synopsis: Callback from IIS_SERVICE iterator
//
// Arguments: void
//
// Returns: TRUE is success, else FALSE
//
// History:
//
//----------------------------------------------------------------
BOOL CheckInstanceId( PVOID pvContext, PVOID pvContext1, PIIS_SERVER_INSTANCE pInstance ) { PSMTP_SERVER_INSTANCE pSmtpInstance = (PSMTP_SERVER_INSTANCE)pInstance ; DWORD dwInstanceId = (DWORD)((DWORD_PTR)pvContext) ; PSMTP_SERVER_INSTANCE* ppSmtpInstance = (PSMTP_SERVER_INSTANCE*)pvContext1 ;
//
// Check this instance for its id - if it matches the id we are looking for
// return FALSE to discontinue the iteration.
//
if( dwInstanceId == pSmtpInstance->QueryInstanceId() ) { // found it
if(!pSmtpInstance->IsShuttingDown()) { //reference it first
pSmtpInstance->Reference();
*ppSmtpInstance = pSmtpInstance ; return FALSE ; } else { //lie and say we did not find the instance
//if we are shutting down
*ppSmtpInstance = NULL; return FALSE; } }
// did not find it - continue iteration
return TRUE; }
//+---------------------------------------------------------------
//
// Function: FindIISInstance
//
// Synopsis: Returns an instance pointer for the given ID
//
// Arguments: pointer to an SMTP server calss and instance ID
//
// Returns: pointer to an SMTP instance class
//
// History:
//
//----------------------------------------------------------------
PSMTP_SERVER_INSTANCE FindIISInstance( PSMTP_IIS_SERVICE pService, DWORD dwInstanceId )
{ PFN_INSTANCE_ENUM pfnInstanceEnum = NULL ; PSMTP_SERVER_INSTANCE pInstance = NULL ;
TraceFunctEnter("FindIISInstance");
pService->AcquireServiceShareLock(); //
// Iterate over all instances
//
pfnInstanceEnum = (PFN_INSTANCE_ENUM)&CheckInstanceId; if( !pService->EnumServiceInstances( (PVOID)(SIZE_T)dwInstanceId, (PVOID)&pInstance, pfnInstanceEnum ) ) {
ErrorTrace(0,"Error enumerating instances"); }
//if we found an instance, but it's not running, or the service is
//not running, then dereference the instance and leave
if(pInstance && ( (pInstance->QueryServerState() != MD_SERVER_STATE_STARTED) || (pService->QueryCurrentServiceState() != SERVICE_RUNNING)))
{ pInstance->Dereference(); pInstance = NULL; }
pService->ReleaseServiceShareLock();
TraceFunctLeave();
return pInstance ; }
BOOL CountInstances( PVOID pvContext, PVOID pvContext1, PIIS_SERVER_INSTANCE pInstance ) {
if(pInstance) { (*(DWORD*)pvContext)++; }
return TRUE; }
BOOL GetInstancePerfData( PVOID pvContext, PVOID pvContext1, PIIS_SERVER_INSTANCE pInstance ) {
DWORD dwInstanceId = (DWORD)((DWORD_PTR)pvContext) ; PSMTP_STATISTICS_BLOCK pStatsBlock; PSMTP_INSTANCE_LIST_ENTRY pInstanceInfo = NULL;
pStatsBlock = *(PSMTP_STATISTICS_BLOCK *) pvContext1;
if(pInstance->QueryInstanceId() <= (DWORD)((DWORD_PTR)pvContext)) { pStatsBlock->dwInstance = pInstance->QueryInstanceId();
pInstanceInfo = ((SMTP_SERVER_INSTANCE *)pInstance)->GetSmtpInstanceInfo();
if(pInstanceInfo) { pInstanceInfo->pSmtpServerStatsObj->CopyToStatsBuffer(&(pStatsBlock->Stats_0)); } //((SMTP_SERVER_INSTANCE *)pInstance)->GetSmtpInstanceInfo()->pSmtpServerStatsObj->CopyToStatsBuffer(&(pStatsBlock->Stats_0));
(*(PSMTP_STATISTICS_BLOCK *) pvContext1)++; return TRUE; }
return FALSE;
}
PSMTP_STATISTICS_BLOCK_ARRAY GetServerPerfCounters(PSMTP_IIS_SERVICE pService) { DWORD NumInstances = 0; DWORD dwAlloc = 0; PSMTP_INSTANCE_LIST_ENTRY pSmtpInfo = NULL; PSMTP_STATISTICS_BLOCK_ARRAY pSmtpStatsBlockArray = NULL; PSMTP_STATISTICS_BLOCK pStatsBlock = NULL;
TraceFunctEnter("GetServerPerfCounters");
PFN_INSTANCE_ENUM pfnInstanceEnum = NULL ;
//Get the count of the number of instances first
pfnInstanceEnum = (PFN_INSTANCE_ENUM)&CountInstances;
if( !pService->EnumServiceInstances( (PVOID)&NumInstances, (PVOID)NULL, pfnInstanceEnum ) ) {
ErrorTrace(0,"Error counting instances"); }
if (NumInstances == 0) { TraceFunctLeave(); return NULL; }
//allocate memory to return to caller
dwAlloc = sizeof(SMTP_STATISTICS_BLOCK_ARRAY) + NumInstances * sizeof(SMTP_STATISTICS_BLOCK); pSmtpStatsBlockArray = (PSMTP_STATISTICS_BLOCK_ARRAY)MIDL_user_allocate(dwAlloc); if (!pSmtpStatsBlockArray) { TraceFunctLeave(); return NULL; }
ZeroMemory(pSmtpStatsBlockArray, dwAlloc);
//fill in memory structure
pSmtpStatsBlockArray->cEntries = NumInstances; pStatsBlock = pSmtpStatsBlockArray->aStatsBlock; pfnInstanceEnum = (PFN_INSTANCE_ENUM)&GetInstancePerfData;
if( !pService->EnumServiceInstances( (PVOID)(SIZE_T)NumInstances, (PVOID)&pStatsBlock, pfnInstanceEnum ) ) {
ErrorTrace(0,"Error counting instances"); }
TraceFunctLeave(); return pSmtpStatsBlockArray; }
|