//===-- WindowsMiniDump.cpp -----------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// This function is separated out from ObjectFilePECOFF.cpp to name avoid name
// collisions with WinAPI preprocessor macros.

#include "WindowsMiniDump.h"
#include "lldb/Utility/FileSpec.h"
#include "llvm/Support/ConvertUTF.h"

#ifdef _WIN32
#include "lldb/Host/windows/windows.h"
#include <dbghelp.h>
#endif

namespace lldb_private {

bool SaveMiniDump(const lldb::ProcessSP &process_sp,
                  SaveCoreOptions &core_options, lldb_private::Status &error) {
  if (!process_sp)
    return false;
#ifdef _WIN32
  std::optional<FileSpec> outfileSpec = core_options.GetOutputFile();
  const auto &outfile = outfileSpec.value();
  HANDLE process_handle = ::OpenProcess(
      PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_sp->GetID());
  const std::string file_name = outfile.GetPath();
  std::wstring wide_name;
  wide_name.resize(file_name.size() + 1);
  char *result_ptr = reinterpret_cast<char *>(&wide_name[0]);
  const llvm::UTF8 *error_ptr = nullptr;
  if (!llvm::ConvertUTF8toWide(sizeof(wchar_t), file_name, result_ptr,
                               error_ptr)) {
    error = Status::FromErrorString("cannot convert file name");
    return false;
  }
  HANDLE file_handle =
      ::CreateFileW(wide_name.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL,
                    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  const auto result =
      ::MiniDumpWriteDump(process_handle, process_sp->GetID(), file_handle,
                          MiniDumpWithFullMemoryInfo, NULL, NULL, NULL);
  ::CloseHandle(file_handle);
  ::CloseHandle(process_handle);
  if (!result) {
    error = Status(::GetLastError(), lldb::eErrorTypeWin32);
    return false;
  }
  return true;
#endif
  return false;
}

} // namesapce lldb_private
