一种兼容的接口创建方法和系统与流程

文档序号:12786156阅读:252来源:国知局
一种兼容的接口创建方法和系统与流程

本发明涉及计算机技术领域,特别是涉及一种兼容的接口创建方法和一种兼容的接口创建系统。



背景技术:

内核态与用户态(用户态可以理解为应用态)是操作系统的两种运行级别,Windows的设备驱动程序就是运行在内核态下,而用户应用程序都运行在用户态下。用户态的程序运行在非特权处理机模式上,其他一些被保护的子系统代码也运行在该模式上。用户态的程序不能获得系统数据的存取权,除非调用Win32API(Application Programming Interface,应用程序编程接口)或者系统服务。内核态的驱动程序作为操作系统的一个组成部分被执行——支持一个或多个受保护的子系统的操作系统底层组件。

Windows平台的内核开发上存在一种开发需求,如对于同一套逻辑,同时需要内核态的代码和用户态的代码。但是实际应用中,对于同一功能,对应该功能的内核态的接口函数和应用态的接口函数不同。因此,开发人员需要分别记录内核态形式的接口函数和应用态形式的接口函数,在编译内核态的代码时不能使用应用态的接口函数,反之在编译应用态的代码时不能使用内核态的接口函数。如此对于开发人员来说,对于相同功能存在不同的形式的接口函数,其开发更复杂,并且要完全分别开发,开发效率低。



技术实现要素:

鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的兼容的接口创建方法和相应的兼容的接口创建装置。

依据本发明的一个方面,提供了一种兼容的接口创建系统,包括:

内核态接口创建模块、应用态接口创建模块、公用接口库;

内核态接口创建模块,适于在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数;

应用态接口创建模块,适于在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;

公用接口库,适于根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

优选地,在内核态接口创建模块和应用态接口创建模块之前还包括:

全局指针定义模块,适于为每对内核态接口函数和应用态接口函数定义同一个全局的函数指针变量。

优选地,所述内核态接口创建模块包括:

内核实例创建模块,适于创建内核态实例;

内核态初始化模块,适于在内核态实例中,获取所述函数指针变量,并为函数指针变量加载对应内核态接口函数的符号。

优选地,所述应用态接口创建模块包括:

应用实例创建模块,适于创建应用态实例;

应用态初始化模块,适于在应用态实例中,获取所述函数指针变量,并为函数指针变量加载对应应用态接口函数的符号。

优选地,内核态接口创建模块还包括:

内核接口函数导出模块,适于获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出内核接口函数文件;

所述应用态接口创建模块还包括:

应用接口函数导出模块,适于获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出应用接口函数文件。

优选地,还包括:

应用态程序除错模块,适于通过应用态程序接口选择文件和/或、标准输入输出调试方式、和/或调试输出调试方式;所述应用态程序除错接口模拟内核态程序除错接口。

根据本发明的另一方面,提供一种兼容的接口创建方法,包括:

在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数

在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;

根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

优选地,在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象和在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象之前,还包括:

为每对内核态接口函数和应用态接口函数定义同一个全局的函数指针变量。

优选地,所述在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象包括:

创建内核态实例;

在内核态实例中,获取所述函数指针变量,并为函数指针变量加载对应内核态接口函数的符号。

优选地,所述在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象包括:

创建应用态实例;

在应用态实例中,获取所述函数指针变量,并为函数指针变量加载对应应用态接口函数的符号。

优选地,还包括:

获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用 接口导出内核接口函数文件;

和获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出应用接口函数文件。

优选地,还包括:

通过应用态程序接口选择文件和/或、标准输入输出调试方式、和/或调试输出调试方式;所述应用态程序除错接口模拟内核态程序除错接口。

根据本发明的另一方面,提供一种兼容的接口创建设备,包括:

存储器,加载有多条可执行指令;

处理器,执行所述多条可执行指令;所述多条可执行指令包括执行以下步骤的方法:

在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数

在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;

根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

