mirror of https://github.com/tongzx/nt5src
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.
189 lines
5.0 KiB
189 lines
5.0 KiB
/*++
|
|
|
|
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);
|
|
}
|
|
|