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

📄 process.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:
    else 
		lpv = 0;
    return lpv;

#else
	return lpv;
#endif
}

// ********************************************************************
//声明:LPVOID WINAPI KL_UnMapPtr( LPVOID lpv ) 
//参数:
//	IN lpv - 之前被映射的指针
//返回值:
//	假如成功,返回无映射的指针;否则,返回NULL
//功能描述:
//	与KL_MapPtrToProcess对应, 将之前被映射指针还原
//引用:
//	系统API
// ********************************************************************

LPVOID WINAPI KL_UnMapPtr( LPVOID lpv )
{
	return UnMapProcessPtr( lpv );
}

// ********************************************************************
//声明: HANDLE WINAPI KL_GetCurrentProcess( void )
//参数:
//	无
//返回值:
//	返回当前进程的别名
//功能描述:
//	得到当前进程句柄
//引用:
//	系统API
// ********************************************************************

HANDLE WINAPI KL_GetCurrentProcess( void )
{
	//return GetAPICallerProcessPtr()->hProcess;//2003-05-22, DEL
	return CURRENT_PROCESS_HANDLE;//2003-05-22, ADD
}

// ********************************************************************
//声明:HANDLE WINAPI KL_GetOwnerProcess( void ) 
//参数:
//	无
//返回值:
//	假如成功,返回当前线程的拥有者进程(创建该线程的进程)
//功能描述:
//	得到当前线程的拥有者进程(创建该线程的进程)
//引用:
//  系统API
// ********************************************************************

HANDLE WINAPI KL_GetOwnerProcess( void )
{
    return lpCurThread->lpOwnerProcess->hProcess;//
}

// ********************************************************************
//声明: LPPROCESS GetHandleOwner( void )
//参数:
//	无
//返回值:
//	拥有者进程结构指针
//功能描述:
//	得到句柄的拥有者
//引用:
//  句柄管理器(hmgr.c)
// ********************************************************************
LPPROCESS GetHandleOwner( void )
{
    CALLSTACK * lpcs = lpCurThread->lpCallStack;	
	while( lpcs && (lpcs->dwCallInfo & CALL_KERNEL) )
		lpcs = lpcs->lpNext;
	return lpcs ? (LPPROCESS)lpcs->lpvData : NULL;
}


// ********************************************************************
//声明:BOOL SwitchToProcess( LPPROCESS lpProcess, LPCALLSTACK lpcs )
//参数:
//	IN  lpProcess - 进程结构指针
//	OUT lpcs - 用于保存调用上下文的CALLSTACK结构, 可以为NULL
//返回值:
//	假如成功,返回TRUE;否则,返回FALSE
//功能描述:
//	切换到新的进程空间
//引用:
//	进行API调用时会用到该函数,当用户调用API时,首先会切换到API服务进程空间,
//	当API执行完后,将会恢复到用户空间
// ********************************************************************

BOOL SwitchToProcess( LPPROCESS lpProcess, LPCALLSTACK lpcs )
{
	UINT uiSave;
	BOOL bRetv = FALSE;
	
	//ASSERT( lpProcess );

	if( lpProcess == &InitKernelProcess )
	{   // 切换到内核
		if( lpcs )
		{
			LockIRQSave( &uiSave );
			
			lpcs->lpvData = lpCurThread->lpCurProcess;
			lpcs->lpNext = lpCurThread->lpCallStack;
			lpcs->dwCallInfo = CALL_KERNEL;
			AccessKey_Set( &lpcs->akyAccessKey, lpCurThread->akyAccessKey );
			lpCurThread->lpCallStack = lpcs;			
			
			UnlockIRQRestore( &uiSave );
		}
		
		bRetv = TRUE;
	}
	else
	{	// 切换到进程
		{   
			BOOL bSwitchContext;
//			ASSERT( lpCurThread->lpCurProcess  );
	
			// 如果新的进程与线程的当前进程不同,则需要切换进程空间
			if( lpProcess != lpCurThread->lpCurProcess )
				bSwitchContext = TRUE;
			else
				bSwitchContext = FALSE;

			LockIRQSave( &uiSave );

			if( lpcs )
			{				
				// 设置CALLSTACK结构
				lpcs->dwCallInfo = 0;
				lpcs->lpvData = lpCurThread->lpCurProcess;
				AccessKey_Set( &lpcs->akyAccessKey, lpCurThread->akyAccessKey );

				// 保存调用链
				lpcs->lpNext = lpCurThread->lpCallStack;		
				lpCurThread->lpCallStack = lpcs;
			}

			if( bSwitchContext )
			{	//装入当前进程的MMU有关数据,无效CACHE。。。
				AccessKey_Add( &lpCurThread->akyAccessKey, lpProcess->akyAccessKey );
			    GetMMUContext( lpCurThread, 1, lpProcess );
            }
	        
			UnlockIRQRestore( &uiSave );

			bRetv = TRUE;
		}
	}
	return bRetv;
}

