18

假设我想创建一种新的编程语言或使用MS(Haskell,Java ...不管)支持的语言,但希望能够针对Windows 8 metro/winRT进行编码。在Windows 8 metro/winRT中是新的JIT编程语言吗?

我知道Metro UI中的所有应用都是沙盒。
我知道我可以用本机C++编程,所以我认为我也可以在C或汇编中执行它。
但是:

  1. 是否有可能创建将产生在飞行中汇编代码JIT - 像CLR JIT-不打破沙箱的限制?
  2. 假设我将只使用API allowed in Metro sandbox是否有可能不使用XAML作为UI界面? - 我可以直接使用Direct2D/DirectX吗?

回答

13

就我所知,现在就此打电话还为时过早。我个人不知道如何在不使用VirtualProtect()的情况下编写抖动,这是一个核心的winapi函数,它允许您将由抖动生成的机器代码的内存块转换为可执行代码。

WinRT应用程序提供了许多原生winapi函数。有福的系统功能列表是available here。与内存相关的apis非常有限,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,在“查克拉”引擎来实现。很难找出DLL实现该引擎的具体内容,它只是一个代码名称。运行启用了非托管调试的示例Javascript项目会显示“jscript9.dll”已加载。让我们做这个dumpbin.exe /进口:

.... 
    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 

嗯,它在那里。它必须是。问题是,现在不能调用这个函数。它肯定不会通过商店验证器的审查。

这需要炖,至少直到real WinRT变得可用,运行在ARM内核上。不仅仅是在Win32上运行的那个,你现在已经在Windows 8 Consumer Preview中运行了。并且可以轻松利用现有的winapi功能,而不仅仅是修剪列表。这可能会在今年年底左右。直到明年夏天,真正的硬件才会掌握在你的手中。

+1

WinRT在这里几乎充当沙箱,因此API访问VirtualAlloc/VirtualProtect不会改变,因为API几乎已经准备好进行OEM了。基本上,除了.NET CLR/JIT(以及所有可以被拼写的动态.NET语言)外,没有办法实现JIT。 – xoofx 2012-04-25 14:09:06

+1

当我谈到WinRT时,我正在谈论整个“WinRT生态系统”,意思是纯粹的“WinRT”+ Win32/COM授权API。用于Windows 8 Metro App的受限Win32/COM API几乎作为一个沙箱。所以没有办法让PE部分读取+写入+可执行文件,所以没有JIT。这是迄今为止在Windows 8 Metro中设计的,我非常怀疑这个设计将在发布预览前1个月发生变化。 – xoofx 2012-04-25 14:27:42

+0

'HeapCreate'与'HEAP_CREATE_ENABLE_EXECUTE'? – 2015-11-04 22:04:19

7

是的,可以在WinRT上为其他编程语言编写投影。它甚至被鼓励。本月早些时候召开的一次名为Lang.Next的会议在微软校园举行,全部都是关于语言设计的。其中一个会议专门针对这个话题,你可能想看(我有):http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime并阅读页面上的评论。让我引用一个:

马丁明确表示,我们不仅要语言的设计者和实施者 到的WinRT添加到他们的目标平台列表他们 语言和工具链,但我们会提供帮助和建议。

所以开始吧! :-)

5

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

有人可能会说“我要破解PE部分强制读取+写入+可执行文件”部分,而不必使用VirtualAlloc/VirtualProtect功能,但不幸的是,这种破解也无法使用,因为您被迫用选项/ NXCOMPAT:YES编译Windows 8 Metro exe文件,这意味着它启用了“数据执行保护”(DEP)。

另一个可能会试图生成DLL并使用新的“LoadPackagedLibrary”从磁盘加载它们,但是如果DLL不是原始部署的一部分,则该函数实际上被锁定(实际上,我没有能够使其正常工作)

唯一可用的JIT是.NET JIT。所有.NET动态语言(如IronPython/IronRuby)(如果它们已更新为Win8 Metro)正在使用DLR(.NET中的动态语言运行时)或甚至反射发射,将会被激发。所以,如果你的目标是.NET CLR字节码,你可以让你的代码搞定。

例如,能够在.NET中运行Java代码的IKVM.Net CLR可以在Windows 8 Metro应用程序下运行(但只能使用经过认证的Win8 Metro API进行重构)。

2)是的,可以在不使用XAML的情况下编写Direct2D/Direct3D11应用程序。

检查Windows 8地铁样本http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples。例如,大多数Direct2D样本不使用XAML。

作为Metro Window系统的低级API的CoreWindow类是纯Direct2D/Direct3D11应用程序的入口点。

+0

DEP是否确实阻止了显式标记为可执行的内存中的代码执行?正常的代码部分仍然可执行AFAIK – 2012-07-28 00:16:29

0

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

3.9所有应用逻辑必须从起源,并驻留在您的应用程序包 您的应用程序不能试图改变或以任何形式延长包装内容动态包含代码或数据,这些代码或数据会更改应用程序与Windows运行时之间的交互方式,或者针对Store策略行为。例如,下载远程脚本并随后在应用程序包的本地上下文中执行该脚本是不允许的。

这里棘手的措辞是在这个“本地背景”句子。目前尚不清楚这意味着什么。例如,如果您的网页浏览器控件具有对网站开放的门户(或者在“web上下文”中运行的HTML应用程序中的iframe),那么该Web浏览器/ iframe会“运行”JITed JavaScript代码,但它将运行在不同的“上下文”中,并且不能直接访问WinRT API。目前尚不清楚这种异常是仅用于XAML中的IE浏览器控件还是用于html应用程序的iframe w/web上下文,或者是否可以在解释器或动态运行时实现自己的“web上下文”。

也就是说,您可以预编译任何类型的应用程序代码,以将代码获取到应用程序中并进行认证,类似于在iOS上完成的操作,除了您可以选择预先编写代码,编译为.NET,本地机器代码或JavaScript。

6

Here's a trick I found to gain access to these missing APIs (VirtualAlloc, VirtualProtect), which are required in order to implement a jitter(声明:这是我的博客)。

通过玩不安全的C#代码,您可以绕过.NET反射的限制并调用内部P/Invoke方法Win32Native.GetProcAddress。一旦你有了这个功能,你就可以自动访问任何Win32函数,包括VirtualAlloc

+0

感谢您发布您的答案!请务必仔细阅读[自助推广常见问题](http://stackoverflow.com/faq#promotion)。另请注意,每次链接到您自己的网站/产品时,您都必须*发布免责声明。 – 2012-12-17 15:12:01

+0

@AndrewBarber谢谢你,修好了 – Andrea 2012-12-17 15:22:44