예제 #1
0
// 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;
}
예제 #2
0
// 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);
}