2016-05-17 18 views
7

WindowsサブシステムのLinux(WSL)内のLinuxバイナリからWindows API関数を呼び出すにはどうすればよいですか?私は確かに文書化された方法はないと確信していますが、それでもやってみると面白いかもしれません。LinuxプロセスのWindowsサブシステムからWin32/NT-Native APIを呼び出しますか?

私はWin32関数を呼び出すことに興味がありますか、それができない場合、少なくともWindows NTネイティブAPI(Nt *、Zw *)に興味があります。 Linuxプロセス(lxss)を実行するコンポーネントはこれらのAPIに依存するため、ネイティブAPIはごくわずかしか使用できません。

Windows DLLを読み込むカスタムLoadLibraryライクな関数を構築する必要があります。もう1つの考え方は、既知のカーネル関数(つまり、ユーザーモードエントリポイント)をプロセスメモリで検索することです。

誰もがこれを実験して解決策を共有したいと思いますか?

+1

このプレゼンテーション - https://github.com/ionescu007/lxss/blob/master/The%20Linux%20kernel%20hidden%20inside%20windows%2010.pdf - (少なくとも私には)Linuxプロセスがそうであることを示唆しています。 -called picoは、アドレス空間にマップされていないntdllを処理しました。また、すべてのシステムコールはWSL用のピコプロセスプロバイダによって処理されます(私はそれらが異なるシステムサービスディスパッチテーブルを使用するだけなので、NTシステムコールはユーザスペースから到達できません)。 –

答えて

5

要するに、できません。

Linuxプロセスが実行される実際のプロセスは、Win32プロセスではなく、Win32ユーザーモードコードを読み込んで実行することも、標準Win32 NTカーネルエントリポイントを呼び出すこともできません。

WSLで採用されているPicoProcessインフラストラクチャの詳細については、this blog and/or watch the accompanying videoを参照してください。

WSL内で実行されているコードからWindowsコードを呼び出す場合は、ソケット/メッセージング/ RPC/REST呼び出し技術を使用することを検討することをお勧めします。いくつかのネットワーク/ソケット/パイプを介して運ばれるメッセージに応答する。

関連する問題