根据本发明的兼容的接口创建系统和方法,包括了公用接口库、内核态接口创建模块、应用态接口创建模块,将具备相同参数的内核态的接口函数和应用态接口函数,在公用接口库中创建相应的公用接口函数,该所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。然后编译时,在内核态实例中为全局的函数指针变量加载对应内核态接口函数的第一对象;另外在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;然后公用接口库根据所述函数指针变量,为公用接口函数生成调用接口,供给公共代码部分对下层内核态、用户态兼容,该调用接口则可以作为兼容的系统接口,由此解决了用户态和内核态接口函数相互不兼容,导致开发复杂,开发效率低的问题,取得了 可以在上层提供兼容接口给用户,以及使用户可以采用兼容接口完成用户态和内核态代码的编译,提高开发效率的有益效果。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1示出了根据本发明一个实施例的一种兼容的接口创建系统实施例的结构框图;

图2示出了根据本发明一个实施例的一种兼容的接口创建系统实施例的结构框图;

图2A示出了根据本发明一个实施例的一种兼容的接口创建系统实施例的逻辑架构图;

图3示出了根据本发明一个实施例的一种兼容的接口创建方法实施例的步骤流程图;

图4示出了根据本发明一个实施例的一种兼容的接口创建方法实施例的步骤流程图。

具体实施方式

下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术 人员。

参照图1,示出了根据本发明一个实施例的一种兼容的接口创建系统实施例的结构框图,具体可以包括如下模块:

内核态接口创建模块110、应用态接口创建模块120、公用接口库130;

内核态接口创建模块110,适于在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数;

如表1-表3,其示出了Windows系统的不同功能分类下的不同操作的内核态接口函数和应用态接口函数,每行的两个函数对应同一个操作。比如表1-表3中ZwOpenFile为内核态的用于打开文件的函数和NtOpenFile为应用态的用于打开文件的函数,两者的参数一致。

其他的函数类似,如表1-表3所示,大部分的内核态接口函数和应用态的接口函数都不相同。

表1

表2

表3

而本发明实施例,针对表1-表3中的每对内核态接口函数和应用态接口函数都在公用接口库中设置了一个公用接口函数,其参数与该对内核态接口函数和应用态接口函数一致,如对于前述ZwOpenFile为内核态的用于打开文件的函数和NtOpenFile为应用态的用于打开文件的函数,设置了公用接口函数FRMBASE_OpenFile,其参数如上述。

在本发明实施例中,由于构建了上述的公用接口库,为了与公用接口 库的函数与实际的内核态接口函数对应使用,那么首先需要预定义一个全局的函数指针变量,然后在内核态实例中,获取该全局的函数指针变量,然后为全局的函数指针变量加载对应内核态接口函数的第一对象。实际上,为该函数指针变量加载内核态函数第一对象,是将公用接口函数的地址指向该内核态函数的地址。

在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。因此,这种指向函数的指针变量称为“函数指针变量”。函数指针变量定义的一般形式为:

类型说明符(*指针变量名)();

优选的,在内核态接口创建模块110和应用态接口创建模块120之前,还包括:

全局指针定义模块100,适于为每对内核态接口函数和应用态接口函数定义同一个全局的函数指针变量。

在本发明实施例中,为了使在内核态实例和应用态实例中,可以分别获取函数指针变量,本发明实施例设置了全局的函数指针变量。那么内核态接口创建模块在其内核态实例中,即可获取该函数指针变量,为其加载对应内核态接口函数的第一对象。应用态接口创建模块在其应用态实例中,即可获取该函数指针变量,为其加载对应应用态接口函数的第一对象。

本发明实施例中对于前述的“(*指针变量名)()”,将其定义为全局的函数指针变量。

应用态接口创建模块120,适于在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;

在本发明实施例中,对于前述全局的函数指针变量,然后在应用态实例中,获取该全局的函数指针变量,然后为全局的函数指针变量加载对应应用态接口函数的第一对象。实际上,为该函数指针变量加载应用态函数 第一对象,是将公用接口函数的地址指向该应用态函数的地址。

公用接口库130,适于根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

