/////////////////////////////////////////////////////////////////////////////// // // 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 #include ////////// // 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); }