See*_*eeR 20 jit programming-languages microsoft-metro windows-8 windows-runtime
让我们说我想创建一种新的编程语言或者使用MS不支持的某种语言(Haskell,Java ......等等),但希望能够对Windows 8 metro/winRT进行编码.
我知道Metro UI中的所有应用都是沙盒.
我知道我可以用原生C++编程,所以我假设我也可以在C或汇编中完成.
但:
Han*_*ant 14
尽管我已经知道了,但要对此进行调用还为时过早.我个人不知道如何在不使用VirtualProtect()的情况下编写抖动,VirtualProtect是一个核心winapi函数,它允许您将一大块内存与抖动生成的机器代码转换为可执行代码.
WinRT应用程序可以使用许多本机winapi功能.这里提供了受祝福的系统功能列表.与内存相关的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
Run Code Online (Sandbox Code Playgroud)
另一种语言投影用于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
Run Code Online (Sandbox Code Playgroud)
好吧,它就在那里.它必须是.麻烦的是,现在你不能调用这个功能.它肯定不会通过Store验证器的审查.
这需要炖,至少在真正的 WinRT可用之前,就是在ARM内核上运行的那个.不仅仅是运行在Win32之上的那个,你现在已经在Windows 8 Consumer Preview中运行了.并且可以轻松利用现有的winapi功能,而不仅仅是修剪列表.这可能是在今年年底左右.直到明年夏天,真正的硬件才会掌握在您手中.
是的,可以在WinRT上为其他编程语言编写投影.它甚至受到鼓励.本月早些时候在微软校园召开了一次名为Lang.Next的会议,这一切都与语言设计有关.其中一个会议专门针对这个主题,你可能想看一下(我有):http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime and阅读页面上的评论也.让我引用一句话:
Martyn明确表示,我们不仅希望语言设计人员和实施者将WinRT添加到他们的语言和工具链的目标平台列表中,而且我们将提供帮助和建议.
所以开始吧!:-)
小智 7
这是我发现的一个技巧,可以访问这些缺失的API(VirtualAlloc,VirtualProtect),这些API是实现抖动所必需的(免责声明:这是我的博客).
通过使用不安全的C#代码,您可以绕过对.NET反射的限制并调用内部P/Invoke方法Win32Native.GetProcAddress.一旦拥有该功能,您就可以自动访问任何Win32功能,包括VirtualAlloc.
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带有选项/ NXCOMPAT的Metro exe:YES,表示它正在启用"数据执行保护"(DEP).
另一个可能会动态生成DLL并使用新的"LoadPackagedLibrary"从磁盘加载它们但是如果DLL不是原始部署的一部分,实际上该函数被锁定(实际上,我无法做到好好工作)
唯一可用的JIT是.NET JIT.使用DLR(.NET中的动态语言运行时)甚至反射Emit的所有.NET动态语言(如IronPython/IronRuby(如果它们为Win8 Metro更新)都将被jitted.因此,如果您以.NET CLR字节码为目标,则可以使用代码进行搜索.
例如,能够在.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.
CoreWindow类是Metro Window系统的低级API,是纯Direct2D/Direct3D11应用程序的入口点.
| 归档时间: |
|
| 查看次数: |
3115 次 |
| 最近记录: |