在实际应用中,内核态接口创建模块或应用态接口创建在为所述全局的函数指针变量加载相应的第一对象后,会分别调用公用接口库,由公用接口库为该函数指针变量和公用接口函数封装一个调用接口。然后将该调用接口返回给各自的实例。

如此,即可通过同一个调用接口实现对底层的内核态、用户态的同一操作的接口函数的兼容。

当某个进程调用该调用接口时,则该调用接口可根据其所属的内核态还是应用态,通过函数指针变量导向相应的相应内核态或者应用态的第一对象,然后将参数传入相应的函数中执行。从而实现了内核态和应用态的接口的统一。

本发明实施例包括了公用接口库、内核态接口创建模块、应用态接口创建模块,将具备相同参数的内核态的接口函数和应用态接口函数,在公用接口库中创建相应的公用接口函数,该述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。然后编译时,在内核态实例中为全局的函数指针变量加载对应内核态接口函数的第一对象;另外在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;然后公用接口库根据所述函数指针变量,为公用接口函数生成调用接口,供给公共代码部分对下层内核态、用户态兼容,该调用接口则可以作为兼容的系统接口,由此解决了用户态和内核态接口函数相互不兼容,导致开发复杂,开发效率低的问题,取得了可以在上层提供兼容接口给用户,以及使用户可以采用兼容接口完成用户态和内核态代码的编译,提高开发效率的有益效果。

实施例二

参照图2,示出了根据本发明一个实施例的一种兼容的接口创建系统实施例的结构框图,具体可以包括如下模块:

全局指针定义模块210、内核态接口创建模块220、应用态接口创建模块230、公用接口库240;下面结合图2A对本发明实施例进行描述。图2A示出了本发明最优的兼容的接口创建系统架构逻辑图。

本发明实施例利用WDK构建,WDK是微软发布的内核开发编译套件,本身不仅仅支持编译生成内核sys模块,也支持编译用户态可执行程序exe和动态链接库dll。本发明实施例利用两个WDK Makefile开发工程分别构建内核态接口创建模块220和应用态接口创建模块230。即如图2A中的DLL Makefile对应应用态接口创建模块230,SYS Makefile对应内核态接口创建模块220。

其中,全局指针定义模块210,适于为每对内核态接口函数和应用态接口函数定义同一个全局的函数指针变量。

在本发明实施例中在公用的头文件Common\FRMBase.h(图2A中未示出)中定义全局的函数指针变量。该Common\FRMBase.h加载后对应全局指针定义模块210。

在实际应用中,如果需要哪个或者哪几个操作的接口函数,则可以定义这些操作的全局的函数指针变量,比如需要ZwOpenFile和NtOpenFile的操作,则可以定义全局的函数指针变量为:

typedef NTSTATUS(NTAPI*FN_NtOpenFile)(

OUT PHANDLE FileHandle,

N ACCESS_MASK DesiredAccess,

IN POBJECT_ATTRIBUTES ObjectAttributes,

OUT PIO_STATUS_BLOCK IoStatusBlock,

IN ULONG ShareAccess,

IN ULONG OpenOptions);

其中FN_NtOpenFile为函数指针变量的类型,其函数指针变量为 fn_NtOpenFile。当然,函数指针变量名可以采用任一习惯的方式命名,本发明实施例不对其加以限制。

当然,对于其他操作的函数类似定义。

内核态接口创建模块220,适于在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数;具体包括:

内核实例创建模块221,适于创建内核态实例;

在本发明实施例中如图2A,其中的Drv\Drv Main.C所在部分对应内核实例创建模块221。在Drv\Drv Main.C启动后,加载内核态实例,在该内核态实例中加载其他部分。Drv\Drv Main.C实现内核态接口创建模块220的基础框架,为内核态接口的处理提供运行环境。

内核态初始化模块222,适于在内核态实例中,获取所述函数指针变量,并为函数指针变量加载对应内核态接口函数的符号。

如图2A,Drv\XxxBaseInit.c对应内核态初始化模块222。在本发明实施例中,可以预先在Drv\XxxBaseInit.c中写入各内核态接口函数,以及对函数指针变量的动态加载逻辑。

