1*80814287SRaphael Isemann //===-- WindowsMiniDump.cpp -----------------------------------------------===//
2f7d1893fSAdrian McCarthy //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f7d1893fSAdrian McCarthy //
7f7d1893fSAdrian McCarthy //===----------------------------------------------------------------------===//
8f7d1893fSAdrian McCarthy
9f7d1893fSAdrian McCarthy // This function is separated out from ObjectFilePECOFF.cpp to name avoid name
10f7d1893fSAdrian McCarthy // collisions with WinAPI preprocessor macros.
11f7d1893fSAdrian McCarthy
12f7d1893fSAdrian McCarthy #include "WindowsMiniDump.h"
135713a05bSZachary Turner #include "lldb/Utility/FileSpec.h"
14f7d1893fSAdrian McCarthy #include "llvm/Support/ConvertUTF.h"
15f7d1893fSAdrian McCarthy
16f7d1893fSAdrian McCarthy #ifdef _WIN32
17f7d1893fSAdrian McCarthy #include "lldb/Host/windows/windows.h"
18672d2c12SJonas Devlieghere #include <dbghelp.h>
19f7d1893fSAdrian McCarthy #endif
20f7d1893fSAdrian McCarthy
21f7d1893fSAdrian McCarthy namespace lldb_private {
22f7d1893fSAdrian McCarthy
SaveMiniDump(const lldb::ProcessSP & process_sp,const lldb_private::FileSpec & outfile,lldb_private::Status & error)23b9c1b51eSKate Stone bool SaveMiniDump(const lldb::ProcessSP &process_sp,
24f7d1893fSAdrian McCarthy const lldb_private::FileSpec &outfile,
2597206d57SZachary Turner lldb_private::Status &error) {
26b9c1b51eSKate Stone if (!process_sp)
27b9c1b51eSKate Stone return false;
28f7d1893fSAdrian McCarthy #ifdef _WIN32
29b9c1b51eSKate Stone HANDLE process_handle = ::OpenProcess(
30b9c1b51eSKate Stone PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_sp->GetID());
31f7d1893fSAdrian McCarthy const std::string file_name = outfile.GetCString();
32f7d1893fSAdrian McCarthy std::wstring wide_name;
33f7d1893fSAdrian McCarthy wide_name.resize(file_name.size() + 1);
34f7d1893fSAdrian McCarthy char *result_ptr = reinterpret_cast<char *>(&wide_name[0]);
3559082498SAdrian McCarthy const llvm::UTF8 *error_ptr = nullptr;
36b9c1b51eSKate Stone if (!llvm::ConvertUTF8toWide(sizeof(wchar_t), file_name, result_ptr,
37b9c1b51eSKate Stone error_ptr)) {
38f7d1893fSAdrian McCarthy error.SetErrorString("cannot convert file name");
39f7d1893fSAdrian McCarthy return false;
40f7d1893fSAdrian McCarthy }
41b9c1b51eSKate Stone HANDLE file_handle =
42b9c1b51eSKate Stone ::CreateFileW(wide_name.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL,
43b9c1b51eSKate Stone CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
44b9c1b51eSKate Stone const auto result =
45b9c1b51eSKate Stone ::MiniDumpWriteDump(process_handle, process_sp->GetID(), file_handle,
460c35cde9SAdrian McCarthy MiniDumpWithFullMemoryInfo, NULL, NULL, NULL);
47f7d1893fSAdrian McCarthy ::CloseHandle(file_handle);
48f7d1893fSAdrian McCarthy ::CloseHandle(process_handle);
49b9c1b51eSKate Stone if (!result) {
50f7d1893fSAdrian McCarthy error.SetError(::GetLastError(), lldb::eErrorTypeWin32);
51f7d1893fSAdrian McCarthy return false;
52f7d1893fSAdrian McCarthy }
53f7d1893fSAdrian McCarthy return true;
54f7d1893fSAdrian McCarthy #endif
55f7d1893fSAdrian McCarthy return false;
56f7d1893fSAdrian McCarthy }
57f7d1893fSAdrian McCarthy
58f7d1893fSAdrian McCarthy } // namesapce lldb_private
59