// Actual implementation of logging API. _Use_decl_annotations_ NTSTATUS LogpPrint(ULONG level, const char *function_name, const char *format, ...) { auto status = STATUS_SUCCESS; if (!LogpIsLogNeeded(level)) { return status; } va_list args; va_start(args, format); char log_message[412]; status = RtlStringCchVPrintfA(log_message, RTL_NUMBER_OF(log_message), format, args); va_end(args); if (!NT_SUCCESS(status)) { NT_ASSERT(false); return status; } if (log_message[0] == '\0') { return STATUS_INVALID_PARAMETER; } const auto pure_level = level & 0xf0; const auto attribute = level & 0x0f; // A single entry of log should not exceed 512 bytes. See // Reading and Filtering Debugging Messages in MSDN for details. char message[512]; static_assert(RTL_NUMBER_OF(message) <= 512, "One log message should not exceed 512 bytes."); status = LogpMakePrefix(pure_level, function_name, log_message, message, RTL_NUMBER_OF(message)); if (!NT_SUCCESS(status)) { NT_ASSERT(false); return status; } status = LogpPut(message, attribute); NT_ASSERT(NT_SUCCESS(status)); return status; }
// Actual implementation of logging API. EXTERN_C NTSTATUS LogpPrint(_In_ ULONG Level, _In_ const char *FunctionName, _In_ const char *Format, ...) { auto status = STATUS_SUCCESS; if (!LogpIsLogNeeded(Level)) { return status; } va_list args; va_start(args, Format); char logMessage[412]; status = RtlStringCchVPrintfA(logMessage, RTL_NUMBER_OF(logMessage), Format, args); va_end(args); if (!NT_SUCCESS(status)) { return status; } if (logMessage[0] == '\0') { return STATUS_INVALID_PARAMETER; } const auto pureLevel = Level & 0xf0; const auto attribute = Level & 0x0f; // A single entry of log should not exceed 512 bytes. See // Reading and Filtering Debugging Messages in MSDN for details. char message[512]; static_assert(RTL_NUMBER_OF(message) <= 512, "One log message should not exceed 512 bytes."); status = LogpMakePrefix(pureLevel, FunctionName, logMessage, message, RTL_NUMBER_OF(message)); if (!NT_SUCCESS(status)) { return status; } return LogpPut(message, attribute); }