20

新しいプログラミング言語を作成したい、または MS でサポートされていない言語 (Haskell、Java など) を使用したいが、windows 8 メトロ/winRT に対してコーディングできるようにしたいとします。

Metro UI のすべてのアプリがサンドボックス化されていることは知っています。
ネイティブ C++ でプログラミングできることはわかっているので、C またはアセンブリでもできると思います。
しかし:

  1. サンドボックスの制限を破ることなく、CLR JIT のように、その場でアセンブリ コードを生成する JIT を作成することは可能ですか?
  2. Metro サンドボックスで許可されている APIのみを使用すると仮定すると、UI インターフェイスとして XAML を使用しないことは可能ですか? - Direct2D/DirectX を直接使用できますか?
4

5 に答える 5

14

私が知る限り、これについて電話をかけるのは時期尚早です。私は個人的に、VirtualProtect() を使用せずにジッターを書き込む方法を知りません。これは、ジッターによって生成されたマシン コードでメモリのチャンクを実行可能コードに変換できるコア winapi 関数です。

WinRT アプリで使用できるネイティブの winapi 関数が多数あります。祝福されたシステム機能のリストは、こちらから入手できます。メモリ関連の API はかなり限られていますが、VirtualQuery はリスト内で唯一近いものです。

では、現在の言語プロジェクションはどのようにそれを行うのでしょうか? みてみましょう。CLR にはプロジェクションがあり、C# などのマネージ言語で記述した Metro アプリに読み込まれます。c:\windows\microsoft.net\framework\v4.0.30319\clr.dll で dumpbin.exe /imports を実行すると、Windows DLL の依存関係のかなり大きなリストが生成されます。そのダンプからのスニペット:

Dump of file clr.dll

File Type: DLL

  Section contains the following imports:

    KERNEL32.dll
...

              430 RaiseException
              581 VirtualAlloc
              584 VirtualFree
              589 VirtualQuery
              587 VirtualProtect          <=== here!
              339 HeapDestroy
              336 HeapAlloc
              342 HeapValidate
              540 SleepEx
              547 SwitchToThread
              ... etc

もう 1 つの言語プロジェクションは、「チャクラ」エンジンに実装されている JavaScript 用です。そのエンジンを実装している DLL を正確に把握するのは困難です。それは単なるコード名です。アンマネージ デバッグを有効にしてサンプル Javascript プロジェクトを実行すると、「jscript9.dll」が読み込まれていることがわかります。これで dumpbin.exe /imports を実行しましょう:

  ....
  6898F4D5    10D DebugBreak
  6891FDA1    55E TerminateProcess
  6898EF9E    57E UnhandledExceptionFilter
  6891FD58    43C RaiseException
  68903BB7    59E VirtualProtect                 <=== here!
  6A218590    366 InterlockedPushEntrySList
  6A2185A9    365 InterlockedPopEntrySList
  6A2195AA    35C InitializeSListHead
  689026F9    598 VirtualAlloc
  68902852    59B VirtualFree
  6890603E    4A2 ResetWriteWatch
  ...etc

まあ、それはそこにあります。そうでなければならないでしょう。問題は、現在、この関数を呼び出すことができないことですそれは確かに Store バリデーターからの精査に合格することはありません.

これは、少なくとも ARM コアで実行される実際のWinRT が利用可能になるまで煮込む必要があります。Windows 8 Consumer Preview で現在実行している Win32 上で実行されるものだけではありません。また、トリミングされたリストだけでなく、既存の winapi 関数を簡単に利用できます。それはおそらく年末頃になるでしょう。実際のハードウェアは、来年の夏まで手に入りません。

于 2012-04-23T18:05:04.950 に答える
8

はい、他のプログラミング言語の WinRT にプロジェクションを書き込むことは可能です。励まされることさえあります。Lang.Next と呼ばれる会議が今月初めにマイクロソフトのキャンパスで開催され、すべて言語設計に関するものでした。セッションの 1 つは特にこのトピックに関するものだったので、ぜひご覧ください (私が持っています): http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtimeおよびページのコメントも読んでください。1つ引用させてください:

Martyn は、言語の設計者と実装者に、言語とツールチェーンのターゲット プラットフォームのリストに WinRT を追加してほしいだけでなく、支援し、アドバイスすることを明らかにしました。

それでは始めましょう!:-)

于 2012-04-23T12:49:36.367 に答える
7

ジッターを実装するために必要なこれらの不足している API (VirtualAlloc、VirtualProtect) にアクセスするために私が見つけたトリックを次に示します(免責事項: これは私のブログです)。

