windows-nt/Source/XPSP1/NT/termsrv/common/trace/wtrcapi.c
2020-09-26 16:20:57 +08:00

409 lines
18 KiB
C

/**MOD+**********************************************************************/
/* Module: wtrcapi.c */
/* */
/* Purpose: External tracing functions - Windows specific */
/* */
/* Copyright(C) Microsoft Corporation 1997 */
/* */
/****************************************************************************/
/** Changes:
* $Log: Y:/logs/trc/wtrcapi.c_v $
*
* Rev 1.7 29 Aug 1997 09:42:02 ENH
* SFR1259: Changed SystemError
*
* Rev 1.6 12 Aug 1997 09:50:52 MD
* SFR1002: Remove kernel tracing code
*
* Rev 1.5 10 Jul 1997 18:04:26 AK
* SFR1016: Initial changes to support Unicode
*
* Rev 1.4 10 Jul 1997 17:34:10 KH
* SFR1022: Get 16-bit trace working
*
* Rev 1.3 03 Jul 1997 13:28:50 AK
* SFR0000: Initial development completed
**/
/**MOD-**********************************************************************/
/****************************************************************************/
/* */
/* CONTENTS */
/* ======== */
/* TRC_SystemError */
/* TRC_Initialize */
/* TRC_Terminate */
/* */
/****************************************************************************/
/****************************************************************************/
/* Standard includes. */
/****************************************************************************/
#include <adcg.h>
/****************************************************************************/
/* Define TRC_FILE and TRC_GROUP. */
/****************************************************************************/
#define TRC_FILE "wtrcapi"
#define TRC_GROUP TRC_GROUP_TRACE
/****************************************************************************/
/* Trace specific includes. */
/****************************************************************************/
#include <atrcapi.h>
#include <atrcint.h>
/****************************************************************************/
/* */
/* DATA */
/* */
/****************************************************************************/
#define DC_INCLUDE_DATA
#include <atrcdata.c>
#undef DC_INCLUDE_DATA
/****************************************************************************/
/* */
/* FUNCTIONS */
/* */
/****************************************************************************/
/**PROC+*********************************************************************/
/* TRC_SystemError(...) */
/* */
/* See wtrcapi.h for description. */
/**PROC-*********************************************************************/
DCVOID DCAPI DCEXPORT TRC_SystemError(DCUINT traceComponent,
DCUINT lineNumber,
PDCTCHAR funcName,
PDCTCHAR fileName,
PDCTCHAR string)
{
/************************************************************************/
/* The process of getting the system error is clearly platform specific */
/* so we call the platform specific function. */
/************************************************************************/
TRCSystemError(traceComponent,
lineNumber,
funcName,
fileName,
string);
return;
} /* TRC_SystemError */
/**PROC+*********************************************************************/
/* TRC_Initialize(...) */
/* */
/* See atrcapi.h for description. */
/**PROC-*********************************************************************/
DCUINT32 DCAPI DCEXPORT TRC_Initialize(DCBOOL initShared)
{
DCUINT rc = 0;
#ifndef OS_WINCE
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
OSVERSIONINFO ver;
PSID psidEveryone = NULL;
SID_IDENTIFIER_AUTHORITY sidEveryoneAuthority = SECURITY_WORLD_SID_AUTHORITY;
DCUINT32 dwDaclLength;
PACL pDacl = NULL;
#endif
BOOL releaseMutex = FALSE;
DC_IGNORE_PARAMETER(initShared);
/************************************************************************/
/* Create the mutex object which protects the shared memory mapped */
/* file. If the mutex has already been created then CreateMutex simply */
/* returns a handle to the existing mutex. */
/* */
/* The mutex will be created with a NULL Dacl so processes running it in*/
/* any context can have access. */
/************************************************************************/
#ifndef OS_WINCE
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&ver);
if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
/************************************************************************/
/* Get the SID for the Everyone group */
/************************************************************************/
if (!AllocateAndInitializeSid (
&sidEveryoneAuthority, // pIdentifierAuthority
1, // count of subauthorities
SECURITY_WORLD_RID, // subauthority 0
0, 0, 0, 0, 0, 0, 0, // subauthorities n
&psidEveryone)) { // pointer to pointer to SID
rc = TRC_RC_CREATE_MUTEX_FAILED;
OutputDebugString(_T("AllocateAndInitializeSid failed.\n"));
DC_QUIT;
}
/************************************************************************/
/* Allocate the Dacl */
/************************************************************************/
dwDaclLength = sizeof(ACL);
dwDaclLength += (sizeof(ACCESS_DENIED_ACE) - sizeof(DWORD)) +
GetLengthSid(psidEveryone);
dwDaclLength += (sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD)) +
GetLengthSid(psidEveryone);
pDacl = (PACL)LocalAlloc(LMEM_FIXED, dwDaclLength);
if (pDacl == NULL) {
rc = TRC_RC_CREATE_MUTEX_FAILED;
OutputDebugString(_T("Can't allocate Dacl.\n"));
DC_QUIT;
}
/************************************************************************/
/* Initialize it. */
/************************************************************************/
if (!InitializeAcl(pDacl, dwDaclLength, ACL_REVISION)) {
rc = TRC_RC_CREATE_MUTEX_FAILED;
OutputDebugString(_T("InitializeAcl failed.\n"));
DC_QUIT;
}
/************************************************************************/
/* Allow all access */
/************************************************************************/
if (!AddAccessAllowedAce(
pDacl,
ACL_REVISION,
GENERIC_ALL,
psidEveryone)) {
rc = TRC_RC_CREATE_MUTEX_FAILED;
OutputDebugString(_T("AddAccessAllowedAce failed.\n"));
DC_QUIT;
}
/************************************************************************/
/* Block Write-DACL Access */
/************************************************************************/
if (!AddAccessDeniedAce(
pDacl,
ACL_REVISION,
WRITE_DAC,
psidEveryone)) {
rc = TRC_RC_CREATE_MUTEX_FAILED;
OutputDebugString(_T("AddAccessDeniedAce failed.\n"));
DC_QUIT;
}
/************************************************************************/
/* Create the Mutex */
/************************************************************************/
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, pDacl, FALSE);
sa.lpSecurityDescriptor = &sd;
trchMutex = TRCCreateMutex(&sa,
FALSE,
TRC_MUTEX_NAME);
}
else {
#endif
trchMutex = TRCCreateMutex(NULL,
FALSE,
TRC_MUTEX_NAME);
#ifndef OS_WINCE
}
#endif
/************************************************************************/
/* Check that we created the mutex successfully. */
/************************************************************************/
if (NULL == trchMutex)
{
DWORD lastError = GetLastError();
OutputDebugString(_T("Failed to create mutex.\n"));
rc = TRC_RC_CREATE_MUTEX_FAILED;
DC_QUIT;
}
/************************************************************************/
/* Now that we've created the mutex, grab it. */
/************************************************************************/
TRCGrabMutex();
releaseMutex = TRUE;
/************************************************************************/
/* Check the current trace DLL state. Another thread may have */
/* concurrently called TRC_Initialize - if it has then we should exit */
/* as it will perform the initialization. */
/************************************************************************/
if (TRC_STATE_UNINITIALIZED != trcState)
{
TRCDebugOutput(_T("Trace DLL already initialized!\n"));
DC_QUIT;
}
/************************************************************************/
/* We need to open the shared data memory mapped file. */
/************************************************************************/
rc = TRCOpenSharedData();
/************************************************************************/
/* Check that the shared data MMF was created and opened successfully. */
/************************************************************************/
if (0 != rc)
{
DC_QUIT;
}
/************************************************************************/
/* Now open the memory mapped trace files. */
/************************************************************************/
rc = TRCOpenAllFiles();
/************************************************************************/
/* Check that the trace MMFs were opened successfully. */
/************************************************************************/
if (0 != rc)
{
DC_QUIT;
}
/************************************************************************/
/* Write out the trace DLL initialized trace line. */
/************************************************************************/
TRCInternalTrace(TRC_TRACE_DLL_INITIALIZE);
/************************************************************************/
/* Update our internal state. */
/************************************************************************/
trcState = TRC_STATE_INITIALIZED;
/************************************************************************/
/* Load the debug symbols. */
/************************************************************************/
rc = TRCSymbolsLoad();
if (0 != rc)
{
DC_QUIT;
}
DC_EXIT_POINT:
/************************************************************************/
/* Release the mutex. */
/************************************************************************/
if( releaseMutex )
{
TRCReleaseMutex();
}
#ifndef OS_WINCE
if (trchMutex == NULL) {
if (pDacl) LocalFree(pDacl);
if (psidEveryone) FreeSid(psidEveryone);
}
#endif
return(rc);
} /* TRC_Initialize */
/**PROC+*********************************************************************/
/* TRC_Terminate(...) */
/* */
/* See atrcapi.h for description. */
/**PROC-*********************************************************************/
DCVOID DCAPI DCEXPORT TRC_Terminate(DCBOOL termShared)
{
DC_IGNORE_PARAMETER(termShared);
/************************************************************************/
/* Grab the mutex. Note that this function is only called from the */
/* process detach case in the <DllMain> function - therefore we can be */
/* sure that this function gets called only once per process. */
/************************************************************************/
TRCGrabMutex();
/************************************************************************/
/* Unload the symbols if we've loaded them. */
/************************************************************************/
if (TEST_FLAG(trcProcessStatus, TRC_STATUS_SYMBOLS_LOADED))
{
TRCSymbolsUnload();
}
/************************************************************************/
/* Write out the trace DLL terminated trace line. */
/************************************************************************/
TRCInternalTrace(TRC_TRACE_DLL_TERMINATE);
/************************************************************************/
/* Close the trace files. */
/************************************************************************/
TRCCloseAllFiles();
/************************************************************************/
/* Now we need to close the shared data area. */
/************************************************************************/
TRCCloseSharedData();
/************************************************************************/
/* We're no longer initialized so update our per-process flags. */
/************************************************************************/
trcState = TRC_STATE_TERMINATED;
/************************************************************************/
/* Release the mutex. */
/************************************************************************/
TRCReleaseMutex();
/************************************************************************/
/* Close the mutex handle. The mutex object is automatically destroyed */
/* when the last handle is closed. */
/************************************************************************/
TRCCloseHandle(trchMutex);
trchMutex = NULL;
return;
} /* TRC_Terminate */
#if defined(OS_WINCE) || defined(TRC_CONVERTOANSI)
/**PROC+*********************************************************************/
/* Name: TRC_ConvertAndSprintf */
/* */
/* Purpose: Convert ANSI trace format string to Unicode and do sprintf */
/* Windows CE only */
/* */
/* Returns: None */
/* */
/* Params: OUT outBuf - output buffer */
/* IN format - ANSI format string */
/* IN ... - parameters */
/* */
/**PROC-*********************************************************************/
DCVOID DCAPI TRC_ConvertAndSprintf(PDCTCHAR outBuf, const PDCACHAR format,...)
{
va_list vaArgs;
DCINT count;
static DCTCHAR stackBuffer[TRC_LINE_BUFFER_SIZE];
count = DC_MIN(mbstowcs(NULL, format, 0), TRC_LINE_BUFFER_SIZE);
va_start(vaArgs, format);
mbstowcs(stackBuffer, format, count);
vswprintf(outBuf, stackBuffer, vaArgs);
va_end(vaArgs);
return;
}
#else
/****************************************************************************/
/* Dummy stub function, to enable a common DEF file to be used. */
/****************************************************************************/
DCVOID DCAPI TRC_ConvertAndSprintf(DCVOID)
{
return;
}
#endif // OS_WINCE