⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apisrv.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************
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 + -