【发布时间】:2021-12-05 16:19:05
【问题描述】:
我想知道是否有办法从 WSL1 或 WSL2 运行 Windows API 函数。 在 WSL2 中听起来不太可能,因为它使用 Hypervisor 并且不了解 Windows 环境,但可能使用 WSL1?
【问题讨论】:
标签: windows winapi system-calls windows-subsystem-for-linux wsl-2
我想知道是否有办法从 WSL1 或 WSL2 运行 Windows API 函数。 在 WSL2 中听起来不太可能,因为它使用 Hypervisor 并且不了解 Windows 环境,但可能使用 WSL1?
【问题讨论】:
标签: windows winapi system-calls windows-subsystem-for-linux wsl-2
如果您要问是否可以将 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(网络提供商)变量设置为结果。
【讨论】: