aboutsummaryrefslogtreecommitdiff
path: root/source/Host/windows/HostInfoWindows.cpp
blob: 6dce71d9172ad08fa6bac2a697e9cef2c624cdac (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//===-- HostInfoWindows.cpp -------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Host/windows/windows.h"

#include <mutex> // std::once

#include "lldb/Host/windows/HostInfoWindows.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Path.h"

using namespace lldb_private;

FileSpec HostInfoWindows::m_program_filespec;

size_t
HostInfoWindows::GetPageSize()
{
    SYSTEM_INFO systemInfo;
    GetNativeSystemInfo(&systemInfo);
    return systemInfo.dwPageSize;
}

bool
HostInfoWindows::GetOSVersion(uint32_t &major, uint32_t &minor, uint32_t &update)
{
    OSVERSIONINFOEX info;

    ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
    info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
#pragma warning(push)
#pragma warning(disable : 4996)
    // Starting with Microsoft SDK for Windows 8.1, this function is deprecated in favor of the
    // new Windows Version Helper APIs.  Since we don't specify a minimum SDK version, it's easier
    // to simply disable the warning rather than try to support both APIs.
    if (GetVersionEx((LPOSVERSIONINFO)&info) == 0)
    {
        return false;
    }
#pragma warning(pop)

    major = info.dwMajorVersion;
    minor = info.dwMinorVersion;
    update = info.wServicePackMajor;

    return true;
}

bool
HostInfoWindows::GetOSBuildString(std::string &s)
{
    s.clear();
    uint32_t major, minor, update;
    if (!GetOSVersion(major, minor, update))
        return false;

    llvm::raw_string_ostream stream(s);
    stream << "Windows NT " << major << "." << minor << "." << update;
    return true;
}

bool
HostInfoWindows::GetOSKernelDescription(std::string &s)
{
    return GetOSBuildString(s);
}

bool
HostInfoWindows::GetHostname(std::string &s)
{
    char buffer[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
    if (!::GetComputerName(buffer, &dwSize))
        return false;

    s.assign(buffer, buffer + dwSize);
    return true;
}

FileSpec
HostInfoWindows::GetProgramFileSpec()
{
    static std::once_flag g_once_flag;
    std::call_once(g_once_flag,  []() {
        char buffer[PATH_MAX];
        ::GetModuleFileName(NULL, buffer, sizeof(buffer));
        m_program_filespec.SetFile(buffer, false);
    });
    return m_program_filespec;
}

FileSpec
HostInfoWindows::GetDefaultShell()
{
    return FileSpec(::getenv("ComSpec"), false);
}

bool
HostInfoWindows::ComputePythonDirectory(FileSpec &file_spec)
{
    FileSpec lldb_file_spec;
    if (!GetLLDBPath(lldb::ePathTypeLLDBShlibDir, lldb_file_spec))
        return false;
    llvm::SmallString<64> path(lldb_file_spec.GetDirectory().AsCString());
    llvm::sys::path::remove_filename(path);
    llvm::sys::path::append(path, "lib", "site-packages");
    std::replace(path.begin(), path.end(), '\\', '/');
    file_spec.GetDirectory().SetString(path.c_str());
    return true;
}