2个回答
展开全部
API是应用程序接口, 所以在应用级
直接与硬件打交道的是WINDOWS DDK, 设备驱动开发包,
这个开发包处理硬件.
欲了解更详细的细节, 请参考CSDN:
比如:http://dev.csdn.net/article/80266.shtm
VxD API过程
一个VxD提供V86模式和保护模式API过程以允许在一个虚拟机中运行的应用程序和其它软件访问该VxD的特征。如果要使这些可选的过程有效,VxD必须将它们定义为Declare_Virtual_Device宏的参数,如果没有定义,VMM认为该VxD没有API过程。
在一个虚拟机中运行的应用程序或者其它软件通过设置BX寄存器为VxD标识并调用获取设备入口地址功能(INT 2FH 1684H功能)获取特定的虚拟机的API过程的入口地址,VMM返回该地址使得应用程序可以间接调用该API过程。
当一个应用程序调用该入口地址时,VMM保存该应用程序的寄存器并调用VxD相应的API过程,保存当前虚拟机的句柄到BX寄存器中并保存Client_Reg_Struc结构地址到EBP寄存器中。API过程必须检测客户寄存器的值(使用Client_Reg_Struc结构)以判断运行的API调用。
按照常规,大多数API过程使用AH寄存器指定主功能号,使用AL寄存器指定次功能号,其它客户寄存器用于附加参数。API过程通过修改客户寄存器返回值,API过程可以修改EAX、EBX、ECX、EDX、ESI和EDI寄存器。
下面的实例给出了一个实例API过程——VSAMPLED_API_Get_Version:
BeginProc VSAMPLED_API_Get_Version
movzx eax, [ebp.Client_AX] ;取功能号
or eax, eax
jnz Undefined
Get_Version:
mov [ebp.Client_AX], 030AH ;在客户寄存器AX中返回值
and [ebp.Client_Flags], NOT CF_Mask ;清除进位标志
ret
Undefined:
or [ebp.Client_Flags], CF_Mask ;设置进位标志
ret
EndProc VSAMPLED_API_Get_Version
直接与硬件打交道的是WINDOWS DDK, 设备驱动开发包,
这个开发包处理硬件.
欲了解更详细的细节, 请参考CSDN:
比如:http://dev.csdn.net/article/80266.shtm
VxD API过程
一个VxD提供V86模式和保护模式API过程以允许在一个虚拟机中运行的应用程序和其它软件访问该VxD的特征。如果要使这些可选的过程有效,VxD必须将它们定义为Declare_Virtual_Device宏的参数,如果没有定义,VMM认为该VxD没有API过程。
在一个虚拟机中运行的应用程序或者其它软件通过设置BX寄存器为VxD标识并调用获取设备入口地址功能(INT 2FH 1684H功能)获取特定的虚拟机的API过程的入口地址,VMM返回该地址使得应用程序可以间接调用该API过程。
当一个应用程序调用该入口地址时,VMM保存该应用程序的寄存器并调用VxD相应的API过程,保存当前虚拟机的句柄到BX寄存器中并保存Client_Reg_Struc结构地址到EBP寄存器中。API过程必须检测客户寄存器的值(使用Client_Reg_Struc结构)以判断运行的API调用。
按照常规,大多数API过程使用AH寄存器指定主功能号,使用AL寄存器指定次功能号,其它客户寄存器用于附加参数。API过程通过修改客户寄存器返回值,API过程可以修改EAX、EBX、ECX、EDX、ESI和EDI寄存器。
下面的实例给出了一个实例API过程——VSAMPLED_API_Get_Version:
BeginProc VSAMPLED_API_Get_Version
movzx eax, [ebp.Client_AX] ;取功能号
or eax, eax
jnz Undefined
Get_Version:
mov [ebp.Client_AX], 030AH ;在客户寄存器AX中返回值
and [ebp.Client_Flags], NOT CF_Mask ;清除进位标志
ret
Undefined:
or [ebp.Client_Flags], CF_Mask ;设置进位标志
ret
EndProc VSAMPLED_API_Get_Version
展开全部
方式一:
1. 将该 C++ 库 通过 g++ 编译成 .a 文件
2. 然后将该 .a 文件再次封装成一个 gcc 编译的 .a
3. 然后再去我的主程序中调用,报错,其中有相关的 C++ 部分无法引出
方式二:
1. 将该 C++ 库,通过 g++ 编译成 .so 文件
2. 然后将该 .so 再次封装,通过 dlopen, dlsym,dlclose 等封装
3. 然后在主程序中,调用第二次封装的.so,报 dlopen 失败,其中同样报出相关的 C++ 函数名无法定位。
1. 将该 C++ 库 通过 g++ 编译成 .a 文件
2. 然后将该 .a 文件再次封装成一个 gcc 编译的 .a
3. 然后再去我的主程序中调用,报错,其中有相关的 C++ 部分无法引出
方式二:
1. 将该 C++ 库,通过 g++ 编译成 .so 文件
2. 然后将该 .so 再次封装,通过 dlopen, dlsym,dlclose 等封装
3. 然后在主程序中,调用第二次封装的.so,报 dlopen 失败,其中同样报出相关的 C++ 函数名无法定位。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询