Leaked source code of windows server 2003
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.
 
 
 
 
 
 

180 lines
3.6 KiB

/*
- PERFUTIL.C
-
* Purpose:
* Contain utility functions used by both the CNTR objects and the
* DMI PerfMon DLL. Mainly the shared memory routines used to
* convey the perf data across the process boundry.
*
*
*/
#include "perfutil.h"
#include <winerror.h>
#include <sddl.h>
#include <Aclapi.h>
#ifdef __cplusplus
extern "C"
{
#endif
/*
- HrOpenSharedMemory
-
* Purpose:
* Opens the shared memory data block that is used by the PerfMon
* counter. To be called by either the App or PerfDll to initialize
* the data block.
*
* Parameters:
* szName Name of the shared file mapping
* dwSize Size of shared memory block requested
* psz Pointer to SECURITY_ATTRIBUTES for Shared Memory
* ph Pointer to the returned shared memory handle
* ppv Pointer to the returned shared memory pointer
* pfExist Pointer to a BOOL indicating this named shared
* block has already been opened.
*
* Errors:
* hr Indicating success or failure
*
*/
#define Align4K(cb) ((cb + (4 << 10) - 1) & ~((4 << 10) - 1))
HRESULT
HrOpenSharedMemory(LPWSTR szName,
DWORD dwSize,
SECURITY_ATTRIBUTES * psa,
HANDLE * ph,
LPVOID * ppv,
BOOL * pfExist)
{
HRESULT hr = NOERROR;
// Validate params
if (!szName || !ph || !ppv || !pfExist || !psa)
return E_INVALIDARG;
// Do we really need to create a mapping?
if (0 == dwSize)
return E_INVALIDARG;
*ppv = NULL;
*ph = CreateFileMapping(INVALID_HANDLE_VALUE,
psa,
PAGE_READWRITE,
0,
Align4K(dwSize),
szName);
if (*ph)
{
*pfExist = !!(GetLastError() == ERROR_ALREADY_EXISTS);
*ppv = MapViewOfFile(*ph, FILE_MAP_ALL_ACCESS, 0, 0, 0);
}
if (*ppv == NULL)
hr = E_OUTOFMEMORY;
return hr;
}
/*
- HrInitializeSecurityAttribute
-
* Purpose:
* Initalize the SECURITY_ATTRIBUTES data structure for later use.
*
* Parameters:
* psa pointer to caller allocated SECURITY_ATTRIBUTES struct
* psd pointer to caller allocated SECURITY_DESCRIPTOR struct
*
* Errors:
* hr Indicates success or failure
*/
HRESULT
HrInitializeSecurityAttribute(SECURITY_ATTRIBUTES * psa)
{
HRESULT hr = S_OK;
WCHAR wszSDL[MAX_PATH]=L"D:(A;OICI;GA;;;BA)(A;OICIIO;GA;;;CO)(A;OICI;GA;;;NS)(A;OICI;GA;;;SY)";
SECURITY_DESCRIPTOR *pSD=NULL;
ULONG lSize=0;
if (!psa )
{
hr = E_INVALIDARG;
goto ret;
}
if(!ConvertStringSecurityDescriptorToSecurityDescriptorW(
wszSDL,
SDDL_REVISION_1,
&pSD,
&lSize))
{
return HRESULT_FROM_WIN32(GetLastError());
}
psa->nLength = sizeof(SECURITY_ATTRIBUTES);
psa->lpSecurityDescriptor = pSD;
psa->bInheritHandle = TRUE;
ret:
return hr;
}
/*
- HrCreatePerfMutex
-
* Purpose:
* Initializes the mutex object used to protect access to the per-instance
* PerfMon data. This is used by methods of the INSTCNTR class and the
* _perfapp.lib. Upon successful return from the function, the caller owns
* the mutex and must release it as appropriate.
*
* Parameters:
* phmtx Pointer to a handle to the returned mutex
*
* Errors:
* hr Indicating success or failure
*/
HRESULT
HrCreatePerfMutex(SECURITY_ATTRIBUTES * psa,
LPWSTR szMutexName,
HANDLE * phmtx)
{
HRESULT hr = S_OK;
if (!psa || !szMutexName || !phmtx)
{
return E_INVALIDARG;
}
*phmtx = CreateMutex(psa, TRUE, szMutexName);
if (*phmtx == NULL)
{
hr = E_FAIL;
}
return hr;
}
#ifdef __cplusplus
}
#endif