/*++ 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; }