首页> 中国专利> 用于虚拟化与计算机系统关联的硬件资源的方法、系统和执行代码段

用于虚拟化与计算机系统关联的硬件资源的方法、系统和执行代码段

摘要

本发明涉及一种用于虚拟化与计算机系统关联的硬件资源的方法,该方法利用适合于插入到属于执行在操作系统上的应用程序的进程内的代码段,该操作系统包括至少一个执行在计算机系统上的API。方法包括:对由进程向与进程和硬件资源之间产生的数据流的管理关联的API服务的调用进行拦截;以及基于对由属于应用程序的进程向与进程和硬件资源之间产生的数据流的管理关联的API服务的调用进行拦截,对进程和硬件资源之间产生的数据流进行管理。

著录项

  • 公开/公告号CN104380256A

    专利类型发明专利

  • 公开/公告日2015-02-25

    原文格式PDF

  • 申请/专利权人 加泰罗尼亚理工大学;

    申请/专利号CN201380031256.2

  • 申请日2013-04-18

  • 分类号G06F9/455(20060101);

  • 代理机构44205 广州嘉权专利商标事务所有限公司;

  • 代理人谭英强

  • 地址 西班牙巴塞罗那市

  • 入库时间 2023-12-17 04:48:46

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-09-12

    授权

    授权

  • 2015-05-20

    实质审查的生效 IPC(主分类):G06F9/455 申请日:20130418

    实质审查的生效

  • 2015-02-25

    公开

    公开

说明书

技术领域

本发明涉及一种用于虚拟化与计算机系统关联的硬件资源的方法,该方法利用适合于插 入到属于执行在操作系统上的应用程序的进程内的代码段,该操作系统包括至少一个执行在 计算机系统上的应用程序编程接口(API)。

本发明还涉及一种适合执行这种方法的系统和执行代码段。

背景技术

数年以来,基本上因为云计算模型的整合,在计算机世界中已经树立“虚拟化”的概念。

