windows-nt/Source/XPSP1/NT/ds/netapi/svcimgs/ntrepl/perfdll/perfmain.c

190 lines
5 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
perfmain.c
Abstract:
This file contains the DllMain function for the NTFRSPRF.dll.
Author:
Rohan Kumar [rohank] 15-Feb-1999
Environment:
User Mode Service
Revision History:
--*/
//
// The common header file which leads to the definition of the CRITICAL_SECTION
// data structure and declares the globals FRS_ThrdCounter and FRC_ThrdCounter.
//
#include <perrepsr.h>
//
// If InitializeCriticalSection raises an exception, set the global boolean
// (below) to FALSE.
//
BOOLEAN ShouldPerfmonCollectData = TRUE;
#ifdef INCLLOGGING
HANDLE hEventLog;
BOOLEAN DoLogging = TRUE;
#define NTFRSPERF \
L"SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Application\\NTFRSPerf"
#define EVENTLOGDLL L"%SystemRoot%\\System32\\ntfrsres.dll"
#endif // INCLLOGGING
BOOL
WINAPI
DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID fImpLoad
)
/*++
Routine Description:
The DllMain routine for the NTFRSPRF.dll.
Arguments:
hinstDLL - Instance handle of the DLL.
fdwReason - The reason for this function to be called by the system.
fImpLoad - Indicated whether the DLL was implicitly or explicitly loaded.
Return Value:
TRUE.
--*/
{
DWORD flag, WStatus;
DWORD TypesSupported = 7; // Types of EventLog messages supported.
HKEY Key;
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
//
// THe DLL is being mapped into the process's address space. When this
// happens, initialize the CRITICAL_SECTION objects being used for
// synchronization. We enclose the call to InitializeCriticalSection in
// a try-except block cause its possible for it to raise a
// STATUS_NO_MEMORY exception.
//
try {
InitializeCriticalSection(&FRS_ThrdCounter);
InitializeCriticalSection(&FRC_ThrdCounter);
} except(EXCEPTION_EXECUTE_HANDLER) {
ShouldPerfmonCollectData = FALSE;
return(TRUE);
}
#ifdef INCLLOGGING
//
// Create/Open a Key under the Application key for logging purposes.
// Here, the return status is intentionally not checked because even
// if we fail, we return TRUE. EventLogging is not critically important.
// Returning FALSE will cause the process loading this DLL to terminate.
//
WStatus = RegCreateKeyEx (HKEY_LOCAL_MACHINE,
NTFRSPERF,
0L,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&Key,
&flag);
if (WStatus != ERROR_SUCCESS) {
DoLogging = FALSE;
break;
}
//
// Set the values EventMessageFile and TypesSupported. Return value is
// intentionally not checked (see above).
//
WStatus = RegSetValueEx(Key,
L"EventMessageFile",
0L,
REG_EXPAND_SZ,
(BYTE *)EVENTLOGDLL,
(1 + wcslen(EVENTLOGDLL)) * sizeof(WCHAR));
if (WStatus != ERROR_SUCCESS) {
DoLogging = FALSE;
RegCloseKey(Key);
break;
}
WStatus = RegSetValueEx(Key,
L"TypesSupported",
0L,
REG_DWORD,
(BYTE *)&TypesSupported,
sizeof(DWORD));
if (WStatus != ERROR_SUCCESS) {
DoLogging = FALSE;
RegCloseKey(Key);
break;
}
//
// Close the key
//
RegCloseKey(Key);
//
// Get the handle used to report errors in the event log. Return value
// is intentionally not checked (see above).
//
hEventLog = RegisterEventSource((LPCTSTR)NULL,
(LPCTSTR)L"NTFRSPerf");
if (hEventLog == NULL) {
DoLogging = FALSE;
}
#endif // INCLLOGGING
break;
case DLL_THREAD_ATTACH:
//
// A thread is being created. Nothing to do.
//
break;
case DLL_THREAD_DETACH:
//
// A thread is exiting cleanly. Nothing to do.
//
break;
case DLL_PROCESS_DETACH:
//
// The DLL is being unmapped from the process's address space. Free up
// the resources.
//
if (ShouldPerfmonCollectData) {
DeleteCriticalSection(&FRS_ThrdCounter);
DeleteCriticalSection(&FRC_ThrdCounter);
}
#ifdef INCLLOGGING
if (DoLogging) {
DeregisterEventSource(hEventLog);
}
#endif // INCLLOGGING
break;
}
return(TRUE);
}