341 lines
8.2 KiB
C
341 lines
8.2 KiB
C
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1996.
|
|
//
|
|
// File: outfuncs.cxx
|
|
//
|
|
// Contents: functions for log/trace output
|
|
//
|
|
// Functions: AddOutputFunction
|
|
// DelOutputFunction
|
|
// CallOutputFunctions
|
|
//
|
|
// History: 09-Jan-96 murthys Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <windows.h>
|
|
#include <stdarg.h>
|
|
#include <tchar.h>
|
|
#if DBG==1
|
|
#include "outfuncs.h"
|
|
|
|
// *** Global Data ***
|
|
static StringOutFunc debugscrfn = (StringOutFunc)OutputDebugStringA;
|
|
StringOutFunc gpfunc[BUFFER_MAX_FUNCTIONS] = {
|
|
(StringOutFunc)OutputDebugStringA,
|
|
NULL
|
|
};
|
|
HANDLE ghLogFile = INVALID_HANDLE_VALUE;
|
|
CRITICAL_SECTION g_LogFileCS;
|
|
BOOL g_LogFileLockValid = FALSE;
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: AddOutputFunction
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: [pfunc] --
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 09-Jan-96 murthys Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void AddOutputFunction(StringOutFunc pfunc)
|
|
{
|
|
int i, at = -1;
|
|
|
|
for (i = 0; i < BUFFER_MAX_FUNCTIONS; i++)
|
|
{
|
|
if ((at == -1) && (gpfunc[i] == NULL))
|
|
{
|
|
at = i; // Insert it here
|
|
}
|
|
else
|
|
{
|
|
if (gpfunc[i] == pfunc) // check for dups
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if (at != -1)
|
|
{
|
|
gpfunc[at] = pfunc;
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: DelOutputFunction
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: [pfunc]
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 09-Jan-96 murthys Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void DelOutputFunction(StringOutFunc pfunc)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < BUFFER_MAX_FUNCTIONS; i++)
|
|
{
|
|
if (gpfunc[i] == pfunc)
|
|
{
|
|
gpfunc[i] = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CallOutputFunctions
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: (none)
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 09-Jan-96 murthys Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void CallOutputFunctions(const char *buffer)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < BUFFER_MAX_FUNCTIONS; i++)
|
|
{
|
|
if (gpfunc[i] != NULL)
|
|
{
|
|
gpfunc[i](buffer);
|
|
}
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: WriteToDebugScreen
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: [flag] - TRUE/FALSE to turn ON/OFF
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 09-Jan-96 murthys Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void WriteToDebugScreen(BOOL flag)
|
|
{
|
|
if (flag)
|
|
{
|
|
AddOutputFunction(debugscrfn);
|
|
}
|
|
else
|
|
{
|
|
DelOutputFunction(debugscrfn);
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: WriteToLogFile
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: [logfile] - path of file to write to
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 09-Jan-96 murthys Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void WriteToLogFile(LPCTSTR lpfn)
|
|
{
|
|
if (!g_LogFileLockValid)
|
|
return;
|
|
|
|
EnterCriticalSection(&g_LogFileCS);
|
|
|
|
if (ghLogFile != INVALID_HANDLE_VALUE)
|
|
{
|
|
CloseHandle(ghLogFile);
|
|
DelOutputFunction(OutputLogFileA);
|
|
ghLogFile = INVALID_HANDLE_VALUE;
|
|
}
|
|
if ((lpfn) && (lpfn[0] != _TEXT('\0')))
|
|
{
|
|
SECURITY_ATTRIBUTES sattr;
|
|
|
|
sattr.nLength = sizeof(sattr);
|
|
sattr.lpSecurityDescriptor = NULL;
|
|
sattr.bInheritHandle = FALSE;
|
|
|
|
#ifdef _CHICAGO_
|
|
ghLogFile = CreateFileA(lpfn, GENERIC_READ|GENERIC_WRITE,
|
|
FILE_SHARE_READ|FILE_SHARE_WRITE,
|
|
&sattr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
#else
|
|
ghLogFile = CreateFile(lpfn, GENERIC_READ|GENERIC_WRITE,
|
|
FILE_SHARE_READ|FILE_SHARE_WRITE,
|
|
&sattr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
#endif // _CHICAGO_
|
|
if (ghLogFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
OutputDebugStringA("OLE (WriteToLogFile):Unable to open log file!\n");
|
|
}
|
|
else
|
|
{
|
|
AddOutputFunction(OutputLogFileA);
|
|
}
|
|
}
|
|
|
|
LeaveCriticalSection(&g_LogFileCS);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: OutputLogFileA
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: [buf] - NULL terminated ANSI string to write
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 09-Jan-96 murthys Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void OutputLogFileA(const char *buf)
|
|
{
|
|
DWORD dwtowrite = strlen(buf);
|
|
DWORD dwwritten;
|
|
LONG loffhigh = 0, lofflow;
|
|
|
|
if (!g_LogFileLockValid)
|
|
return;
|
|
|
|
EnterCriticalSection(&g_LogFileCS);
|
|
// Goto EOF, Lock, Write and Unlock
|
|
lofflow = (LONG) SetFilePointer(ghLogFile, 0, &loffhigh, FILE_END);
|
|
LockFile(ghLogFile, lofflow, loffhigh, dwtowrite, 0);
|
|
WriteFile(ghLogFile, buf, dwtowrite, &dwwritten, NULL);
|
|
UnlockFile(ghLogFile, lofflow, loffhigh, dwtowrite, 0);
|
|
LeaveCriticalSection(&g_LogFileCS);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: OpenDebugSinks()
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 26-Jan-96 murthys Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void OpenDebugSinks()
|
|
{
|
|
// Get LogFile name
|
|
char tmpstr[MAX_PATH];
|
|
DWORD cbtmpstr = sizeof(tmpstr);
|
|
LPTSTR lptstr;
|
|
|
|
NTSTATUS status = RtlInitializeCriticalSection(&g_LogFileCS);
|
|
g_LogFileLockValid = NT_SUCCESS(status);
|
|
if (!g_LogFileLockValid)
|
|
return;
|
|
|
|
GetProfileStringA("CairOLE InfoLevels", // section
|
|
"LogFile", // key
|
|
"", // default value
|
|
tmpstr, // return buffer
|
|
cbtmpstr);
|
|
if (tmpstr[0] != '\0')
|
|
{
|
|
#ifdef _CHICAGO_
|
|
lptstr = tmpstr;
|
|
|
|
WriteToLogFile(lptstr);
|
|
#else
|
|
// convert ansi to unicode
|
|
WCHAR wtmpstr[MAX_PATH];
|
|
|
|
lptstr = wtmpstr;
|
|
if (MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, tmpstr, -1, wtmpstr, MAX_PATH))
|
|
{
|
|
WriteToLogFile(lptstr);
|
|
}
|
|
else
|
|
{
|
|
OutputDebugStringA("OLE32: MultiByteToWideChar failed for logfile!\n");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// See if Debug Screen should be turned off
|
|
GetProfileStringA("CairOLE InfoLevels", // section
|
|
"DebugScreen", // key
|
|
"Yes", // default value
|
|
tmpstr, // return buffer
|
|
cbtmpstr);
|
|
if ((tmpstr[0] == 'n') || (tmpstr[0] == 'N'))
|
|
{
|
|
WriteToDebugScreen(FALSE); // turn off output to debugger screen
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CloseDebugSinks()
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 26-Jan-96 murthys Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void CloseDebugSinks()
|
|
{
|
|
// close log file (if any)
|
|
WriteToLogFile(NULL);
|
|
|
|
if (g_LogFileLockValid)
|
|
{
|
|
DeleteCriticalSection(&g_LogFileCS);
|
|
}
|
|
}
|
|
#endif // DBG == 1
|