📄 apisrv.c
字号:
/******************************************************
Copyright(c) 版权所有,1998-2005微逻辑。保留所有权利。
******************************************************/
/*****************************************************
文件说明:本地过程调用(LPC)管理
版本号:2.0.0
开发时期:2000
作者:李林
修改记录:
2005-01-18, 增加 KC_EnterAPI and KC_EnterAPIHandle
2004-12-20, 增加 ackAccessKey 功能
2003-10-07, LN, 直接Call _EnterAPI
2003-07-12, LN, 将KL_EnterAPI & KL_EnterAPIHandle 改为Call _EnterAPI
2003-07-01, LN ,KL_EnterAPIHandle & KL_EnterAPI
不能访问 *apiInfo[uiAPIId].lpfn
******************************************************/
#include <eframe.h>
#include <eapisrv.h>
#include <eucore.h>
#include <epcore.h>
#include <epalloc.h>
#include <eobjcall.h>
#include <coresrv.h>
#include <sysintr.h>
// 定义API服务的API
static const PFNVOID lpAPIAPI[] = {
NULL,
(PFNVOID)KL_RegisterAPI,
(PFNVOID)KL_UnregisterAPI,
#ifdef CALL_TRAP
NULL,
NULL,
NULL,
#else
(PFNVOID)KL_EnterAPI,
(PFNVOID)KL_EnterAPIHandle,
(PFNVOID)KL_LeaveAPI,
#endif
(PFNVOID)KL_RegisterAPIEx,
(PFNVOID)KL_IsAPIReady,
(PFNVOID)KL_SetAPIReady
};
static const DWORD dwWndArgs[] = {
NULL,
ARG3_MAKE( DWORD, PTR, DWORD ),//KL_RegisterAPI
ARG1_MAKE( DWORD ),//KL_UnregisterAPI
ARG4_MAKE( DWORD, DWORD, PTR, PTR ),//KL_EnterAPI
ARG5_MAKE( DWORD, DWORD, PTR, PTR, PTR ),//KL_EnterAPIHandle
ARG0_MAKE(),//KL_LeaveAPI
ARG4_MAKE( DWORD, PTR, PTR, DWORD ),//KL_RegisterAPIEx
ARG1_MAKE( DWORD ),//KL_IsAPIReady
ARG1_MAKE( DWORD ),//KL_SetAPIReady
};
// 定义系统最大的api集
APIINFO apiInfo[MAX_API] = { {lpAPIAPI,dwWndArgs,sizeof(lpAPIAPI)/sizeof(PFNVOID),&InitKernelProcess}, };
BYTE bAPISetState[MAX_API] = { 1, };
// ********************************************************************
//声明:BOOL _InitAPIMgr( void )
//参数:无
//返回值:假如成功,返回TURE;否则,返回FALSE
//功能描述:API管理模块初始化
//引用: 由InitialKingmosSystem调用(system.c)
// ********************************************************************
BOOL _InitAPIMgr( void )
{
memset( bAPISetState, 0, sizeof( bAPISetState ) );
return TRUE;
}
// ********************************************************************
//声明:HANDLE DoRegisterAPI( UINT uiAPIId, PFNVOID lpfn, const DWORD * lpArgs, UINT uiOptions )
//参数:
// IN uiAPIId -服务ID
// IN lpfn -指向服务函数集的指针
// IN lpArgs -指向服务函数集的参数信息指针
// IN uiOptions -函数数
//返回值:假如成功,返回有效的句柄值,负责返回NULL
//功能描述:注册服务集
//引用: KL_RegisterAPI & KL_RegisterAPIEx
// ********************************************************************
static HANDLE DoRegisterAPI( UINT uiAPIId, const PFNVOID * lpfn, const DWORD * lpArgs, UINT uiOptions )
{
if( uiAPIId < MAX_API && lpfn )
{
lpfn = (const PFNVOID *)MapProcessPtr( lpfn, GetAPICallerProcessPtr() );
lpArgs = (const DWORD *)MapProcessPtr( lpArgs, GetAPICallerProcessPtr() );
if( KL_InterlockedCompareExchange( (LPLONG)&apiInfo[uiAPIId].lpfn, (LONG)lpfn, 0 ) == 0 )
{
apiInfo[uiAPIId].lpArgs = lpArgs;
apiInfo[uiAPIId].lpProcess = GetAPICallerProcessPtr();//lpCurThread->lpCurProcess;
apiInfo[uiAPIId].uiMaxOption = uiOptions;
apiInfo[uiAPIId].hServer = (HANDLE)uiAPIId;
apiInfo[uiAPIId].lpServerCtrlInfo = (LPSERVER_CTRL_INFO)(*lpfn);
if( apiInfo[uiAPIId].lpServerCtrlInfo )
apiInfo[uiAPIId].dwServerInfo = apiInfo[uiAPIId].lpServerCtrlInfo->dwInfo;
return (HANDLE)uiAPIId;//&apiInfo[uiAPIId];
}
}
return NULL;
}
// ********************************************************************
//声明:HANDLE WINAPI KL_RegisterAPI( UINT uiAPIId, PFNVOID lpfn, UINT uiOptions )
//参数:
// IN uiAPIId -服务ID
// IN lpfn -指向服务函数集的指针
// IN uiOptions -函数数
//返回值:假如成功,返回有效的句柄值,负责返回NULL
//功能描述:注册服务集
// ********************************************************************
HANDLE WINAPI KL_RegisterAPI( UINT uiAPIId, const PFNVOID * lpfn, UINT uiOptions )
{
return DoRegisterAPI( uiAPIId, lpfn, 0, uiOptions );
}
// ********************************************************************
//声明:HANDLE WINAPI KL_RegisterAPIEx( UINT uiAPIId, PFNVOID lpfn, const DWORD * lpArgs, UINT uiOptions )
//参数:
// IN uiAPIId -服务ID
// IN lpfn -指向服务函数集的指针
// IN lpArgs -指向服务函数集的参数信息指针
// IN uiOptions -函数数
//返回值:假如成功,返回有效的句柄值,负责返回NULL
//功能描述:注册服务集
// ********************************************************************
HANDLE WINAPI KL_RegisterAPIEx( UINT uiAPIId, const PFNVOID * lpfn, const DWORD * lpArgs, UINT uiOptions )
{
return DoRegisterAPI( uiAPIId, lpfn, lpArgs, uiOptions );
}
// ********************************************************************
//声明:BOOL WINAPI KL_IsAPIReady( UINT uiAPI )
//参数:
// IN uiAPI -服务ID
//返回值:
// 假如成功,返回TRUE;否则,返回FALSE
//功能描述:判断某API服务集是否准备好
//引用: 系统调用
// ********************************************************************
BOOL WINAPI KL_IsAPIReady( UINT uiAPI )
{
if( uiAPI < MAX_API )
return bAPISetState[uiAPI];
return FALSE;
}
// ********************************************************************
//声明:BOOL WINAPI KL_SetAPIReady( UINT uiAPI )
//参数:
// IN uiAPI -服务ID
//返回值:
// 假如成功,返回TRUE;否则,返回FALSE
//功能描述:设定某API服务集已准备好,用户可以使用
//引用: 系统调用
// ********************************************************************
BOOL WINAPI KL_SetAPIReady( UINT uiAPI )
{
if( uiAPI < MAX_API )
{
bAPISetState[uiAPI] = 1;
return TRUE;
}
return FALSE;
}
// ********************************************************************
//声明:BOOL WINAPI KL_UnregisterAPI( HANDLE hAPI )
//参数:
// IN hAPI -为调用KL_RegisterAPIEx返回的句柄
//返回值:
// 假如成功,返回TRUE;否则,返回FALSE
//功能描述:注销一个API服务集
//引用: 系统调用
// ********************************************************************
BOOL WINAPI KL_UnregisterAPI( HANDLE hAPI )
{
if( (DWORD)hAPI && (DWORD)hAPI < MAX_API )
{
APIINFO * lpAPI = &apiInfo[(DWORD)hAPI];
if( lpAPI->lpProcess == GetAPICallerProcessPtr() )
{
KL_InterlockedExchange( (LPLONG)&lpAPI->lpfn, 0 );
return TRUE;
}
KL_SetLastError( ERROR_ACCESS_DENIED );
}
return FALSE;
}
// ********************************************************************
//声明:_EnterAPI( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcs )
//参数:
// IN uiAPIId -服务ID
// IN uiOptionId -函数功能ID
// OUT lpfn -用于接受函数调用地址
// OUT lpcs -CALLSTACK结构指针,用于保存调用上下文
//返回值:
// 假如成功,返回TRUE;否则,返回FALSE
//功能描述:该函数执行以下操作:
// 1.判断参数是否有效
// 2.切换到服务进程上下文
// 3.返回某API集对应的函数
//引用: KL_EnterAPIHandle & KL_EnterAPI
// ********************************************************************
static BOOL _EnterAPI( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcs )
{
if( uiAPIId < MAX_API )
{ //判断参数是否有效
if(
uiOptionId &&
uiOptionId < apiInfo[uiAPIId].uiMaxOption )
{
const PFNVOID * lppfn;
lppfn = apiInfo[uiAPIId].lpfn;
if( lppfn ) //&& ( *( (PFNVOID*)lpfn ) = *( lppfn + uiOptionId ) ) )
{ // 切换到服务进程上下文
ACCESS_KEY aky = lpCurThread->akyAccessKey;
LPPROCESS lpProcess = apiInfo[uiAPIId].lpProcess;
//增加 lpCurThread 对 Server Process 空间的存取权限
AccessKey_Add( &lpCurThread->akyAccessKey, lpProcess->akyAccessKey );
*( (PFNVOID*)lpfn ) = *( lppfn + uiOptionId );
AccessKey_Set( &lpCurThread->akyAccessKey, aky ); //恢复
if( *( (PFNVOID*)lpfn ) )
{
if( SwitchToProcess( lpProcess, lpcs ) )
{
return TRUE;
}
else
*( (PFNVOID*)lpfn ) = NULL;
}
}
}
}
KL_SetLastError( ERROR_INVALID_FUNCTION );
return 0;
}
static OutErrorAPIInfo( UINT uiAPIId, UINT uiOptionId )
{
#ifdef INLINE_PROGRAM
{
extern void KL_EdbgOutputDebugString( const char * lpszFormat, ... );
KL_EdbgOutputDebugString( "error: no the api[%d] function[%d].\r\n" , uiAPIId, uiOptionId );
}
#else
RETAILMSG( 1, ( "error: no the api[%d] function[%d].\r\n" , uiAPIId, uiOptionId ) );
#endif
}
// ********************************************************************
//声明:BOOL WINAPI KL_EnterAPIHandle( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcs, HANDLE * lpHandle )
//参数:
// IN uiAPIId -服务ID
// IN uiOptionId -函数功能ID
// OUT lpfn -用于接受函数调用地址
// OUT lpcs -CALLSTACK结构指针,用于保存调用上下文
// OUT lpHandle-句柄指针
//返回值:
// 假如成功,返回TRUE;否则,返回FALSE
//功能描述:
// 调用_EnterAPI并将句柄转化为服务功能需要的数据
//引用: 系统调用
// ********************************************************************
BOOL WINAPI KL_EnterAPIHandle( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcsRet, HANDLE * lpHandle )
{
CALLSTACK * lpcall;
// 分配一个调用stack,用于保存系统调用上下文
lpcall = KHeap_Alloc( sizeof( CALLSTACK ) );
if( lpcall )
{
if( _EnterAPI( uiAPIId, uiOptionId, lpfn, lpcall ) )
{
lpcall->dwCallInfo |= MAKE_OPTIONINFO( uiAPIId, uiOptionId );
*lpcsRet = *lpcall;
lpcall->dwCallInfo |= CALL_ALLOC;
*lpHandle = HandleToPtr( *lpHandle, -1 );
return TRUE;
}
else
{
KHeap_Free( lpcall, sizeof( CALLSTACK ) );
OutErrorAPIInfo( uiAPIId, uiOptionId );
}
}
return FALSE;
}
// ********************************************************************
//声明:BOOL WINAPI KC_EnterAPIHandle( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcs, HANDLE * lpHandle )
//参数:
// IN uiAPIId -服务ID
// IN uiOptionId -函数功能ID
// OUT lpfn -用于接受函数调用地址
// OUT lpcs -CALLSTACK结构指针,用于保存调用上下文
// OUT lpHandle-句柄指针
//返回值:
// 假如成功,返回TRUE;否则,返回FALSE
//功能描述:
// 调用_EnterAPI并将句柄转化为服务功能需要的数据
//引用: 系统调用
// ********************************************************************
BOOL WINAPI KC_EnterAPIHandle( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcsRet, HANDLE * lpHandle )
{
CALLSTACK * lpcall;
// 分配一个调用stack,用于保存系统调用上下文
lpcall = KHeap_Alloc( sizeof( CALLSTACK ) );
if( lpcall )
{
if( _EnterAPI( uiAPIId, uiOptionId, lpfn, lpcall ) )
{
lpcall->dwCallInfo |= MAKE_OPTIONINFO( uiAPIId, uiOptionId );
*lpcsRet = *lpcall;
lpcall->dwCallInfo |= CALL_ALLOC;
*lpHandle = HandleToPtr( *lpHandle, -1 );
return TRUE;
}
else
{
KHeap_Free( lpcall, sizeof( CALLSTACK ) );
}
}
return FALSE;
}
// ********************************************************************
//声明:BOOL WINAPI KL_EnterAPI( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcs )
//参数:
// IN uiAPIId -服务ID
// IN uiOptionId -函数功能ID
// OUT lpfn -用于接受函数调用地址
// OUT lpcs -CALLSTACK结构指针,用于保存调用上下文
//返回值:
// 假如成功,返回TRUE;否则,返回FALSE
//功能描述:
// 调用_EnterAPI
//引用:系统调用
// ********************************************************************
BOOL WINAPI KL_EnterAPI( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcsRet )
{
CALLSTACK * lpcall;
// 分配一个调用stack,用于保存系统调用上下文
lpcall = KHeap_Alloc( sizeof( CALLSTACK ) );
if( lpcall )
{
if( _EnterAPI( uiAPIId, uiOptionId, lpfn, lpcall ) )
{
lpcall->dwCallInfo |= MAKE_OPTIONINFO( uiAPIId, uiOptionId );
*lpcsRet = *lpcall;
lpcall->dwCallInfo |= CALL_ALLOC;
return TRUE;
}
else
{
KHeap_Free( lpcall, sizeof( CALLSTACK ) );
OutErrorAPIInfo( uiAPIId, uiOptionId );
}
}
return FALSE;
}
// ********************************************************************
//声明:BOOL WINAPI KC_EnterAPI( UINT uiAPIId, UINT uiOptionId, VOID * lpfn, CALLSTACK * lpcs )
//参数:
// IN uiAPIId -服务ID
// IN uiOptionId -函数功能ID
// OUT lpfn -用于接受函数调用地址
// OUT lpcs -CALLSTACK结构指针,用于保存调用上下文
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -