184 lines
4.3 KiB
C++
184 lines
4.3 KiB
C++
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Copyright (c) 1998, Microsoft Corp. All rights reserved.
|
||
|
//
|
||
|
// FILE
|
||
|
//
|
||
|
// stats.cpp
|
||
|
//
|
||
|
// SYNOPSIS
|
||
|
//
|
||
|
// Defines functions for accessing the statistics in shared memory.
|
||
|
//
|
||
|
// MODIFICATION HISTORY
|
||
|
//
|
||
|
// 09/10/1998 Original version.
|
||
|
// 10/09/1998 Use a null DACL when creating mutex.
|
||
|
// 09/28/1999 Only allow Administrators access to mutex.
|
||
|
// 02/18/2000 Added proxy statistics.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include <ias.h>
|
||
|
#include <stats.h>
|
||
|
|
||
|
//////////
|
||
|
// Zero'ed out stats; used when the shared memory is unavailable.
|
||
|
//////////
|
||
|
RadiusStatistics defaultStats;
|
||
|
RadiusProxyStatistics defaultProxyStats;
|
||
|
|
||
|
//////////
|
||
|
// Handles/pointers to the shared-memory statistics.
|
||
|
//////////
|
||
|
HANDLE theMonitor;
|
||
|
HANDLE theMapping;
|
||
|
HANDLE theProxyMapping;
|
||
|
RadiusStatistics* theStats = &defaultStats;
|
||
|
RadiusProxyStatistics* theProxy = &defaultProxyStats;
|
||
|
|
||
|
BOOL
|
||
|
WINAPI
|
||
|
StatsOpen( VOID )
|
||
|
{
|
||
|
// Create the SID for local Administrators.
|
||
|
SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
|
||
|
PSID adminSid = (PSID)_alloca(GetSidLengthRequired(2));
|
||
|
InitializeSid(
|
||
|
adminSid,
|
||
|
&sia,
|
||
|
2
|
||
|
);
|
||
|
*GetSidSubAuthority(adminSid, 0) = SECURITY_BUILTIN_DOMAIN_RID;
|
||
|
*GetSidSubAuthority(adminSid, 1) = DOMAIN_ALIAS_RID_ADMINS;
|
||
|
|
||
|
// Create an ACL giving Administrators all access.
|
||
|
ULONG cbAcl = sizeof(ACL) +
|
||
|
(sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD)) +
|
||
|
GetLengthSid(adminSid);
|
||
|
PACL acl = (PACL)_alloca(cbAcl);
|
||
|
InitializeAcl(
|
||
|
acl,
|
||
|
cbAcl,
|
||
|
ACL_REVISION
|
||
|
);
|
||
|
AddAccessAllowedAce(
|
||
|
acl,
|
||
|
ACL_REVISION,
|
||
|
MUTEX_ALL_ACCESS,
|
||
|
adminSid
|
||
|
);
|
||
|
|
||
|
// Create a security descriptor with the above ACL.
|
||
|
PSECURITY_DESCRIPTOR pSD;
|
||
|
BYTE buffer[SECURITY_DESCRIPTOR_MIN_LENGTH];
|
||
|
pSD = (PSECURITY_DESCRIPTOR)buffer;
|
||
|
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
|
||
|
SetSecurityDescriptorDacl(pSD, TRUE, acl, FALSE);
|
||
|
|
||
|
// Fill in the SECURITY_ATTRIBUTES struct.
|
||
|
SECURITY_ATTRIBUTES sa;
|
||
|
sa.nLength = sizeof(sa);
|
||
|
sa.lpSecurityDescriptor = pSD;
|
||
|
sa.bInheritHandle = TRUE;
|
||
|
|
||
|
// Create the mutex.
|
||
|
theMonitor = CreateMutex(
|
||
|
&sa,
|
||
|
FALSE,
|
||
|
L"Global\\" RadiusStatisticsMutex
|
||
|
);
|
||
|
|
||
|
return theMonitor ? TRUE : FALSE;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
WINAPI
|
||
|
StatsClose( VOID )
|
||
|
{
|
||
|
if (theStats != &defaultStats)
|
||
|
{
|
||
|
UnmapViewOfFile(theStats);
|
||
|
theStats = &defaultStats;
|
||
|
|
||
|
CloseHandle(theMapping);
|
||
|
theMapping = NULL;
|
||
|
}
|
||
|
|
||
|
if (theProxy != &defaultProxyStats)
|
||
|
{
|
||
|
UnmapViewOfFile(theProxy);
|
||
|
theProxy = &defaultProxyStats;
|
||
|
|
||
|
CloseHandle(theProxyMapping);
|
||
|
theProxyMapping = NULL;
|
||
|
}
|
||
|
|
||
|
CloseHandle(theMonitor);
|
||
|
|
||
|
theMonitor = NULL;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
WINAPI
|
||
|
StatsLock( VOID )
|
||
|
{
|
||
|
WaitForSingleObject(theMonitor, INFINITE);
|
||
|
|
||
|
if (theStats == &defaultStats)
|
||
|
{
|
||
|
// Open the file mapping ...
|
||
|
theMapping = OpenFileMappingW(
|
||
|
FILE_MAP_READ,
|
||
|
FALSE,
|
||
|
L"Global\\" RadiusStatisticsName
|
||
|
);
|
||
|
if (theMapping)
|
||
|
{
|
||
|
// ... and map a view into our address space.
|
||
|
PVOID view = MapViewOfFile(theMapping, FILE_MAP_READ, 0, 0, 0);
|
||
|
|
||
|
if (view)
|
||
|
{
|
||
|
theStats = (RadiusStatistics*)view;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CloseHandle(theMapping);
|
||
|
theMapping = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (theProxy == &defaultProxyStats)
|
||
|
{
|
||
|
// Open the file mapping ...
|
||
|
theProxyMapping = OpenFileMappingW(
|
||
|
FILE_MAP_READ,
|
||
|
FALSE,
|
||
|
L"Global\\" RadiusProxyStatisticsName
|
||
|
);
|
||
|
if (theProxyMapping)
|
||
|
{
|
||
|
// ... and map a view into our address space.
|
||
|
PVOID view = MapViewOfFile(theProxyMapping, FILE_MAP_READ, 0, 0, 0);
|
||
|
|
||
|
if (view)
|
||
|
{
|
||
|
theProxy = (RadiusProxyStatistics*)view;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CloseHandle(theProxyMapping);
|
||
|
theProxyMapping = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
WINAPI
|
||
|
StatsUnlock( VOID )
|
||
|
{
|
||
|
ReleaseMutex(theMonitor);
|
||
|
}
|