安全でない C# コードをいじることで、.NET リフレクションに課せられた制限を回避し、内部の P/Invoke メソッドを呼び出すことができますWin32Native.GetProcAddress。その関数を取得すると、VirtualAlloc.

于 2012-12-17T15:05:55.563 に答える
6

1) いくつかの制限された API にアクセスできるブラウザー (および JIT を統合できる可能性がありますが、ブラウザー用の承認済み API はまだ公開されていません) を除いて、標準の Win8 Metro アプリは「VirtualAlloc」などの機能にアクセスできません。 /VirtualProtect" (読み取り/書き込み/実行可能メモリ ページの作成/変更に使用): これは、Windows 8 Metro アプリで C++ で開発された JIT が認定に合格しないことを意味します。Visual Studio 11 Beta で利用できる認定ツールキットを使用して、アプリケーションを既に確認できます。

VirtualAlloc/VirtualProtect 関数を使用せずに、「PE セクションをハックして、読み取り + 書き込み + 実行可能ファイルを強制する」セクションを作成することもできますが、残念ながら、Windows をコンパイルする必要があるため、このハックも機能しません。 8 Metro exe にオプション /NXCOMPAT:YES を指定します。これは、「データ実行防止」 (DEP) が有効になっていることを意味します。

もう 1 つは、新しい「LoadPackagedLibrary」を使用してオンザフライで DLL を生成し、それらをディスクからロードするように誘惑される可能性がありますが、DLL が元の展開の一部ではない場合、この関数は実際にはロックされています (実際には、私はそれを作成できませんでした)。正常に動作しています)

利用できる唯一の JIT は .NET JIT です。DLR (.NET の動的言語ランタイム) またはリフレクション Emit を使用している IronPython/IronRuby (Win8 Metro 用に更新されている場合) などのすべての .NET 動的言語は、jit されます。したがって、.NET CLR バイトコードを対象とする場合、コードをジットすることができます。

たとえば、.NET CLR 内で Java コードを実行できる IKVM.Net は、Windows 8 Metro アプリで実行できます (ただし、認定された Win8 Metro API のみを使用するようにリファクタリングされるという条件で)。

2) はい、XAML を使用せずに Direct2D/Direct3D11 アプリケーションを作成することは可能です。

Windows 8 Metro のサンプルhttp://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samplesを確認してください。たとえば、ほとんどの Direct2D サンプルは XAML を使用していません。

Metro Window システムの下位レベル API である CoreWindow クラスは、純粋な Direct2D/Direct3D11 アプリケーションのエントリ ポイントです。

于 2012-04-25T15:05:19.210 に答える
0

おそらくネイティブ マシン コードの代わりに CLR バイトコードを発行することによって、JIT を機能させることができたとしても、または JIT なしでインタープリターを実装しただけでも、元のコードに含まれていたコードしか実行できなかったことは注目に値します。アプリ パッケージ。アプリケーションの外部からスクリプト/バイトコード/etc... をダウンロードし、それを "ローカル コンテキスト" で (つまり、WinRT ライブラリに直接アクセスして) 実行/JIT/解釈しようとした場合、(可能性のある例外を除いて - 以下の注を参照してください) ) アプリ認定要件のセクション 3.9 に違反している:

3.9 すべてのアプリ ロジックは、アプリ パッケージに由来し、そこに存在する必要があります。アプリは、アプリケーションが Windows ランタイムとやり取りする方法や動作を変更するコードまたはデータを動的に含めることによって、パッケージ化されたコンテンツを変更または拡張しようとしてはなりません。ストア ポリシーに関して。たとえば、リモート スクリプトをダウンロードしてから、アプリ パッケージのローカル コンテキストでそのスクリプトを実行することは許可されていません。

ここでトリッキーな言い回しは、この「ローカル コンテキスト」文にあります。それが正確に何を意味するのかは明らかではありません。たとえば、Web サイト (または「Web コンテキスト」で実行される html アプリの iframe) に対して開いているポータルを備えた Web ブラウザー コントロールがある場合、その Web ブラウザー/iframe は JITed JavaScript コードを「実行」していますが、別の「コンテキスト」で実行され、WinRT API に直接アクセスできません。この例外が XAML の IE ブラウザー コントロールのみのものなのか、html アプリの iframe w/web コンテキストのみのものなのか、またはインタープリターまたは動的ランタイムに独自の "web コンテキスト" を実装できるかどうかは明らかではありません。

そうは言っても、.NET にプリコンパイルするオプションがあることを除いて、iOS で行われる方法と同様に、そのコードをアプリに取り込んで認証する方法として、あらゆる種類のアプリケーション コードをプリコンパイルすることが許可されています。 、ネイティブ マシン コード、または JavaScript です。

于 2012-10-19T03:50:44.077 に答える