虚拟化可以基本定义为,利用技术资源比如硬件平台、操作系统、数据存储设备或其它 网络资源的虚拟版软件,使得该资源可以被划分成一个或多个执行环境。要着重指出,其中 该软件是通过硬件虚拟化技术来辅助的情况,也是可以的,比如也可以通过Intel-VT或AMD-V (例如参见,西班牙的维基百科-http://es.wikipedia.org/wiki/Virtualizaci ón)来辅助。

计算机系统(比如个人计算机或者服务器)是最频繁虚拟化的技术资源之一,使得该计 算机系统同时运行不同操作系统的多个实例。以这种方式,计算机系统可以执行需要不同操 作系统的不同应用程序。

还公知一种虚拟化的类型,其允许对计算机系统硬件资源进行模拟。要做到这一点,需 要在计算机系统中安装虚拟化软件,其目的是使所有已安装的操作系统可以访问计算机系统 的硬件资源。该虚拟化软件的另一个目的还在于对安装在计算机系统上的用于不同操作系统 的虚拟化硬件资源进行协调。

尽管计算机系统的硬件资源(虽然也可应用于任何其它类型的虚拟化)的虚拟化具有一 些优点(例如上面提到的,可以在一个和相同的计算机系统上同时运行多个操作系统),但也 存在显著数量的缺点。

因此,举例来说,由于在计算机系统上运行虚拟化软件过程中的开销超出负荷,这种虚 拟化可能造成计算机系统性能下降。尤其可能对应用程序的执行产生影响,使该应用程序可 能比没有虚拟化的系统中的应用程序运行得更慢。

相对于上述缺点,在许多情况下,这种虚拟化可以对任何情况下将无需使用的或任何情 况下无需虚拟化的资源进行虚拟。因此,例如对计算机系统的键盘进行虚拟使每个运行的应 用程序具有虚拟键盘,根据现有技术,将需要创建等于虚拟计算机系统(虚拟机加上操作系 统)数量的由执行的不同应用程序所需的虚拟键盘。这意味着不必要的系统资源消耗,如上 所述,影响了系统性能。

发明内容

因此,本发明的一个目的在于提供一种用于与计算机系统关联的某些硬件资源的虚拟化 的方法,而无需对自身的全部系统硬件资源进行虚拟。

该目的是根据权利要求1来实现,其提供一种用于虚拟化与计算机系统关联的硬件资源 的方法,该方法利用适合于插入到属于执行在操作系统上的应用程序的进程内的代码段,该 操作系统包括至少一个执行在计算机系统上的应用程序编程接口(API),所述方法包括:

-对由属于应用程序的进程向与进程和硬件资源之间产生的数据流的管理关联的API服 务的调用进行拦截;

-通过基于对由进程向与进程和硬件资源之间产生的数据流的管理关联的API服务的调 用进行拦截的代码段,对进程和硬件资源之间产生的数据流进行管理。

因此,不同于现有技术,每个在计算机系统的操作系统上运行的使用插入的代码段的应 用程序,能够虚拟那些需要运行的硬件设备,而无须虚拟所有与系统关联的硬件资源。由于 在将来无论如何不会使用的资源或者无论如何都不需要虚拟化的资源都不被虚拟化,这样使 系统资源的消耗得以降低。在本发明中实际上没有虚拟化软件用于依照本领域技术那样对所 有计算机系统资源进行虚拟,相反,以插入到每个执行在计算机系统上的应用程序的代码段, 为了正确执行应用程序而决定或者实现确立哪个硬件资源是必须要虚拟化的。

以计算机系统的键盘的虚拟化例子继续描述,本发明只需简单地创建虚拟键盘而不是整 个计算机系统。因此,应用程序直接在实际的计算机而不是在虚拟机上执行,很大程度地减 少虚拟化所带来的负荷:只在读取键盘数据时候发生的非常小的负荷,代替在执行每个程序 指令时出现的明显负荷。

此外,着重指出表述“数据流的管理”涉及数据流的传输和/或控制,从而使进程调用的 服务与数据流的管理关联。因此,例如当插入的代码段拦截调用时,代码段通过发送虚拟缓 存区的内容来控制该管理。

为了实现上述目的,首先需要对由属于应用程序的进程向服务的调用进行拦截,该服务 与进程和硬件资源之间产生的数据流的管理关联。词语“拦截”解析为,从进程向API服务 的调用使包含在代码段中的服务重定向,从而代码段自身接收来自进程的调用以执行对应API 服务的这个服务(即是,来自进程的调用没有触及到API服务)。依照该拦截,由于代码段在 操作系统上起作用,当进程发出请求到操作系统以访问相同内容的时候,代码段能够控制进 程和硬件资源之间的数据流。

在该拦截之前,代码段可能已经将一个或多个与进程和硬件资源之间产生的数据流的管 理关联的API的一个或多个服务重定向到包含在代码段中的对应的服务,正如上面所述,从 而使来自进程的调用不再实施在API服务上,而是实施在包含在代码段中的对应的服务。

在拦截后,当代码段从进程中接收调用并且对包含在代码段中的服务进行执行的时候, 代码段能够对进程和硬件资源之间产生的数据流进行管理由此对硬件资源进行虚拟,这是因 为包括在代码段的服务对此适用。

需要重要指出的是,“服务”、“API”、“调用”或者“硬件资源”的表述分别指代至少一 个服务、至少一个API、至少一个调用以及/或者至少一个硬件资源。因此,例如可以将同一 API的两个服务重定向到包含在代码段的两个服务(即是,进程发出至少两个调用),或者将 第一API的服务重定向到包含在代码段中的第一服务以及将第二API的服务重定向到包含在 代码段中的第二服务。同样地,根据重定向服务,同一代码段能够根据正在执行的应用程序 的需要虚拟一个或多个硬件资源,比如视频卡、音频卡、硬盘驱动器、键盘或者鼠标。

还要着重指出,将执行代码段插入到进程的一种方式已被描述,例如在[题目名称为 “Windows NT System-Call Hooking”,作者为Mark Russinovich和Bryce Cogswell,1997 年1月的名称为Dr.Dobb’s Journal的杂志]中描述。

根据本发明的优选实施例,属于应用程序的进程可以在休眠状态中启动,并且可执行的 代码段可以在休眠状态期间插入到进程中。因此,如果所述进程在休眠状态中启动,根据本 发明的方法必须考虑重新启动进程的可能性。由此确保代码段的正确运作。

根据本发明另一个实施例,API服务可以是函数,而将与进程和硬件资源之间产生的数 据流的管理关联的API服务重定向到对应的包含在代码段中的服务的步骤可包括:

■将动态链接库加载到内存中,该动态链接库包含待重定向的API函数;

■在包含在加载的动态链接库中的API函数的函数指针表中,用储存有包含在代码段中

的对应函数的初始内存地址代替储存有待重定向的API函数的初始内存地址。

因此代码段能够将一个或多个API的一个或多个函数重定向到包含在代码段中的对应函 数,使得代码段可以拦截由进程向这些函数发出的调用,并且因此对进程和硬件资源(或者 多个硬件资源,假如应用程序需要虚拟超过一个的硬件资源)之间产生的数据流进行管理, 从而允许实现其虚拟化。

此外,使与进程和硬件资源之间产生的数据流的管理关联的API服务重定向到包含在代 码段中的对应的服务的步骤,还可以包括将已储存有待重定向的API函数的初始内存地址储 存在第一变量中,从而在执行应用程序的任何有需要的情况下,可以从可执行的代码段自身 中调用该API函数(即是原始的函数)。

另一方面,API服务可以是对象方法,而使与进程和硬件资源之间产生的数据流的管理 关联的API服务重定向到包含在代码段中的对应的服务的步骤可包括:

■将动态链接库加载到内存中,该动态链接库包含待重定向的对象方法;

■验证是否第一次创建与待重定向的方法关联的对象;

■如果验证得出肯定结果,

○在包含在加载的动态链接库中的对象方法的方法指针表中,用储存有包含在代码 段中的对应方法的初始内存地址代替储存有待重定向的对象方法的初始内存地 址。

同函数的情况一样,同样有可能将一个或多个属于对象的方法重定向到包含在代码段中 的一个或多个方法,从而使代码段可以拦截由进程向这些方法发出的调用,并且因此对进程 和硬件资源之间产生的数据流进行管理。

如上文所讨论的,既然有可能重定向至少一个API的至少一个服务,就有可能其中一个 服务是函数,而另一个服务是方法,从而上述两个实施例在同一个执行的应用程序中可以互 为补充。

此外,将与进程和硬件资源之间产生的数据流的管理关联的API服务重定向到包含在代 码段中的对应的服务的步骤,还可以包括将储存有待重定向的对象方法的初始内存地址储存 在第二变量中,从而在执行应用程序的任何有需要的情况下,可以从执行代码段自身中调用 该方法(即是原始的方法)。

根据本发明另一个实施例,对由属于应用程序的进程向与进程和硬件资源之间产生的数 据流的管理关联的API服务的调用进行拦截的步骤可以包括,对进程向包含在代码段的服务 的调用进行接收,该代码段对应与进程和硬件资源之间产生的数据流的管理关联的API服务。 根据数据流的方向(即是,进程-资源或者资源-进程)包含在代码段的由进程发出调用的服 务可以不同。

优选地,对进程和硬件资源之间产生的数据流进行管理的步骤包括:

■验证是否已经创建与硬件资源对应的虚拟硬件资源;

■如果验证中得出否定结果,则产生虚拟硬件资源。

对于计算机系统的多数硬件资源,为了管理进程和硬件资源之间产生的数据流,需要产 生用于虚拟计算机系统硬件资源的硬件资源(即是产生虚拟硬件资源)。因此,根据计算机硬 件资源,代码段必须验证是否存在对应的虚拟硬件资源。如果不存,则产生该虚拟硬件资源, 该步骤可以包括:

○产生对关联硬件资源的缓存区进行虚拟的缓存区和/或

○产生模拟硬件资源的行为的执行线程。

产生虚拟缓存区的理由在于,多数计算机系统硬件资源包括或者与至少一个缓存区关联 (更具体地,每个硬件资源可以具有至少一个保留的内存区),可以在该缓存区中储存数据使 数据可以到达进程(进程通常发出请求来获取数据),或者进程可以在该缓存区中储存数据使 数据可以到达资源(资源通常能够捕获数据),即是,缓存区服务作为进程和资源之间交换数 据的工具。产生虚拟或虚拟化的缓存区的目的在于,使用于进程和资源之间交换数据的保留 内存区成为一不同的区域,该区域不受操作系统和/或与实际的资源关联的驱动的控制,但是 受代码段的控制。此外,对于每个硬件资源,,具有根据本发明的插入的代码段的每个正在执 行的应用程序因此可以拥有至少一个自己的缓存区,并且该缓存区不与属于硬件资源的其它 应用程序共享。

在一些情况中,一旦数据已经储存在虚拟缓存区中,有必要向进程报告已经正确执行所 有活动。此外,因为缓存区剩下空间,或者因为在缓存区中不能储存所有数据且需要另一步 骤或者其它步骤来储存数据,有必要向进程指出已经在缓存区中写入多少数据。

关于执行线程,有必要首先产生执行线程以模拟计算机系统硬件资源的行为,尤其使执 行线程通过虚拟硬件资源对代码段产生的数据实施合适的管理,并且通过虚拟化缓存区对在 它们之间交换的由执行的进程所产生的数据实施合适的管理,正如上面所描述的那样。着重 指出,执行线程例如可以由至少一个包含在代码段中的函数来表现,使得执行线程实际上引 起该函数的执行。

此外,对进程和硬件资源之间产生的数据流进行管理的步骤还可以包括在虚拟缓存区中 储存由进程发送到硬件资源的数据。由于数据储存在虚拟缓存区中,因此代码段能够对进程 和硬件资源之间产生的数据流进行管理,这是在代码段的控制下进行。由进程产生的数据的 目的地实际为计算机系统硬件资源(即是实际的硬件资源),但是通过代码段的对由进程向某 些API服务的调用的拦截允许该数据处在其控制下。

另一方面,对进程和硬件资源之间产生的数据流进行管理的步骤包括:

■暂停所产生的模拟硬件资源行为的执行线程并持续一段预设的时间;

■获取储存在虚拟缓存区中的由进程先前发送到硬件资源的数据;

■处理获取的数据。

如果虚拟硬件资源具有模拟计算机系统硬件资源行为的执行线程,代码段必须暂停执行 线程一段预设的时间(通常为毫秒级),然后使执行线程获取进程已在虚拟缓存区中储存的数 据。一旦获得数据,执行线程必须处理它们,就像计算机系统硬件资源要做的那样。因此, 例如,如果硬件资源是音频卡,对这些数据的处理需要对其转换,例如转换为mp3格式(根 据MPEG-1音频层III标准),然后使所述数据能被解析。

根据本发明的优选实施例,对进程和硬件资源之间产生的数据流进行管理的步骤可以包 括发送处理的数据到第一远程计算机系统。假定数据处理之后,代码段通过虚拟硬件资源继 续对其控制,该数据可以发送到实际上对其利用的远程计算机系统(不同于包含实际的硬件 资源的计算机系统)中,然而该数据还可以发送到在其中执行该应用程序的计算机系统本身 或者任何其它本地计算机系统。因此,继续音频卡的例子,假定代码段已经控制音频数据, 所述代码段能够通过远程计算机系统(例如,移动装置或者终端,比如智能手机或者平板电 脑)的实际的音频卡使该音频数据变成可听见,而不是通过与计算机系统关联的实际的音频 卡使其可听见。一旦执行线程处理了数据(应注意到,其至少一个函数包含在执行线程中), 如果通过计算机系统音频卡可解析该数据,明显任何其它计算机系统的音频卡将要解析的数 据一定不会出现问题,原因在于该数据已经对其适配。

清楚地理解到,用于虚拟与计算机系统关联的硬件资源的方法已经用一般的方式从上文 描述到此,并且还以更具体的方式尤其基于对属于应用程序的进程向硬件资源所产生的数据 流的管理来描述,即是从上文到这里,本发明已经描述了代码段如何对将要从进程至资源的 数据进行控制。当在资源和属于应用程序的进程之间产生数据流的时候,本发明的方法描述 如下。

因此本发明的方法可以包括,对从虚拟硬件资源到属于应用程序的进程所产生的数据流 进行管理。

在这样的特定方向下对数据流的管理可以包括:

■从第二远程计算机系统接收数据;

■处理接收的数据;

■在虚拟缓存区中储存处理的数据。

代码段可以在任何时候从第二远程计算机系统接收数据(尽管第一和第二远程计算机系 统通常将会是相同的远程计算机系统),必须处理该数据并且将该数据储存在先前创建的虚拟 缓存区,从而使进程能对其访问。因此,例如被虚拟的硬件资源是计算机系统的键盘的时候, 代码段(更具体为模拟硬件资源行为的执行线程)可以从远程计算机系统(例如平板电脑) 接收键盘数据,比如基于用户通过平板电脑的触摸屏上的键盘触发而产生的数据。必须经由 执行线程处理该数据并且将其储存在缓存区中。

随后,当进程需要获取该数据时,必须调用与数据流的管理关联的某API服务,该数据 流是在硬件资源(因为硬件资源的虚拟化对于进程来说是透明的,这里理解为实际的硬件资 源)和进程之间产生,其中这些调用由代码段拦截,使得代码段提取储存在虚拟缓存区中的 数据(而不是储存在计算机系统硬件资源,即是实际的硬件资源的缓存区中的数据)并且使 进程可以对其访问,并且在获取该数据后,如果需要的话,能够对其处理。

因此,对由属于应用程序的进程向与进程和硬件资源之间产生的数据流的管理关联的API 服务的调用进行拦截,该步骤可以包括:

■对由属于应用程序的进程向与从硬件资源到进程所产生的数据流的管理关联的API服 务的调用进行拦截;

然而,对从虚拟硬件资源到属于应用程序的进程所产生的数据流进行管理,该步骤包括:

■对储存在虚拟缓存区的数据进行回收;

■发送回收的数据到进程。

如上所述,对于一般情况(即是,对于进程和资源之间的数据流),对由进程向与从硬件 资源到进程所产生的数据流的管理关联的API服务的调用进行拦截,该步骤可以包括对进程 向包含在代码段的服务的调用进行接收,该代码段对应与从硬件资源到进程所产生的数据流 的管理关联的API服务。

最后,该方法还可以包括对从计算机硬件资源(即是实际的硬件资源)到进程所产生的 数据流进行管理,从而确保虚拟资源持续正确地控制应用程序而不是控制实际的资源。为此, 对进程和硬件资源之间产生的数据流进行管理的步骤包括:

■对从硬件资源到进程所产生的数据流进行管理,可以包括:

○验证是否在缓存区中存在来自硬件资源的数据;

○如果验证得出肯定结果,消除该数据。

因为实施计算机系统硬件资源的虚拟化对于该硬件资源是透明的,由此该硬件资源有可 能继续发送数据到与其关联的缓存区中,使得该缓存区可以在某些点上最终达到饱和,在这 种情况下,实际的硬件资源可以渗透到实际的计算机系统的操作系统的内部结构,可以响应 该内部结构或者可以使其停止正确地工作。为了防止这种情况,代码段可以每隔一段时间进 行验证,例如,如果有数据储存在缓存区中并且如果验证得到肯定的结果,则消除该数据。

根据第二方面,本发明提供一种执行代码段,可以包括比如上述的用于虚拟化与计算机 系统关联的硬件资源的方法的执行指令,该代码段适合于插入到一应用程序的进程内,当该 应用程序在包括至少一个在计算机系统上执行的应用程序编程接口(API)的操作系统上执行 时。

该执行代码段可以存储在物理存储媒介上,如可记录媒介、计算机内存或只读内存,或 者可以由载波实现,如电或光载波。

根据本发明的第三方面,本发明提供一种用于虚拟化与计算机系统关联的硬件资源的系 统,在其上执行包含至少一个应用程序编程接口的操作系统,在该操作系统上执行包含一进 程的应用程序,所述系统可以包括:

-对由属于应用程序的进程向与进程和硬件资源之间产生的数据流的管理关联的应用程 序编程接口服务的调用进行拦截的计算机设备;

-基于对由属于应用程序的进程向与进程和硬件资源之间产生的数据流的管理关联的应 用程序编程接口服务的调用进行拦截,通过代码段对进程和硬件资源之间产生的数据流进行 管理的计算机设备。

优选地,本发明还提供一种在其上执行操作系统的计算机系统,该操作系统可以包括至 少一个应用程序编程接口,在该操作系统上执行有至少一个应用程序,所述计算机系统可以 包括存储器和至少一个处理器,该存储器储存处理器执行的指令,该指令与一可执行代码段 对应,比如与上述的插入到属于应用程序的进程的代码段对应,该指令可以包括的函数用于:

-对由属于应用程序的进程向与进程和硬件资源之间产生的数据流的管理关联的应用程 序编程接口服务的调用进行拦截;

-基于由对属于应用程序的进程向关联产生在进程和硬件资源之间的数据流的管理的应 用程序编程接口服务的调用进行拦截,通过代码段对进程和硬件资源之间产生的数据流进行 管理。

根据本发明的实施例,在上述的计算机系统中至少两个应用程序可在操作系统上执行, 并且其中存储器可储存与每个执行的应用程序的代码段对应的处理器可执行指令。

此外,本发明还可以提供一种执行在操作系统上的应用程序,该操作系统执行在计算机 系统上,该应用程序包括可执行代码段,比如上面已经描述的代码段。

根据本发明的合理实施例,硬件资源可以是音频卡,对由属于应用程序的进程向与进程 和硬件资源之间产生的数据流的管理关联的应用程序编程接口(API)服务的调用进行拦截的 步骤可以包括对进程向与从进程到音频卡所产生的数据流的管理关联的API服务的调用进行 拦截;以及通过代码段对进程和硬件资源之间产生的数据流进行管理的步骤可以包括对从进 程到音频卡所产生的音频数据流进行管理。

更具体地,对从进程到音频卡所产生的音频数据流进行管理的步骤可以包括验证是否已 经创建与计算机系统音频卡对应的虚拟音频卡;如果在验证得出否定结果,则产生虚拟的音 频卡。

所述的产生虚拟的音频卡的步骤可以包括产生至少一个缓存区,该缓存区虚拟与计算机 系统音频卡关联的缓存区,并且产生对计算机系统音频卡的行为进行模拟的执行线程。

此外,对进程和音频卡之间产生的数据流进行管理的步骤还可以包括在虚拟缓存区中储 存由进程发送到音频卡的数据。

另一方面,对进程和音频卡之间产生的音频数据流进行管理的步骤可以包括:暂停所产 生的对计算机系统音频卡的行为进行模拟的执行线程并持续一段预设的时间;执行线程获取 储存在虚拟缓存区中的由进程先前发送到音频卡的音频数据;以及执行线程处理获取的音频 数据。

执行线程处理从虚拟缓存区中获取的音频数据的步骤可以包括将从该至少一个虚拟缓存 区获取的数据进行混合,并且转换混合的数据为可解析的格式(例如转换为mp3格式)。

根据本发明另一个实施例,硬件资源可以是视频卡,对由属于应用程序的进程向与进程 和硬件资源之间产生的数据流的管理关联的应用程序编程接口(API)服务的调用进行拦截的 步骤可以包括对由进程向与进程到视频卡所产生的数据流的管理关联的API服务的调用进行 拦截;以及代码段对进程和硬件资源之间产生的数据流进行管理的步骤可以包括对从进程到 视频卡所产生的视频数据流进行管理。

更具体地,对从进程到视频卡所产生的视频数据流进行管理的步骤可以包括验证是否已 经创建与计算机系统视频卡对应的虚拟视频卡;如果在验证得出否定结果,则产生虚拟的视 频卡。

所述的产生虚拟的视频卡的步骤可以包括产生缓存区,该缓存区虚拟与计算机系统视频 卡关联的缓存区,并且产生对计算机系统视频卡的行为进行模拟的执行线程。在视频卡的情 况中,该缓存区称为绘图环境(DC)并且可以定义为内存区,其中视频卡将会一帧接一帧地 储存产生的图像到该内存区中并且一直与一窗口关联。

另一方面,对进程和视频卡之间产生的视频数据流进行管理的步骤可以包括:暂停所产 生的对计算机系统视频卡的行为进行模拟的执行线程并持续一段预设的时间;执行线程获取 储存在虚拟DC中的由视频卡先前生成的视频数据(帧);以及执行线程处理获取的视频数据。

执行线程处理从虚拟缓存区中获取的视频数据的步骤可以包括利用编码比如H.264对帧 进行译码。

仍然根据本发明的另一个实施例,硬件资源可以是数据输入设备,比如键盘或鼠标。在 这一点上,应当指出,如果执行在计算机系统上的操作系统使用消息队列系统,还需要虚拟 该消息队列。

为了对消息队列实施虚拟,还需要产生缓存区和模拟消息队列系统的执行线程(即是基 于一些数据输入,比如按键,发送消息到与应用程序关联的消息队列),该执行线程还拦截消 息的查询和处理函数(即是程序员为确定应用程序响应某一消息的行为而定义的函数(也称 为窗口函数)),该函数如上所述包含在代码段中,从而执行消息队列系统函数。在此情况中, 代码段必须对由进程向查询(从队列取出消息以读取它)和处理(实施某动作)消息的函数 的调用进行拦截,该消息可以处在操作系统已关联应用程序的消息队列中。处理消息队列的 消息的代码段的函数因此可以消除那些不期望由应用程序去处理的消息(即是要忽视的消 息),或者可以依次调用原始的函数从而使应用程序处理消息(即是意图响应所述消息来行 动)。

在硬件资源是数据输入装置(例如鼠标或者键盘)的情况中,对由属于应用程序的进程 向与进程和硬件资源之间产生的数据流的管理关联的应用程序编程接口(API)服务的调用进 行拦截的步骤可以包括,对由进程向与进程到输入设备所产生的数据流的管理关联的API服 务的调用进行拦截;以及代码段对进程和硬件资源之间产生的数据流进行管理的步骤可以包 括对从输入设备到进程所产生的数据流进行管理。

更具体地,对从输入设备到进程所产生的数据流进行管理的步骤可以包括验证是否已经 创建与计算机系统输入设备对应的虚拟输入设备;如果在验证得出否定结果,则产生虚拟的 输入设备。

所述的产生虚拟的输入设备的步骤可以包括产生至少一个缓存区,该缓存区虚拟与计算 机系统输入设备关联的缓存区,并且产生对计算机系统输入设备的行为进行模拟的执行线程。

此外,对从虚拟输入设备到属于应用程序的进程所产生的数据流进行管理的步骤可以包 括:从远程计算机系统接收数据,该数据是由远程计算机系统的输入设备(比如通过或者不 通过触摸屏实现的键盘、鼠标)产生的;处理接收的数据;以及在虚拟缓存区中储存处理的 数据。

另一方面,对从虚拟硬件设备到属于应用程序的进程所产生的数据流进行管理的步骤还 可以包括:收回储存在虚拟缓存区中的数据;发送回收的数据到进程。

最后,根据本发明的另一个实施例,硬件资源可以是存储单元,比如硬盘驱动器;对由 属于应用程序的进程向与进程和硬件资源之间产生的数据流的管理关联的应用程序编程接口 (API)服务的调用进行拦截的步骤,可以包括对由进程向与从进程到存储单元所产生的数据 流的管理关联的API服务的调用进行拦截;以及代码段对进程和硬件资源之间产生的数据流 进行管理的步骤可以包括对从进程到存储单元所产生的数据流进行管理。

更具体地,对从进程到硬盘驱动器所产生的数据流进行管理的步骤可以包括对储存有来 自进程的数据的目录路径进行改变。

如上所述,对于给定的应用程序,代码段必须能够对描述的硬件资源中的一个或复数个 进行虚拟。处于这个原因,代码段必须适合并且必须包含必要的指令用于实现一个或多个这 些设备的虚拟化。

说明书和权利要求书通篇,用语“包括”及其变型不表示排除其他技术特征、补充、条 目或步骤。本领域技术人员可以从部分说明书以及本发明部分实践推断出本发明进一步的目 的、优势以及特征。文中提供的示例和附图仅作描述目的,它们不作为本发明的限制。权利 要求中涉及附图并且位于括号内的附图标记只是为了进一步理解该权利要求,不应该理解为 限制本发明的保护范围。此外,本发明涉及此处描述的特别及优选实施例的所有可能的组合。

附图说明

为了更好地理解上面已经描述的内容,通过非限制性的方式附上纲要地描述实际的实施 例的附图。

附图中:

图1所示为根据现有技术状况的计算机系统上的应用程序执行层的框图;

图2所示为进一步与插入到属于应用程序的进程中的代码段的层进行结合的计算机系统 上的应用程序执行层的框图,根据本发明该代码段意图用于对至少一个与执行应用程序的计 算机系统关联的硬件资源进行虚拟。

具体实施方式

下面将提供根据本发明的用于虚拟化与计算机系统关联的硬件资源的方法说明和执行代 码段说明。在该计算机系统上安装包括至少一个应用程序编程接口(API)的操作系统。描述 的执行代码段适合插入到属于应用程序的进程中,该应用程序正在所述的操作系统上执行。

图1所示为根据现有技术状况,在计算机系统(例如个人计算机、服务器等)上的应用 程序(例如游戏)执行层的描述图。

图中,最低级别层10代表计算机硬件资源,比如微处理器(CPU)、内存、图像处理单元 (GPU)、键盘、鼠标、视频卡、音频卡和硬盘驱动器等。

在配置为更高级别的第二层11中设置操作系统,该第二层11具有与低层10的资源双向 通信和交互所需的驱动(能够发送和/或接收与这些资源有关的信息,比如控制信号14或数 据15)。

在代表操作系统的层11上面配置的第三层12中,设置有应用程序编程接口(更好地称 之为API),包括那些包含在操作系统中的应用程序编程接口,以及那些经由低层10的资源 的驱动的安装来实现的应用程序编程接口。不管使用任何操作系统,这些API通常以动态链 接库的形式实现。在包含多个API的层12和代表操作系统的层11之间的通信也是双向通信, 该双向通信都能够交换控制信号14和数据15。

最后,图1还示出了第四层或最高级别层13,描述执行中的应用程序。在执行过程中, 该应用程序对代表多个API的层12进行访问,交换控制信号和数据。

因此,根据该配置,例如,正在执行的应用程序13需要在执行该应用程序的计算机系统 的显示屏上生成窗口,该应用程序必须访问某些用于生成窗口的多个API 12的服务(函数或 方法)。为了能够在屏幕上生成窗口,这些服务需要用操作系统11交换信息(控制信号和数 据),该操作系统具有必需的工具(即驱动)用于与屏幕10通信,从而生成想要的窗口。

这种配置的主要缺点在于每个计算机系统硬件资源只可用于单个应用程序,是指在前景 (即活动窗口)中用户具有(或者操作系统已选择为)活动的应用程序,即是说,如果硬件 资源为音频卡,从那时执行的全部应用程序中,只有在前景中具有用户活动的应用程序能够 使用那个资源,因此仅该应用程序能够发送音频数据到音频卡从而对其重现。

也可能是一种情况,其中硬件资源能够从不同的执行应用程序中接收数据,但在该情况 下,数据将会混合。因此,继续音频卡的例子,如果该资源可以从一个以上的执行的应用程 序中接收音频数据,音频卡重现其接收到的不同音频数据的混合。

为了克服这些缺点,本发明提供一种执行代码段,在执行初始化时必须插入到每个应用 程序中(例如,属于在休眠状态中启动的应用程序的进程),能够执行一种用于虚拟化一个或 多个硬件资源的方法,该硬件资源与执行应用程序的计算机系统关联。因此,该代码段的主 要目的是,对应用程序运行所需的来自计算机系统的硬件资源进行虚拟,使其能够仅通过已 插入该代码段的应用程序生成有用的虚拟化硬件资源,并且管理在属于应用程序的进程和硬 件资源之间的数据流。因此,每个执行的应用程序拥有自己的虚拟硬件设备以及工具(代码 段),该工具能够管理它们和进程之间所产生的数据流。

图2所示为基于图1的图形,但其进一步包括代表执行代码段的层16,当插入到与应用 程序关联的进程后,该代码段被配置为在应用程序层13和代表多个API的层12之间的逻辑 层,使得代码段可以拦截从应用程序对某API服务(例如函数和方法)的调用,由此实现硬 件资源10'的虚拟化。

如图2所示,代表代码段的层16的主函数对属于应用程序的进程向API服务所作出的不 同的调用进行拦截,该API服务与进程和计算机系统硬件资源之间产生的数据流相关,然后 基于这些调用的拦截,对进程和计算机系统硬件资源之间以及上述的进程和虚拟硬件资源10' 之间所产生的数据流进行管理。

更具体地,通过代码段执行的方法如下。必须基于初始的情况来描述,其中当用户执行 应用程序时,属于应用程序的进程在休眠状态中启动。在该休眠状态过程中,将执行代码段 插入到进程中。

一旦代码段插入到进程中,该代码段会使所有那些包含应用程序编程接口(API)的以及 执行应用程序时将会需要的动态链接库加载到内存中,这些应用程序编程接口包含与进程和 不同的计算机系统硬件资源之间的数据流管理相关的服务(函数或者方法)。然后,在操作系 统根据储存有这些服务的初始内存地址为装载在内存中的不同的API的服务填充服务指针表 之后,它将指针表中的每个应用程序在执行过程中可能或者会需要的服务的初始内存地址替 换为包含在该代码段的每一对应的服务所在的初始内存地址。因此,在执行重定向的基础上, 代码段能够对进程为了执行服务而对这些相关服务的调用进行拦截,即由于指针并不指向API 服务,而是指向包含在该代码段的对应的服务,代码段接收到该进程对不同的API的不同的 相关服务的调用。

基于所述拦截,代码段获取在进程和计算机系统的硬件资源之间产生的数据流的管理的 能力,即是,该代码段按照对进程透明的方式,对进程和计算机系统的硬件资源之间产生的 数据流实施控制。

更具体地,当进程尝试利用调用使计算机系统硬件资源接入某些API服务时,该段代码 执行其拥有的服务(即是,实现这些调用的拦截)。基于该拦截,如果先前没有产生虚拟硬件 资源10',而为了控制数据流则需要产生虚拟硬件资源10',该虚拟硬件资源10'与进程尝试 访问的计算机系统硬件资源对应。

产生虚拟硬件资源10'可能需要多个动作。

第一动作可以产生至少一个缓存区,用于虚拟至少一个与计算机系统硬件资源关联的缓 存区,即是,代码段保留特定的代表虚拟的缓存区的内存区,进程必须在其中储存数据,该 数据正开始发送到计算机系统硬件资源时就已经被代码段拦截。

将要实施的第二动作可以产生模拟计算机系统硬件资源行为的执行线程。基本上,该执 行线程可以是包含在代码段自身中的函数。

一旦创建虚拟硬件资源10'(如果它之前不存在),代码段在虚拟缓存区中储存由进程发 送的数据,并且产生上述的执行线程(如果需要)。代码段暂停执行线程(这是包含在相同的 代码段中的函数,因此代码段具有控制权)并持续一段预设的时间(约几毫秒),继而读取储 存在虚拟的缓存区的数据(应注意,所述数据来自进程)并进行处理。处理该数据后,代码 段能够发送数据到第一远程计算机系统,而该实施例将在后面描述。

重要的是,如果硬件资源不是虚拟硬件资源而是计算机系统硬件资源本身时,通常有必 要使代码段与进程进行通信以确保数据已被正确地接收。

此外,产生的执行线程也可能从第二远程计算机系统接收数据(尽管第一和第二远程计 算机系统通常是相同的远程计算机系统)。在这种情况下,执行线程处理接收的数据并且在处 理后储存在虚拟硬件资源10'的一部分的虚拟缓存区中。

在应用程序的执行的期间,进程调用某个API服务来验证计算机系统硬件资源是否产生 用于应用数据的数据。因为与进程和系统硬件资源之间的数据流的管理相关的所有API服务 已被重定向,代码段(更具体为包含在代码段中的服务)接收和处理调用。为此,代码段对 虚拟缓存区中包含的数据进行回收(应注意,远程计算机系统的执行线程已接收与虚拟缓存 区中包含的数据对应的数据(即是由执行线程处理和接收的数据)),并发送该数据到进程中 以供使用。

通常地,鉴于计算机系统硬件资源能够产生用于应用程序的数据(应注意,代码段只在 数据流级别而不是在控制信号级别上干预),代码段必须经常验证是否在硬件资源的缓存区中 存有数据,如果得到肯定的结果,则将这些数据删除。因此,避免在应用程序的执行过程中 出现问题。

下面将描述本发明一个优选实施例,其中操作系统可以是Windows系列中的任何一个, 例如Windows 7;计算机系统为应用程序服务器,更具体为游戏服务器;待执行的应用程序 为多个游戏和/或同一个游戏的多个不同实例;以及使执行的游戏实现访问请求的硬件资源为 游戏服务器的音频卡。在本发明的一个实施例中硬件资源为视频卡,在本发明的一个实施例 中硬件资源为数据输入设备(例如键盘或者鼠标),以及在本发明的一个实施例中硬件资源为 硬盘驱动器,这些实施例在下面描述。

更具体地,本实施例具有以下操作。游戏服务器的目的在于,使服务的用户在他们的移 动终端或远程计算机系统上,比如在智能手机或平板电脑上,玩不同的游戏甚至是相同的游 戏(例如PC游戏或主机游戏)。可以利用流媒体技术将每个游戏或者同一游戏的每个实例的 执行从游戏服务器发送到用户的移动设备。因此,用户可以从属于所述用户的移动设备中选 择要玩的游戏,通过在用户移动终端屏幕上显示的图形用户界面上出现的控制元件(例如代 表游戏的图标)的触发来请求执行游戏。由用户在控制元件上的触发,产生控制信号发送到 游戏服务器并使得在服务器上执行所选的游戏。

鉴于请求执行游戏的用户数量可能较大(即是可能存在大量正在执行的游戏),本发明的 目的在于对每个游戏,基于插入其中的代码段,能够对执行中所需的游戏服务器硬件资源进 行虚拟,从而在独占的基础上使它们可用。

当用户从他的/她的移动端请求执行游戏时,在休眠状态中,在游戏服务器中创建执行的 应用程序(即是游戏)的主进程。为此,使用Create Process函数,分配CREATE_SUSPENDED 值到创建模式参数(Create Flags)。一旦进程在休眠状态中启动,使根据本发明的执行代码 段插入到进程中,其目的在于对游戏服务器硬件资源进行虚拟。

对此需要着重注意的是,表述“对硬件资源进行虚拟”意味着不仅产生与计算机系统硬 件资源对应的虚拟硬件资源,而且还包括完全管理在后产生的数据流。

在进程的执行恢复前(应注意到,该进程在休眠状态中启动),插入的代码段重定向与数 据流有关的API函数,该数据流在应用程序(或更具体的属于应用程序的进程)和不同的游 戏服务器硬件资源之间产生(在本实施例中,至少加载那些计划用于管理应用程序和音频卡 之间的数据流的函数)。因此,例如在本实施例中可能让人感兴趣的函数为I Audio Client或 者I Audio Render Client。

鉴于在本实施例中,执行在游戏服务器上的操作系统是来自Windows家族的成员(更具 体为Windows 7),这些描述的API通常以多个动态链接库(DLL)的方式来实现。因此,代 码段利用Load Library函数加载库或者加载含有让人感兴趣的函数的库,该函数例如是 dxgi.dll库中的I Audio Render Client API的Get Buffer和Release Buffer。基本上, Load Library将库加载在内存中,并且操作系统以API函数的内存中的初始地址填充索引地 址表(IAT),该表是用于API函数的函数指针表。利用Redirect I AT函数,代码段修改必要 的指针,使它们与包含在插入到进程中的代码段中的函数对应。同时,如果代码段必须随时 调用任何重定向的原始函数,将表的原始内容,即将指针的修改前的初始值储存在变量中。

当拦截结束,即是当所有必须的API的所有函数已重定向,代码段恢复执行已在休眠状 态中启动的进程。

另一方面,当进程请求利用I Audio CLient接口的Get Service方法来创建 I Audio Render Client类型的接口(一种COM类型的接口),代码段验证该接口是否已被代码 段修改(即是重定向)。如果在验证中得到否定结果,需要修改接口的指针表,用以代替将被 拦截的方法,例如I Audio Render Client的Get Buffer和Release Buffer。用特定的代码对用 于COM类型接口方法的方法指针表进行修改。例如,Get Buffer与I Audio Render Client接口 的方法表的位置4对应,并且必须对其修改,使其指向包含在插入的代码段中的函数。同时, 如果需要调用原始的方法,在变量中储存该位置的原始内容。正如已经提及到,COM类型接 口的指针表的修改仅必须在该类型对象首次创建时实施。

一旦插入到尝试访问音频卡的游戏中的代码段已经对接口I Audio Render Client进行创 建和拦截,代码段返回相应的I Audio Render Client对象到进程。

当属于应用程序的进程调用I Audio Render Client Get Buffer方法来请求可写入音频卡的 音频数据的缓存区(更具体地,该进程需要内存区地址以写入音频数据)的时候,代码段拦 截该调用(应注意到,Get Buffer方法重定向到对应的包含在代码段中的方法,因此该进程 实际上调用包含在代码段中的对应方法)。包含在代码段中的对应方法调用API的原始方法 (然而代码段可包含整个方法)并且产生对关联音频卡的缓存区进行虚拟的缓存区,即是, 该方法传送将要写入音频数据的内存区地址到进程。因此,进程不会在游戏服务器音频卡的 缓存区储存音频数据,而是在对应实际音频卡缓存区的虚拟缓存区中储存音频数据。

一旦应用程序将所有音频数据写入到虚拟缓存区内,实施对Release Buffer函数的调用 来指示其已经完成音频数据写入和写入多少数据。代码段再次拦截该调用,从而能够知道所 有音频数据在什么时候写入到虚拟的缓存区并且写入了多少音频数据。

此外,由于涉及通过音频卡控制应用程序的问题,代码段将相同大小的只包含静音的缓 存区发送到音频卡。因此,代码段确定音频卡持续正确地控制应用程序。

平行于上面的描述,代码段产生模拟游戏服务器音频卡的行为的执行线程。着重指出, 该执行线程只是包含在相同代码段中的函数。代码段同步或者异步地暂停执行线程约数毫秒。 暂停后,执行线程从进程读取储存在虚拟缓存区的音频数据,对该音频数据处理并发送到移 动终端以重现。

对音频数据的处理可以包括混合不同的音频数据(例如,在执行游戏时听得到的背景音 乐以及用户在游戏中介入(例如射击、汽车引擎、刀剑等)所产生的听得到的声音),并且可 以将其转换为合适的音频格式,比如mp3(根据MPEG-1音频层III标准)。一旦音频数据格 式正确,代码段经由任意的通信网络(例如互联网)将其发送到移动终端,从而在用户享受 游戏的时候进行音频重现。

在本实施例中,描述了游戏对访问音频卡的请求。实际上,可以在游戏服务器上执行多 个游戏和/或一个且相同游戏的多个实例,因此它们中的每一个需要包含插入的代码段用于执 行已描述的方法。

如果游戏要虚拟的硬件资源是游戏服务器视频卡,并且基于游戏的主进程即将在休眠状 态中启动,并且其中的代码段已经插入到进程中,那么用于虚拟视频卡的方法如下描述。

在其它硬件资源的情况下,在恢复执行进程之前,插入的代码段重定向必要的API函数, 在该情况中例如是Direct X API的函数Show Window或者Create Device。接着,该方法的主 要目的在于,使代码段以透明的方式接管在视频卡和属于应用程序的进程之间产生的数据流 的管理。

如上所述,这些API在动态链接库中实现(在本实施例中,操作系统为Windows家族的 一员,这些库为多个DLL)。因此,代码段利用Load Library函数加载库或者加载包含待重定 向的函数的库,例如是user32.dll库中的Show Window函数。一旦加载,并且基于储存了这 些函数的初始内存地址,在操作系统已经用API函数的函数指针填充索引地址表(I AT)后, 代码段利用Redirect AIT函数修改那些能令人感兴趣用于虚拟视频卡的函数的指针。因此, 用储存了包含在代码段中的相应函数的初始内存地址代替储存了这些API函数的初始内存地 址。可选地,如果需要,还可以用特定的代码来修改IAT。

另一方面,为了重定向COM类型接口的服务,比如I Direct 3D Device9,需要修改接口的 指针表来代替相关的方法。用特定的代码对用于COM类型接口方法的方法指针表进行修改。 例如,Present与I Direct 3D Device9接口的方法表的位置18对应,并且必须对其修改,使 其指向包含在插入的代码段中的函数。同时,该位置的原始内容储存在变量中,以备需要从 代码段调用原方法。对COM类型接口的指针表的修改只有在该类型的对象第一次创建的时候 需要修改。当拦截结束,即是当所有必须用于实施资源虚拟化的API的所有函数已重定向时, 代码段负责恢复执行应用程序的进程。

当进程利用Direct X API的Create Device函数请求将要绘制示出图形的窗口或者请求创 建I Direct 3D Device9类型的接口时,对这些调用进行拦截,从而对绘图环境(DC)进行捕获 或者虚拟(在这种情况中可以用原始的DC或者虚拟的DC来完成来提供)。DC可以定义为内 存区,其中视频卡将会一帧接一帧地储存产生的图像到该内存区中,并且在Windows系统中 一直与一窗口关联。因此,对于游戏服务器视频卡的虚拟化,必须利用get DC函数来访问该 内存区。对DC的访问是互斥的,即是,如果视频卡正访问该内存区,不能有任何进程的线程 去访问它。

一旦应用程序已经创建I Direct 3D Device9接口或者至少显示了将会显现图形的窗口,则 开始发送必要的数据到视频卡,从而开始处理该信息并且创建结果帧。这个过程不依赖于代 码段。

几乎每隔一段时间,视频虚拟化线程捕获DC的内容。该过程可以用应用程序采用同步的 方式或者异步的方式来实施。

以同步的方式指的是,进程通过唤起I Direct 3D Device9接口的Present方法发出请求访 问视频卡从而显示所产生的帧,此时代码段拦截该Present方法。在那个时候,执行线程访 问DC(在本情况中称为Back Buffer)从而捕获所产生的帧。随后,如果需要的话,代码段调 用接口的原始Present方法。该方法是同步发生的,因为存在有一点,在调用Present方法 时,代码段优选地知道为了绘制帧而进行的工作已经在该点处结束。

异步的方式包括直接访问窗口(在其中,视频卡的输出结果是产生帧)的DC来访问内容。 必须考虑到以互斥的方式来访问该DC。为此,执行线程尝试通过调查来获取对该互斥的区域 的访问。在执行时,其访问DC内存以捕获所产生的帧的结果。该方法是异步进行的,因为帧 捕捉的速度和帧产生的速度不需要相同。

在任意的这两种方法中,只要已经捕获DC内容,即是帧,则开始处理该信息,并且可以 基于利用合适的编码比如H.264来进行译码,并且可以通过互联网发送该译码。

如果硬件资源为数据输入元件,比如鼠标或者键盘,具体的方法描述如下。不同于已经 从上面描述到此的内容,该方法管理从数据输入元件输出到属于应用程序的进程的数据流, 即是,该方法寻求将来自享受游戏的用户的指令(例如,通过触摸屏或从移动终端的键盘) 发送到正执行于游戏服务器上的游戏。

因此,基于代码段已经插入到进程(即插入到游戏)的情况下,代码段已重定向相关的 服务并且产生虚拟的硬件资源(即是,已经产生对数据输入单元的缓存区进行虚拟的缓存区, 以及对数据输入单元的行为进行模拟的执行线程),代码段(更具体地,对数据输入单元的行 为进行模拟的执行线程)从用户的移动终端接收数据,必须将该数据发送到进程以便对例如 涉及音频和视频的数据进行修改,然后发送到移动终端。为此,代码段根据从中接收数据的 输入单元,将接收的数据储存在对应的虚拟缓存区中(任一与虚拟的键盘对应的缓存区或者 与虚拟的鼠标对应的缓存区)。

当进程发出对相应服务的调用以从输入元件(实际的键盘鼠标,即是与游戏服务器关联 的键盘鼠标)中获取数据,代码段拦截该调用并且触发包含在代码段中的相应服务的执行, 使得该服务读取储存在虚拟缓存区中的数据而不是读取在实际输入单元的缓存区中的数据。

考虑到本优选实施例的操作系统是来自Windows家族中的一员,有必要考虑Windows消 息。在此情况中,对消息队列进行模拟的执行线程通过网络(例如互联网)从远程系统(即 是移动终端)接收数据输入(例如键盘或者鼠标)。该数据可以是用户从移动终端发送的指令 和/或事件。因此,执行线程在与应用程序窗口关联的消息队列中为每个数据输入(利用 user 32.dll库的Send Message和Post Message函数)引入一消息。该消息队列利用操作系统 提供的消息排队系统机制自动地查询应用程序。此外,为了完成消息队列的虚拟化,可能需 要(利用user 32.dll库的Set Window Long Ptr函数)改变消息队列的查询和处理函数,从而 执行代码段的函数,以代替执行消息队列的原始消息处理函数(也称为窗口函数或方法,其 是程序员对确定应用程序响应某一消息的行为而定义的函数)。换句话说,与应用程序对应的 窗口的窗口函数和方法被拦截。代码段的函数可以:消除应用程序窗口的原始函数不会处理 的那些消息(即,不执行任何动作来响应该消息),由此使应用程序忽略所述消息,此后原函 数实际上不会对它们进行处理;或者,基于移动终端发送的指令,为模拟虚拟硬件资源(键 盘或鼠标)录入数据行为,代码段的执行线程引入这些信息,同时这些消息不会从移动终端 用户的角度去改变应用程序行为(窗口已经在实际的计算机系统的屏幕上移动,但对于远程 系统用户,其位置是完全不相关的),因此应用程序响应这些消息,由此从代码段的函数调用 原始的消息处理函数。

最后,使进程在其中为访问发出请求的硬件资源是存储单元比如硬盘驱动器的时候,方 法描述如下。在此情况中,假设代码段已经插入到进程中。

在恢复执行进程之前(应注意到在本优选实施例中的进程在休眠状态中启动),插入的代 码段重定向所有必需的的API函数,例如Create File和Create Directory。主要目的是为了 使代码段获得对进程和硬盘驱动器之间的数据流的控制。

正如所讨论的其余硬件资源,因为这些API是以动态链接库的形式实施,代码段必须利 用Load Library函数将它们加载到内存中。因此,Load Library加载包含待重定向的函数的 库,例如kernel 32.dll库的Create File和Create Directory。然后操作系统用储存每个API 函数的初始内存地址填充IAT。利用Redirect I AT函数修改必要的指针,使该指针指向包含 在代码段中的对应函数。当代码段完成与进程和硬盘驱动器之间的数据流管理有关的函数的 重定向时,代码段本身负责恢复对属于在休眠状态中启动的应用程序的进程的执行。

当进程想要利用CreateFile函数创建和/或打开文件时,代码段拦截该请求并且执行相 应的包含在代码段中的函数。基于拦截,该函数验证将要由进程打开的文件是否是用于游戏 回合的文件或者是任意的其它文件。如果它是用于游戏回合的文件,有需要的话,该函数利 用任意类型的算法修改要创建和/或打开的文件路径。一旦修改了路径,用新创建的路径执行 原始的CreateFile函数,然而可能还执行包含在代码段中的相应的函数。利用 Create Directory函数创建目录的方法等同于已描述的对应Create File函数的方法。

明显地,在本优选实施例中,已分别描述每个硬件资源的虚拟化。如果一个和相同的代 码段能够虚拟多个硬件资源,方法的第一个步骤,例如,在内存中加载不同的动态链接库的 步骤或者对服务替换指针的步骤可以是通用的,即是,能够同时将所有包含API的动态链接 库加载到内存中,该动态链接库带有代码段能够进行虚拟的所有硬件资源的相关服务,并且 可以替换所有待重定向的服务的指针,使得代码段可以虚拟所有能够进行虚拟化的硬件资源。

尽管已经描述并描绘了本发明的特定实施例,但非常明显的是,本领域技术人员可以进 行变型和修改,或者将细节替换为其他技术上等同的细节,都不会超出权利要求保护的范围。

虽然文中参考附图描述的实施例包括计算机系统以及在计算机系统中执行的进程,但本 发明还覆盖计算机程序,更具体地,适于将本发明用于实践的载体媒体的计算机程序。计算 机程序可以是源代码、目标代码或者介于源代码和目标代码之间的中间代码的形式,如部分 编译形式,或者适于实现本发明进程的其他形式。该载体媒体可以是任何实体或者可以执行 该方案的设备。

例如,载体媒体可以包括存储介质,如ROM,例如CD ROM或者半导体ROM,或者磁记录 介质,例如软盘或硬盘。此外,载体媒体还可以是可传送载体媒体,如可以利用无线电或其 他方式通过电线或光纤进行传输的电或者光信号。

当计算机程序包含在可直接通过电缆或其他工具或装置传播的信号中时,该载体媒体可 以通过所述电缆或其他设备或装置形成。

或者,载体媒体可以为内嵌计算机程序的集成电路,所述集成电路适于执行或者用于执 行相关进程。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号