[Lldb-commits] [lldb] [llvm] [lldb][windows] add Windows Virtual Console support (PR #168729)

Saleem Abdulrasool via lldb-commits lldb-commits at lists.llvm.org
Tue Dec 16 12:48:09 PST 2025


================
@@ -0,0 +1,135 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Host/windows/PseudoConsole.h"
+
+#include <mutex>
+
+#include "lldb/Host/windows/windows.h"
+
+#include "llvm/Support/Errc.h"
+#include "llvm/Support/Errno.h"
+
+using namespace lldb_private;
+
+typedef HRESULT(WINAPI *CreatePseudoConsole_t)(COORD size, HANDLE hInput,
+                                               HANDLE hOutput, DWORD dwFlags,
+                                               HPCON *phPC);
+
+typedef HRESULT(WINAPI *ResizePseudoConsole_t)(HPCON hPC, COORD size);
+
+typedef VOID(WINAPI *ClosePseudoConsole_t)(HPCON hPC);
+
+class ConPTY {
+public:
+  static bool Initialize() {
+    std::lock_guard<std::mutex> guard(m_initialized_mutex);
+
+    if (!m_initialized) {
+      m_initialized = true;
+
+      HMODULE hMod = LoadLibraryW(L"kernel32.dll");
+      if (!hMod) {
+        return false;
+      }
+
+      pCreate =
+          (CreatePseudoConsole_t)GetProcAddress(hMod, "CreatePseudoConsole");
+      pClose = (ClosePseudoConsole_t)GetProcAddress(hMod, "ClosePseudoConsole");
----------------
compnerd wrote:

I'm half tempted to say that we should do this in a more abstract manner as we seem to want to maintain backwards compatibility.

```c++
struct Kernel32 {
  Kernel32() {
    hModule_ = LoadLibraryW(L"kernel32.dll");
    if (hModule_ == nullptr)
      LOG(...);

    CreatePsueodConsole_ = GetProcAddress(hModule_, "CreatePseudoConsole");
    ...
  }

  HRESULT CreatePsueodConsole(...) {
    return CreatePsueodConsole_(...);
  }

  HRESULT ClosePsuedoConsole(...) {
    return ClosePseudoConsole_(...);
  }

private;
  HMODULE hModule_;
  CreatePsuedoConsole_t CreatePsuedoConsole_;
  ClosePseudoConsole_t ClosePseudoConsole_;
};
static Kernel32 kernel32;
```

The C++ standard ensures that kernel32 is initialised safely on first use and we can reference it as `kernel32.CreatePsueodConsole(...)`.

This way we can scope all the modules we need, lazily initialize them and rely on the compiler to do the right thing. It also makes it easier to find all the dynamically accessed functions.

https://github.com/llvm/llvm-project/pull/168729


More information about the lldb-commits mailing list