20

假设我想创建一种新的编程语言或使用一些 MS 不支持的语言(Haskell、Java ......无论如何),但希望能够针对 Windows 8 Metro/winRT 进行编码。

我知道 Metro UI 中的所有应用程序都是沙盒化的。
我知道我可以用本机 C++ 编程,所以我假设我也可以用 C 或汇编语言进行编程。
但:

  1. 是否可以创建一个即时生成汇编代码的 JIT(如 CLR JIT)而不破坏沙盒限制?
  2. 假设我将只使用Metro 沙箱中允许的 API,是否可以不使用 XAML 作为 UI 界面?- 我可以直接使用 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

另一种语言投影用于 javascript,在“Chakra”引擎中实现。很难弄清楚究竟是什么 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 验证器的审查。

这需要炖,至少在真正的WinRT 可用之前,运行在 ARM 内核上的 WinRT。不仅仅是您现在在 Windows 8 Consumer Preview 中运行的在 Win32 之上运行的那个。并且可以轻松利用现有的 winapi 函数,而不仅仅是修剪后的列表。那大概是年底吧。真正的硬件要到明年夏天才能掌握在您手中。

于 2012-04-23T18:05:04.950 回答
8

是的,可以为其他编程语言在 WinRT 上编写投影。甚至受到鼓励。本月早些时候在微软园区举行了一场名为 Lang.Next 的会议,主题是语言设计。其中一个会议专门针对此主题,您可能想观看(我有):http ://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime和也阅读页面上的评论。让我引用一个:

Martyn 明确表示,我们不仅希望语言设计者和实现者将 WinRT 添加到他们的语言和工具链的目标平台列表中,而且我们会提供帮助和建议。

所以开始吧!:-)

于 2012-04-23T12:49:36.367 回答
7

这是我发现的一个技巧,可以访问这些缺失的 API(VirtualAlloc、VirtualProtect),这是实现抖动所必需的(免责声明:这是我的博客)。

通过使用不安全的 C# 代码,您可以绕过强加于 .NET 反射的限制并调用内部 P/Invoke 方法Win32Native.GetProcAddress。拥有该功能后,您将自动获得对任何 Win32 功能的访问权限,包括VirtualAlloc.

于 2012-12-17T15:05:55.563 回答
6

1) 除了可以访问某些受限 API 的浏览器(并且可以集成其 JIT,但是 afaik,尚未发布浏览器的授权 API),标准 Win8 Metro App 将无法访问诸如“VirtualAlloc”之类的功能/VirtualProtect”(用于创建/更改读/写/可执行内存页面):表示在Windows 8 Metro App下用C++开发的JIT不会通过认证。您已经可以使用 Visual Studio 11 Beta 提供的认证工具包检查您的应用程序。

有人可能会说“我要破解 PE 部分以强制读 + 写 + 可执行”部分,而不必使用 VirtualAlloc/VirtualProtect 函数,但不幸的是,这个 hack 也不起作用,因为你被迫编译 Windows 8 Metro exe 带有选项 /NXCOMPAT:YES,这意味着它正在启用“数据执行保护”(DEP)。

另一个人可能会尝试动态生成 DLL 并使用新的“LoadPackagedLibrary”从磁盘加载它们,但如果 DLL 不是原始部署的一部分(实际上,我无法做到),则此功能实际上被锁定好好工作)

唯一可用的 JIT 是 .NET JIT。所有使用 DLR(.NET 中的动态语言运行时)甚至反射 Emit 的 .NET 动态语言,如 IronPython/IronRuby(如果它们针对 Win8 Metro 进行了更新)都会被 jitted。因此,如果您以 .NET CLR 字节码为目标,您可以对代码进行 jitted。

例如,能够在 .NET CLR 中运行 Java 代码的 IKVM.Net 可以在 Windows 8 Metro App 下运行(但条件是它将被重构为仅使用经过认证的 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

值得注意的是,即使你设法让 JIT 工作,也许是通过发出 CLR 字节码而不是本机机器代码,或者即使你只是实现了一个没有 JIT 的解释器,你也只能运行包含在你的原始代码中的代码应用程序包。如果您从应用程序外部下载脚本/字节码/等...并尝试在“本地上下文”中运行/JIT/解释它(即直接访问 WinRT 库),您会(可能有例外 - 请参阅下面的注释) 违反应用程序认证要求的第 3.9 节:

3.9 所有应用程序逻辑必须源自并驻留在您的应用程序包中您的应用程序不得尝试通过任何形式的动态包含代码或数据来更改或扩展打包的内容,这些代码或数据会更改应用程序与 Windows 运行时的交互方式或行为方式关于商店政策。例如,不允许下载远程脚本并随后在应用程序包的本地上下文中执行该脚本。

这里棘手的措辞是在这个“本地上下文”句子中。目前尚不清楚这究竟意味着什么。例如,如果您有一个 Web 浏览器控件,其门户网站打开一个网站(或在“Web 上下文”中运行的 html 应用程序中的 iframe),则该 Web 浏览器/iframe 正在“运行”JITed javascript 代码,但它将在不同的“上下文”中运行,并且无法直接访问 WinRT api。目前尚不清楚此异常是否仅适用于 XAML 中的 IE 浏览器控件或 html 应用程序中的 iframe w/web 上下文,或者您是否可以在解释器或动态运行时中实现自己的“web 上下文”。

话虽如此,您可以预编译任何类型的应用程序代码,作为将该代码放入应用程序并进行认证的一种方式,类似于在 iOS 上完成的方式,除了您可以选择预编译到 .NET 、本机机器代码或 javascript。

于 2012-10-19T03:50:44.077 回答