241 lines
3.6 KiB
C
241 lines
3.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
logutil.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Helper routines for logging data.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
03-Oct-1999 SamerA
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "w64logp.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
WOW64LOGAPI
|
||
|
NTSTATUS
|
||
|
Wow64LogMessageArgList(
|
||
|
IN UINT_PTR Flags,
|
||
|
IN PSZ Format,
|
||
|
IN va_list ArgList)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Logs a message.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Flags - Determine the output log type
|
||
|
Format - Formatting string
|
||
|
... - Variable argument
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NTSTATUS
|
||
|
--*/
|
||
|
{
|
||
|
int BytesWritten;
|
||
|
CHAR Buffer[ MAX_LOG_BUFFER ];
|
||
|
|
||
|
//
|
||
|
// Check trace gate flag
|
||
|
//
|
||
|
if (!((Wow64LogFlags & ~(UINT_PTR)LF_CONSOLE) & Flags))
|
||
|
{
|
||
|
return STATUS_SUCCESS;
|
||
|
}
|
||
|
|
||
|
BytesWritten = _vsnprintf(Buffer,
|
||
|
sizeof(Buffer) - 1,
|
||
|
Format,
|
||
|
ArgList);
|
||
|
|
||
|
if (BytesWritten < 0)
|
||
|
{
|
||
|
return STATUS_BUFFER_TOO_SMALL;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Log the results
|
||
|
//
|
||
|
LogOut(Buffer, Wow64LogFlags);
|
||
|
|
||
|
return STATUS_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
WOW64LOGAPI
|
||
|
NTSTATUS
|
||
|
Wow64LogMessage(
|
||
|
IN UINT_PTR Flags,
|
||
|
IN PSZ Format,
|
||
|
IN ...)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Helper around logs a message that accepts a variable argument list
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Flags - Determine the output log type
|
||
|
Format - Formatting string
|
||
|
... - Variable argument
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NTSTATUS
|
||
|
--*/
|
||
|
{
|
||
|
NTSTATUS NtStatus;
|
||
|
va_list ArgList;
|
||
|
|
||
|
va_start(ArgList, Format);
|
||
|
NtStatus = Wow64LogMessageArgList(Flags, Format, ArgList);
|
||
|
va_end(ArgList);
|
||
|
|
||
|
return NtStatus;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
LogFormat(
|
||
|
IN OUT PLOGINFO LogInfo,
|
||
|
IN PSZ Format,
|
||
|
...)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Formats a message
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
LogInfo - Logging Information (buffer + available bytes)
|
||
|
pszFormat - Format string
|
||
|
... - Optional arguments
|
||
|
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NTSTATUS - BufferSize is increment with the amount of bytes
|
||
|
written if successful.
|
||
|
--*/
|
||
|
{
|
||
|
va_list ArgList;
|
||
|
NTSTATUS NtStatus = STATUS_SUCCESS;
|
||
|
int BytesWritten;
|
||
|
|
||
|
va_start(ArgList, Format);
|
||
|
|
||
|
BytesWritten = _vsnprintf(LogInfo->OutputBuffer, LogInfo->BufferSize, Format, ArgList);
|
||
|
|
||
|
va_end(ArgList);
|
||
|
|
||
|
if (BytesWritten < 0)
|
||
|
{
|
||
|
NtStatus = STATUS_BUFFER_TOO_SMALL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LogInfo->BufferSize -= BytesWritten;
|
||
|
LogInfo->OutputBuffer += BytesWritten;
|
||
|
}
|
||
|
return NtStatus;
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
LogOut(
|
||
|
IN PSZ Text,
|
||
|
UINT_PTR Flags
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Logs -outputs- a message
|
||
|
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Text - Formatted string to log
|
||
|
|
||
|
Flags - Control flags
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
--*/
|
||
|
{
|
||
|
if ((Flags & LF_CONSOLE) != 0)
|
||
|
{
|
||
|
DbgPrint(Text);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Check if we need to send the output to a file
|
||
|
//
|
||
|
if (Wow64LogFileHandle != INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
LogWriteFile(Wow64LogFileHandle, Text);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
LogWriteFile(
|
||
|
IN HANDLE FileHandle,
|
||
|
IN PSZ LogText)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Writes text to a file handle
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
FileHandle - Handle to a file object
|
||
|
LogText - Text to log to file
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
NTSTATUS
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
IO_STATUS_BLOCK IoStatus;
|
||
|
NTSTATUS NtStatus;
|
||
|
|
||
|
NtStatus = NtWriteFile(FileHandle,
|
||
|
NULL, // event
|
||
|
NULL, // apcroutine
|
||
|
NULL, // apccontext
|
||
|
&IoStatus,
|
||
|
LogText,
|
||
|
strlen(LogText),
|
||
|
NULL, // ByteOffset
|
||
|
NULL); // key
|
||
|
|
||
|
return NtStatus;
|
||
|
}
|
||
|
|
||
|
|