// ********************************************************************
//声明:BOOL SwitchToProcessByHandle( LPPROCESS lpProcess, LPCALLSTACK lpcs )
//参数:
//	IN  lpProcess - 进程结构指针
//	OUT lpcs - 用于保存调用上下文的CALLSTACK结构, 可以为NULL
//返回值:
//	假如成功,返回TRUE;否则,返回FALSE
//功能描述:
//	切换到新的进程空间
//引用:
//	进行API调用时会用到该函数,当用户调用API时,首先会切换到API服务进程空间,
//	当API执行完后,将会恢复到用户空间
// ********************************************************************

BOOL SwitchToProcessByHandle( HANDLE hProcess, LPCALLSTACK lpcs )
{
	LPPROCESS lpProcess = HandleToPtr( hProcess, OBJ_PROCESS );
	if( lpProcess )
	{
		return SwitchToProcess( lpProcess, lpcs );
	}
	return FALSE;
}



// ********************************************************************
//声明: void SwitchBackProcess( void )
//参数:
//	无
//返回值:
//	无
//功能描述:
//	与SwitchToProcess相对应,切换回调用者进程
//引用:
//	进行API调用时会用到该函数,当用户调用AP时,首先会切换到API服务进程空间,
//	当API执行完后,将会恢复到用户空间
// ********************************************************************

void SwitchBackProcess( void )
{
	LPPROCESS lpProcess;
	UINT uiSave;
	BOOL bSwitchContext;
	ACCESS_KEY aky;


//	ASSERT(lpCurThread->lpCallStack);

	LockIRQSave( &uiSave );

	lpProcess = (LPPROCESS)lpCurThread->lpCallStack->lpvData;
	aky = lpCurThread->lpCallStack->akyAccessKey;
	// 如果新的进程与线程的当前进程不同,则需要切换进程空间
	//ASSERT( lpProcess != &InitKernelProcess );
	if( 
		( lpProcess != lpCurThread->lpCurProcess || 
		  aky != lpCurThread->akyAccessKey ) )
		bSwitchContext = TRUE;
	else
		bSwitchContext = FALSE;
	// 清除调用链
    lpCurThread->lpCallStack = lpCurThread->lpCallStack->lpNext;

	if( bSwitchContext )
	{	//装入当前进程的MMU有关数据,无效CACHE。。。
		AccessKey_Set( &lpCurThread->akyAccessKey, aky );
		GetMMUContext( lpCurThread, 2, lpProcess );
	}

	UnlockIRQRestore( &uiSave );

}

// ********************************************************************
//声明:HANDLE WINAPI KL_GetCallerProcess( void ) 
//参数:
//	无 
//返回值:
//	返回API调用者的进程句柄;如果没有,返回NULL
//功能描述:
//	得到API调用者的进程句柄
//引用:
//	系统API
// ********************************************************************

// ap->server->kernel->getcaller
// ap->kernel->other->getcaller

HANDLE WINAPI KL_GetCallerProcess( void )
{
	LPPROCESS lpProcess = GetHandleOwner();
	if( lpProcess )
		return lpProcess->hProcess;
	return NULL;
}

// ********************************************************************
//声明:LPTSTR WINAPI KL_GetCommandLine(VOID) 
//参数:
//	无
//返回值:
//	假如成功,返回有效的指针;否则,返回NULL
//功能描述:
//	得到命令行参数
//引用:
//	系统API
// ********************************************************************
#define DEBUG_GET_COMMAND_LINE 0
LPTSTR WINAPI KL_GetCommandLine(VOID)
{
	//LOCK_SCHE();
	DEBUGMSG( DEBUG_GET_COMMAND_LINE,( "KL_GetCommandLine:0x%x,%s.\r\n", lpCurThread->lpCurProcess->lpszCommandLine, lpCurThread->lpCurProcess->lpszCommandLine ) );
	//UNLOCK_SCHE();
	return (LPTSTR)lpCurThread->lpCurProcess->lpszCommandLine;
}

// ********************************************************************
//声明:LPVOID WINAPI KL_GetProcessUserData( VOID ) 
//参数:
//	无
//返回值:
//	返回之前用KL_SetProcessUserData设置的值
//功能描述:
//	返回当前进程之前用KL_SetProcessUserData设置的值
//引用:
//	系统API
// ********************************************************************

LPVOID WINAPI KL_GetProcessUserData( VOID )
{
	return lpCurThread->lpCurProcess->lpUserData;
}

// ********************************************************************
//声明:LPVOID WINAPI KL_SetProcessUserData( LPVOID lpvData ) 
//参数:
//	IN lpvData - 需要设置的用户值
//返回值:
//	返回之前设置的值
//功能描述:
//	设置进程用户数据
//引用:
//	系统API
// ********************************************************************

LPVOID WINAPI KL_SetProcessUserData( LPVOID lpvData )
{
	LPVOID lpvRetv = lpCurThread->lpCurProcess->lpUserData;
	lpCurThread->lpCurProcess->lpUserData = lpvData;
	return lpvRetv;
}


// ********************************************************************
//声明:HANDLE WINAPI KL_OpenProcess( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId )
//参数:
//	IN dwDesiredAccess - 存取权限(不支持,必须为0)
//	IN bInheritHandle - 继承标志(不支持,必须为FALSE)
//	IN dwProcessId - 进程ID
//返回值:
//	假如成功,返回进程的句柄;失败,返回NULL
//功能描述:
//	通过进程ID得到进程句柄
//引用:
//	系统API
// ********************************************************************

HANDLE WINAPI KL_OpenProcess( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId )
{
	if( dwProcessId < MAX_PROCESSES && dwProcessId > 0 )
	{
		LPPROCESS lpProcess;
		UINT uiSave;

		LockIRQSave( &uiSave );
		lpProcess = lppProcessPtr[dwProcessId] ? lppProcessPtr[dwProcessId] : NULL;
		if( lpProcess )
		{
			Handle_AddRef( lpProcess->hProcess );
		}
		UnlockIRQRestore( &uiSave );
		if( lpProcess )
			return lpProcess->hProcess;
	}
	return NULL;
}


// ********************************************************************
//声明:DWORD WINAPI KL_GetProcessId( HANDLE hProcess )
//参数:
//	IN hProcess - 进程句柄
//返回值:
//	假如成功,返回进程的ID;失败,返回 0xffffffff
//功能描述:
//	通过进程句柄的得到进程ID
//引用:
//	系统API
// ********************************************************************

#define DEBUG_KL_GetProcessId 0
DWORD WINAPI KL_GetProcessId( HANDLE hProcess )
{
    LPPROCESS lpProcess = HandleToPtr( hProcess, OBJ_PROCESS );
    DEBUGMSG( DEBUG_KL_GetProcessId, ( "KL_GetProcessId: hProcess=0x%x entry.\r\n",hProcess ) );
    if( lpProcess ) 
	{
		return lpProcess->dwProcessId;
    }
	else
	{
		return 0xffffffff;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -