409 lines
18 KiB
C
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
|