在本发明实施例中,在内核态实例创建之后,则可以加载Drv\XxxBaseInit.c进行内核接口函数初始化的过程,其会从全局指针定义模块210中获取全局的函数指针变量,然后分析该函数指针变量是针对哪个内核接口函数,比如通过函数指针变量与内核接口函数名的对应关系,确定该函数指针变量对应哪个内核接口函数。然后对该函数指针变量加载该内核接口函数的符号。比如对于前述typedef NTSTATUS(NTAPI*FN_NtOpenFile)(),提取函数指针变量类型FN_NtOpenFile,与预先构建的FN_NtOpenFile与ZwOpenFile函数的对应关系,根据当然的内核态标识查找FN_NtOpenFile与ZwOpenFile函数的对应关系,以确定该函数指针变量对应的内核态接口函数为ZwOpenFile函数,那么可以将ZwOpenFile函数的符号加载给该函数指针变量。其加载过程可如下:

1、将内核态接口函数的函数名生成一个unicode字符串;

如RtlInitUnicodeString(&usNtOpenFile,WSTR_FUNC_OPENFILE);

以前述fn_NtOpenFile为例,WSTR_FUNC_OPENFILE对应ZwOpenFile函数的函数名,即ZwOpenFile。通过RtlInitUnicodeString函数将ZwOpenFile函数的函数名生成一个unicode字符串。

2、获取函数指针变量,从内核中查找内核态接口函数的地址,并将该地址赋予该函数指针变量。

如函数指针变量fn_NtOpenFile,其代码如:

fn_NtOpenFile=MmGetSystemRoutineAddress(&usNtOpenFile);

其中,通过MmGetSystemRoutineAddress函数,利用前述ZwOpenFile函数的unicode字符串,从内核中查找ZwOpenFile函数的地址。

应用态接口创建模块230,适于在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;具体包括:

应用实例创建模块231,适于创建应用态实例;

在本发明实施例中如图2A,其中的Dll\Dll Main.C所在部分对应应用实例创建模块231。在Dll\Dll Main.C启动后,加载应用态实例,在该应用态实例中加载其他部分。Dll\Dll Main.C实现应用态接口创建模块230的基础框架,为应用态接口的处理提供运行环境。

应用态初始化模块232,适于在应用态实例中,获取所述函数指针变量,并为函数指针变量加载对应应用态接口函数的符号。

如图2A,Dll\XxxBaseInit.c对应应用态初始化模块232。在本发明实施例中,可以预先在Dll\XxxBaseInit.c中写入各应用态接口函数,以及对函数指针变量的动态加载逻辑。

在本发明实施例中,在应用态实例创建之后,则可以加载Dll\XxxBaseInit.c进行应用接口函数初始化的过程,其会从全局指针定义模块210中获取全局的函数指针变量,然后分析该函数指针变量是针对哪个应用接口函数,比如通过函数指针变量与应用接口函数名的对应关系,确定该函数指针变量对应哪个应用接口函数。然后对该函数指针变量加载该应用 接口函数的符号。比如对于前述typedef NTSTATUS(NTAPI*FN_NtOpenFile)(),提取函数指针变量类型FN_NtOpenFile,与预先构建的FN_NtOpenFile与NtOpenFile函数的对应关系,根据当然的应用态标识查找FN_NtOpenFile与NtOpenFile函数的对应关系,以确定该函数指针变量对应的应用态接口函数为NtOpenFile,那么可以将ZwOpenFile函数的符号加载给该函数指针变量。其加载过程可如下:

1、获取应用态内核接口函数的动态链接库ntdll.dll句柄;

如hDllModule=GetModuleHandle(TSTR_DLL_NTDLL);

其中,通过GetModuleHandle函数,获取动态链接库ntdll.dll的句柄。

2、根据所述动态链接库ntdll.dll的句柄查找相应的动态链接库,然后从所述动态链接库中查找所述应用态接口函数的地址并将该地址赋予该函数指针变量。

如函数指针变量fn_NtOpenFile,其代码如:

fn_NtOpenFile=(FN_NtOpenFile)GetProcAddress(hDllModule,ASTR_FUNC_OPENFILE);

其中,WSTR_FUNC_OPENFILE对应NtOpenFile函数的函数名,通过GetProcAddress即可从动态链接库ntdll.dll的句柄查找相应的ntdll.dll,并从所述ntdll.dll中查找NtOpenFile函数的地址。

公用接口库240,适于根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

如图2A公用接口库240包括Common\Xxxbase.c和Common\Xxx.C。在本发明实施例中,对于具有相同参数的内核态接口函数和应用态接口函数,在公用接口库中封装了公用接口函数。以NtOpenFile和ZwOpenFile为例,在Common\Xxxbase.c中封装方式如下:

由于前述内核态接口创建模块220和应用态接口创建模块230各自在自己的实例中将全局的函数指针变量赋予了相应需求的符号,而为了使各自的调用者在调用公用接口函数时,可以将参数传入底层的内核态接口函数或者应用态接口函数,本发明实施例还对该函数指针变量与公用函数接口进行封装,封装为一个调用接口,那么内核态或者应用态调用者调用公用接口函数时,该函数就可以通过该调用接口将参数传递到相应的内核态或者应用态的接口函数中。在本发明实施例中,对于公用接口的高层封装在Common\Xxx.C中执行。

如前述fn_NtOpenFile,其封装代码示例如下:

如此,如果内核态的调用者调用FRMBASE_OpenFile函数,则根据内核态的身份,通过该调用接口,将各参数通过函数指针变量,传入到ZwOpenFile。然后底层即可执行内核态接口函数的逻辑。

如果应用态的调用者调用FRMBASE_OpenFile函数,则根据应用态的身份,通过该调用接口,将各参数通过函数指针变量,传入到NtOpenFile。然后底层即可执行应用态接口函数的逻辑。

在实际应用中,还包括内存声明模块,其包括Common\MemManage.h,在其中还声明了三个函数:

#define__MM__TEXT("MemoryManagement:")

EXTERN_C PVOID

MM_MemAlloc(IN SIZE_T stByteCount);定义了内存分配函数;

EXTERN_C PVOID

MM_MemReAlloc(IN PVOID lpMem,IN SIZE_T stByteCount);定义了内存重分配函数;

EXTERN_C VOID

MM_MemFree(IN PVOID lpMem);定义了内存释放函数。

如此在内核态内存管理模块和应用态内存管理模块可以调用上述几个函数进行内存管理。

优选的,在内核态接口创建模块220中,还包括:

内核接口函数导出模块223,适于获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出内核接口函数文件;

在本发明实施例中,如图2A中的Drv\Drv_Xxx.h加载后对应内核接口函数导出模块223。内核接口函数导出模块223在公用接口库240的调用接口封装完毕后,可以获取公用接口函数及调用接口,以及赋予了内核接口 函数的符号的函数指针变量等代码,导出内核接口函数文件,如Sys文件。

当然,在实际应用中,在内核态接口创建模块220中,还包括:

内核态内存管理模块,适于对内核态实例对应的内存进行管理。

如图2A,其Drv\MemManage.c加载后对应内核态内存管理模块。在Drv\MemManage.c中实现统一的动态内存管理调用接口。内核态接口创建模块220的其他模块可以调用内核态内存管理模块的调用接口为自己分配内存。

优选的,在应用态接口创建模块230中,还包括:

应用接口函数导出模块233,适于获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出应用接口函数文件。

在本发明实施例中,如图2A中的DLL\DLL_Xxx.h加载后对应应用接口函数导出模块233。应用接口函数导出模块233在公用接口库240的调用接口封装完毕后,可以获取公用接口函数及调用接口,以及赋予了内核接口函数的符号的函数指针变量等代码,导出应用接口函数文件,如dll文件。

当然,在实际应用中,在应用态接口创建模块230中,还包括:

应用态内存管理模块,适于对应用态实例对应的内存进行管理。

如图2A,其Dll\MemManage.c加载后对应应用态内存管理模块。在Dll\MemManage.c中实现统一的动态内存管理调用接口。应用态接口创建模块230的其他模块可以调用应用态内存管理模块的调用接口为自己分配内存。

优选的,在应用态接口创建模块230中,还包括:

应用态程序除错模块234,适于通过应用态程序接口选择文件和/或、标准输入输出调试方式、和/或调试输出调试方式;所述应用态程序除错接口模拟内核态程序除错接口。

在本发明实施例中,如图2A,Dll\DbgTrace.c加载后对应应用态程序除错模块234,应用层通过DbgTrace.c模拟实现内核态程序除错(Debug)接口,既和内核调试信息接口统一又可以根据应用层编程习惯在应用层该调 试接口模拟实现中可选地选用文件、标准输入输出和调试输出多种调试方式。从而用户可以在应用态程序除错模块234中,通过应用态程序接口选择文件和/或、标准输入输出调试方式、和/或调试输出调试方式。通过该种方式使应用态程序除错模块234可用于验证和辅助内核开发,提升开发和测试效率。

在实际应用中内核中只调用DbgPrint接口或者DbgPrintEx接口进行debug输出。而为了使应用态的DLL Makefile可以采用复合应用层的习惯对程序进行验证,本发明实施例在应用态程序除错模块234提供了文件打印、标准输出、Debug输出三种接口。在实际应用中,可以根据实际需要选择开关哪种接口。在本发明实施例中,在应用态程序除错模块234中的上述三个接口导出了与内核态同名的接口,并在该应用态的接口中可以封装自己需求的逻辑。

本发明实施例包括了公用接口库、内核态接口创建模块、应用态接口创建模块,将具备相同参数的内核态的接口函数和应用态接口函数,在公用接口库中创建相应的公用接口函数,该述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。然后编译时,在内核态实例中为全局的函数指针变量加载对应内核态接口函数的第一对象;另外在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;然后公用接口库根据所述函数指针变量,为公用接口函数生成调用接口,供给公共代码部分对下层内核态、用户态兼容,该调用接口则可以作为兼容的系统接口,由此解决了用户态和内核态接口函数相互不兼容,导致开发复杂,开发效率低的问题,取得了可以在上层提供兼容接口给用户,以及使用户可以采用兼容接口完成用户态和内核态代码的编译,提高开发效率的有益效果。并且可以提供使应用态程序除错模块,用于验证和辅助内核开发,提升测试效率。

实施例三

参照图3,示出了根据本发明一个实施例的一种兼容的接口创建方法实施例的步骤流程图,具体可以包括如下步骤:

步骤310,在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数。

步骤320,在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;

在本发明实施例中步骤310和步骤320可以并行执行。

步骤330,根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

优选的,在步骤310和步骤320之前还包括:

步骤300,为每对内核态接口函数和应用态接口函数定义同一个全局的函数指针变量。

本发明实施例提供了公用接口库、将具备相同参数的内核态的接口函数和应用态接口函数,在公用接口库中创建相应的公用接口函数,该所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。然后编译时,在内核态实例中为全局的函数指针变量加载对应内核态接口函数的第一对象;另外在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;然后公用接口库根据所述函数指针变量,为公用接口函数生成调用接口,供给公共代码部分对下层内核态、用户态兼容,该调用接口则可以作为兼容的系统接口,由此解决了用户态和内核态接口函数相互不兼容,导致开发复杂,开发效率低的问题,取得了可以在上层提供兼容接口给用户,以及使用户可以采用兼容接口完成用户态和内核态代码的编译,提高开发效率的有益效果。

实施例四

参照图4,示出了根据本发明一个实施例的一种兼容的接口创建方法实施例的步骤流程图,具体可以包括如下步骤:

步骤410,为每对内核态接口函数和应用态接口函数定义同一个全局的函数指针变量。所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数。

步骤412,创建内核态实例;

步骤414,在内核态实例中,获取所述函数指针变量,并为函数指针变量加载对应内核态接口函数的符号。

步骤416,创建应用态实例;

步骤418,在应用态实例中,获取所述函数指针变量,并为函数指针变量加载对应应用态接口函数的符号。

步骤420,根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

步骤422,获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出应用接口函数文件。

步骤424,获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出内核接口函数文件;

在本发明实施例中,步骤412、414、422可以只在SYS Makefile中执行。步骤416、418、424可以只在Dll Makefile中执行。

优选的,在步骤310和步骤320之前还包括:

步骤A11,通过应用态程序接口选择文件和/或、标准输入输出调试方式、和/或调试输出调试方式;所述应用态程序除错接口模拟内核态程序除错接口。

对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。

在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实 施方式。

在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。

类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。

本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。

此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。

本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员 应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的兼容的接口创建设备中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。

应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

本发明公开了A1、一种兼容的接口创建系统,包括:

内核态接口创建模块、应用态接口创建模块、公用接口库;

内核态接口创建模块,适于在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数;

应用态接口创建模块,适于在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;

公用接口库,适于根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

A2、根据权利要求A1所述的方法,其特征在于,在内核态接口创建模 块和应用态接口创建模块之前还包括:

全局指针定义模块,适于为每对内核态接口函数和应用态接口函数定义同一个全局的函数指针变量。

A3、根据权利要求A1或A2所述的方法,其特征在于,所述内核态接口创建模块包括:

内核实例创建模块,适于创建内核态实例;

内核态初始化模块,适于在内核态实例中,获取所述函数指针变量,并为函数指针变量加载对应内核态接口函数的符号。

A4、根据权利要求A1或A2所述的方法,其特征在于,所述应用态接口创建模块包括:

应用实例创建模块,适于创建应用态实例;

应用态初始化模块,适于在应用态实例中,获取所述函数指针变量,并为函数指针变量加载对应应用态接口函数的符号。

A5、根据权利要求A1所述的方法,其特征在于,内核态接口创建模块还包括:

内核接口函数导出模块,适于获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出内核接口函数文件;

所述应用态接口创建模块还包括:

应用接口函数导出模块,适于获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出应用接口函数文件。

A6、根据权利要求A1所述的方法,其特征在于,还包括:

应用态程序除错模块,适于通过应用态程序接口选择文件和/或、标准输入输出调试方式、和/或调试输出调试方式;所述应用态程序除错接口模拟内核态程序除错接口。

本发明公开了B7、一种兼容的接口创建方法,包括:

在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数

在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;

根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

B8、根据权利要求B7所述的方法,其特征在于,在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象和在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象之前,还包括:

为每对内核态接口函数和应用态接口函数定义同一个全局的函数指针变量。

B9、根据权利要求B7或B8所述的方法,其特征在于,所述在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象包括:

创建内核态实例;

在内核态实例中,获取所述函数指针变量,并为函数指针变量加载对应内核态接口函数的符号。

B10、根据权利要求B7或B8所述的方法,其特征在于,所述在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象包括:

创建应用态实例;

在应用态实例中,获取所述函数指针变量,并为函数指针变量加载对应应用态接口函数的符号。

B11、根据权利要求B7所述的方法,其特征在于,还包括:

获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出内核接口函数文件;

和获取所述公用接口函数的调用接口,并根据所述公用接口函数的调用接口导出应用接口函数文件。

B12、根据权利要求B7所述的方法,其特征在于,还包括:

通过应用态程序接口选择文件和/或、标准输入输出调试方式、和/或调试输出调试方式;所述应用态程序除错接口模拟内核态程序除错接口。

C13、一种兼容的接口创建设备,包括:

存储器,加载有多条可执行指令;

处理器,执行所述多条可执行指令;所述多条可执行指令包括执行以下步骤的方法:

在内核态实例中,为全局的函数指针变量加载对应内核态接口函数的第一对象;所述函数指针变量针对一对内核态接口函数和应用态接口函数;所述一对内核态接口函数和应用态接口函数具有相同的参数

在应用态实例中,为所述全局的函数指针变量加载对应应用态接口函数的第一对象;

根据所述函数指针变量,为公用接口函数生成调用接口;所述公用接口函数具有所述内核态接口函数和应用态接口函数相同的参数。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1