【问题标题】:Running Windows API functions from WSL从 WSL 运行 Windows API 函数
【发布时间】:2021-12-05 16:19:05
【问题描述】:

我想知道是否有办法从 WSL1 或 WSL2 运行 Windows API 函数。 在 WSL2 中听起来不太可能,因为它使用 Hypervisor 并且不了解 Windows 环境,但可能使用 WSL1?

【问题讨论】:

    标签: windows winapi system-calls windows-subsystem-for-linux wsl-2


    【解决方案1】:

    如果您要问是否可以将 Windows API“混合和匹配”到 Linux ELF 二进制文件中,那么不要直接,但请参阅下面的解决方法(无论如何这可能是您正在寻找的)。

    Windows executables 使用 Windows API 在 WSL1 和 WSL2 下都可以正常运行。引用this SU answer 的话,这是因为:

    Windows 可执行文件(PE 二进制文件)作为 binfmt_misc 条目添加到 WSL2 中。简单来说,binfmt_misc 是一个 Linux 内核特性,它允许识别任意可执行文件格式并将其传递给某些程序。

    请注意,您确实需要指定 .exe 才能运行 Windows 二进制文件。例如,notepad.exe,而不仅仅是notepad

    这种集成足够深入,您可以使用正常的管道机制在 Linux 和 Windows 之间来回传递信息。

    假设您正在编写需要来自 Windows API 的信息的 Linux 代码,您始终可以生成一个 Windows .exe 进程,该进程通过 stdout 返回所需的信息,并在 Linux 应用程序中捕获该信息。

    这甚至可以通过命令行来实现。比如bash:

    np=$(powershell.exe -c "(Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\NetworkProvider\HwOrder\).ProviderOrder")
    echo $np
    # Returns:  P9NP,RDPNP,LanmanWorkstation,webclient
    

    这会使用进程替换调用 PowerShell。然后 PowerShell 为注册表项执行 Get-ItemProperty。当然,$np(网络提供商)变量设置为结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-19
      • 2020-05-25
      • 2017-05-04
      • 2021-04-17
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多