据我所知,现在打电话还为时过早。我个人不知道如何在不使用 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 函数,而不仅仅是修剪后的列表。那大概是年底吧。真正的硬件要到明年夏天才能掌握在您手中。