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

📄 process.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:
#else  
		//dwProcessSlots[lpProcess->dwProcessId] = NULL; //2004-09-21,lilin 没必要		
#endif  //VIRTUAL_MEM

        

		
		if( (lpProcess->lpCpuPTS = AllocCPUPTS()) == NULL )
			goto _alloc_error;


		DEBUGMSG( DEBUG_DOCREATEPROCESS, ( "DoCreateProcess:call Module_Init.\r\n" ) );

		
		// 分配模块加载器结构
		if( (lpProcess->pModule = Module_Init( lpProcess, lpszApplicationName, pmd, CREATE_EXE )) == NULL )	
			goto _alloc_error;
		//
		
		// 初始化其他进程数据
		lpProcess->objType = OBJ_PROCESS;
		lpProcess->dwtlsMask = TLS_MASK;
#ifdef VIRTUAL_MEM
		lpProcess->dwVirtualAddressBase = lpProcess->lpProcessSegments->dwSegBaseAddress;
#else
		lpProcess->dwVirtualAddressBase = 0;
#endif

		//
		lpProcess->akyAccessKey = (0x1 << lpProcess->dwProcessId);
		lpProcess->lpszApplicationName = pmd->lpGetModuleFileName( lpProcess->pModule->hModuleData );//pModule->lpszApName;//LN:2003-05-07, Add
		
		lpProcess->dwFlags = (dwCreationFlags & CREATE_SYSTEM_MODE) ? M_SYSTEM : M_USER;
		RETAILMSG( DEBUG_DOCREATEPROCESS, ( "DoCreateProcess: lpProcess->dwFlags=0x%x.\r\n", lpProcess->dwFlags ) );
		akySave = lpCurThread->akyAccessKey;
		AccessKey_Add( &lpCurThread->akyAccessKey, lpProcess->akyAccessKey );
		// 创建主线程并挂起它
		lpProcess->lpMainThread = _CreateThread( lpProcess, 
			                                     lpThreadAttributes, 
												 0, //必须用0(默认),因为主线程的stack在64k-128k
												 iCmdLineLen,
												 MainProcessProc, 
												 lpProcess, 
												 dwCreationFlags | CREATE_SUSPENDED | CREATE_MAINTHREAD, 
												 NULL );
		// 
		DEBUGMSG( DEBUG_DOCREATEPROCESS, (TEXT("DoCreateProcess:lpMainThread=%x.\r\n"), lpProcess->lpMainThread ) );

		if( lpProcess->lpMainThread  )
		{
			// 命令行参数放到用户栈里
			lpProcess->lpszCommandLine = (LPTSTR)lpProcess->lpMainThread->lpdwThreadStack + lpProcess->lpMainThread->dwThreadStackSize - iCmdLineLen;
			strcpy( (char*)lpProcess->lpszCommandLine, (char*)lpszApplicationName );
			if( *lpszCommandLine )
			{
			    strcat( (char*)lpProcess->lpszCommandLine, " " );
			    strcat( (char*)lpProcess->lpszCommandLine, (char*)lpszCommandLine );
			}
			lppProcessPtr[lpProcess->dwProcessId] = lpProcess;
			DEBUGMSG( DEBUG_DOCREATEPROCESS, ( "DoCreateProcess:check suspend.\r\n" ) );
			// 唤醒主线程
			if( (dwCreationFlags & CREATE_SUSPENDED) == 0 )
			    //_WakeupThread( lpProcess->lpMainThread, FALSE );
				DoResumeThread(lpProcess->lpMainThread);

			DEBUGMSG( DEBUG_DOCREATEPROCESS, ( "DoCreateProcess:set lpProcessInformation.\r\n" ) );
			// 假如可能,设置进程信息结构
			if( lpProcessInformation )
			{
				lpProcessInformation->hProcess = lpProcess->hProcess;
				lpProcessInformation->hThread = lpProcess->lpMainThread->hThread;
				lpProcessInformation->dwProcessId = lpProcess->dwProcessId;
				lpProcessInformation->dwThreadId = lpProcess->lpMainThread->dwThreadId;
			}
			AccessKey_Set( &lpCurThread->akyAccessKey, akySave );
			
	        goto _ret;
		}
		else
		{
			RETAILMSG( 1, ( "error: KL_CreateProcess: Create Main Thread failure!!!!.\r\n" ) );
		}
		AccessKey_Set( &lpCurThread->akyAccessKey, akySave );
	}
_alloc_error:
    RETAILMSG( 1, ( "error : KL_CreateProcess failure:%s.\r\n", lpszApplicationName ) );
	// 处理错误
    if( lpProcess )
    {
		FreeProcessObject( lpProcess );
	}
	return FALSE;
_ret:
    return lpProcess ? TRUE : FALSE;
}

// ********************************************************************
//声明:BOOL WINAPI KL_CreateProcess(
//						   LPCTSTR lpszApplicationName,                 // name of executable module
//						   LPCTSTR lpszCommandLine,                      // command line string
//						   LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
//						   LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD
//						   BOOL bInheritHandles,                      // handle inheritance option
//						   DWORD dwCreationFlags,                     // creation flags
//						   LPVOID lpEnvironment,                      // new environment block
//						   LPCTSTR lpCurrentDirectory,                // current directory name
//						   LPSTARTUPINFO lpStartupInfo,               // startup information
//						   LPPROCESS_INFORMATION lpProcessInformation // process information
//						   )
 
//参数:
//	   IN lpszApplicationName - 可执行模块名
//	   IN lpszCommandLine - 传给WinMain的参数
//	   IN lpProcessAttributes - 进程安全属性
//	   IN lpThreadAttributes - 线程安全属性
//	   IN bInheritHandles - 是否继承父进程的句柄,必须为FALSE
//	   IN dwCreationFlags - 创建标志:
//							CREATE_SUSPENDED - 创建后挂起
//	   IN lpEnvironment - 环境块(必须为NULL)
//	   IN lpCurrentDirectory - 进程运行的当前目录(必须为NULL)
//	   IN lpStartupInfo - 启动信息(必须为NULL)
//	   OUT lpProcessInformation - PROCESS_INFORMATION结构指针(可以为NULL),用于接受进程的某些信息
//返回值:
//	假如成功,返回TRUE,如果lpProcessInformation不为NULL,回返回进程信息;
//  否则,返回FALSE。
//功能描述:
//	创建新的进程
//引用:
//	系统调用
// ********************************************************************

BOOL WINAPI KL_CreateProcess(
						   LPCTSTR lpszApplicationName, 
						   LPCTSTR lpszCommandLine,
						   LPSECURITY_ATTRIBUTES lpProcessAttributes,
						   LPSECURITY_ATTRIBUTES lpThreadAttributes,
						   BOOL bInheritHandles,
						   DWORD dwCreationFlags,
						   LPVOID lpEnvironment,
						   LPCTSTR lpCurrentDirectory,
						   LPSTARTUPINFO lpStartupInfo,
						   LPPROCESS_INFORMATION lpProcessInformation
						   )
{
#ifndef INLINE_PROGRAM
	// future , i will find module format.
	//
	extern MODULE_DRV ElfModule;
	return DoCreateProcess( lpszApplicationName, 
		                    lpszCommandLine, 
							lpProcessAttributes, 
							lpThreadAttributes, 
							bInheritHandles,
							dwCreationFlags,
							lpEnvironment,
							lpCurrentDirectory,
							lpStartupInfo,
							lpProcessInformation,
							&ElfModule );
#endif
	return FALSE;

}


// ********************************************************************
//声明: BOOL FASTCALL Process_Close( HANDLE hProcess )
//参数:
//	IN hProcess - 进程句柄
//返回值:
//	假如成功,返回TRUE;否则,返回FALSE
//功能描述:
//	释放进程句柄
//引用:
//	CloseHandle
// ********************************************************************

BOOL FASTCALL Process_Close( HANDLE hProcess )
{
	LPPROCESS lpProcess = HandleToPtr( hProcess, OBJ_PROCESS );
	lpProcess->hProcess = NULL;
	return TRUE;
}

// ********************************************************************
//声明: VOID WINAPI KL_ExitProcess( UINT uExitCode )
//参数:
//	IN uExitCode - 退出代码
//返回值:
//	无
//功能描述:
//	退出进程
//引用:
//	系统API
// ********************************************************************
extern void KillAllChildThreads( LPPROCESS );
#define DEBUG_EXITPROCESS 0
VOID WINAPI KL_ExitProcess(
						 UINT uExitCode   // exit code for all threads
						 )
{
    extern void KillAllOtherThreads( LPPROCESS lpProcess );
	LPPROCESS lpProcess;
    
	ASSERT( lpCurThread->lpCurProcess == lpCurThread->lpOwnerProcess );//
	// 得到当前进程,current process
	lpProcess = lpCurThread->lpCurProcess;//GetAPICallerProcessPtr();
	DEBUGMSG( DEBUG_EXITPROCESS, ( "KL_ExitProcess:Exit Process(=%s) entry.\r\n", lpProcess->lpszApplicationName ) );

#if 0	// test
	{
		LPCALLSTACK lpcs = lpCurThread->lpCallStack;
		while( lpcs )
		{
			CALLSTACK * lpNext = lpcs->lpNext;
			
			RETAILMSG( 1, ( "lpcs:(0x%x).\r\n", lpcs ) );
			lpcs = lpNext;
		}
	}
#endif
	//
	// 将退出信息保存到进程句柄里
	SetHandleUserInfo( lpProcess->hProcess, uExitCode );
	lpCurThread->dwExitCode = uExitCode; 
	// 
	DEBUGMSG( DEBUG_EXITPROCESS, ( "KL_ExitProcess:KillAllChildThreads.\r\n" ) );
	while( 1 )
	{	//判断是否有更多的子线程
		// 将该进程拥有的其它线程杀死
		KillAllOtherThreads( lpProcess );
		if( lpProcess->lpFirstThread->lpNextThreadInProcess == NULL )
			HandleThreadExit();
		else
			KL_Sleep( 3000 );
		WARNMSG( DEBUG_EXITPROCESS, ( "KL_ExitProcess:wait for child thread exit,ProcName=%s.\r\n", lpProcess->lpszApplicationName ) );
		//ASSERT( 0 );
	}
    //  not return here
}

// ********************************************************************
//声明: VOID WINAPI KL_ExitProcess( UINT uExitCode )
//参数:
//	IN uExitCode - 退出代码
//返回值:
//	无
//功能描述:
//	退出进程
//引用:
//	系统API
// ********************************************************************
extern void KillAllChildThreads( LPPROCESS );
#define DEBUG_EXITPROCESS 1
VOID WINAPI KL_TerminateProcess(
						 HANDLE hProcess,
						 UINT uExitCode   // exit code for all threads
						 )
{
    extern void KillAllOtherThreads( LPPROCESS lpProcess );
	LPPROCESS lpProcess;
    
	if( hProcess == CURRENT_PROCESS_HANDLE )
		hProcess = lpCurThread->lpCurProcess->hProcess;

	lpProcess = HandleToPtr( hProcess, OBJ_PROCESS );
	if( lpProcess )
	{
		if( lpCurThread->lpCurProcess == lpProcess  )
		{
			KL_ExitProcess(uExitCode);
		}
		else
		{
			KL_TerminateThread( lpProcess->lpMainThread->hThread, uExitCode );
		}
	}
    //  not return here
}


// ********************************************************************
//声明: HANDLE WINAPI KL_GetProcessHeap( void )
//参数:
//	无
//返回值:
//	假如成功,返回进程的默认堆句柄;否则,返回NULL
//功能描述:
//	返回进程的默认堆
//引用:
//	系统API
// ********************************************************************

HANDLE WINAPI KL_GetProcessHeap( void )
{
	LPPROCESS lpProcess;
	lpProcess = GetAPICallerProcessPtr();
	if( lpProcess )
		return lpProcess->lpHeap;
	else
		return NULL;
}

// ********************************************************************
//声明:DWORD WINAPI KL_GetCurrentProcessId( void ) 
//参数:
//	无
//返回值:
//	返回进程id
//功能描述:
//	得到当前的进程id
//引用:
//	系统API
// ********************************************************************

DWORD WINAPI KL_GetCurrentProcessId( void )
{
	return GetAPICallerProcessPtr()->dwProcessId;
	
}

// ********************************************************************
//声明:BOOL WINAPI KL_GetExitCodeProcess( HANDLE hProcess, LPDWORD lpdwExitCode ) 
//参数:
//	IN hProcess - 进程句柄
//	OUT lpdwExitCode - 用于接受进程退出代码
//返回值:
//	假如成功,返回TRUE,lpdwExitCode保存退出代码;否则,返回FALSE
//功能描述:
//	得到当前进程的退出代码
//引用:
//	系统API
// ********************************************************************

BOOL WINAPI KL_GetExitCodeProcess( HANDLE hProcess, LPDWORD lpdwExitCode )
{
	LPPROCESS lpProcess;
	if( hProcess == CURRENT_PROCESS_HANDLE )//2003-05-22, ADD
	{
		*lpdwExitCode = STILL_ACTIVE;
		return TRUE;
	}
	lpProcess = HandleToPtr( hProcess, OBJ_PROCESS );
	if( lpProcess )
	{
		*lpdwExitCode = STILL_ACTIVE;
		return TRUE;
	}
	else
	{	// 进程已死
	    return GetHandleUserInfo( hProcess, lpdwExitCode );
	}
}

// ********************************************************************
//声明: LPVOID WINAPI KL_MapPtrToProcess( LPVOID lpv, HANDLE hProcess )
//参数:
//	IN lpv - 需要映射的指针
//	IN hProcess - 指针指向的地址所属的进程的句柄
//返回值:
//	假如成功,返回映射后的指针;否则,返回NULL
//功能描述:
//	映射进程的指针,使得该指针能被其他进程访问
//引用:
// ********************************************************************

LPVOID WINAPI KL_MapPtrToProcess( LPVOID lpv, HANDLE hProcess )
{
#ifdef VIRTUAL_MEM
	LPPROCESS lpProcess;

	if( hProcess == CURRENT_PROCESS_HANDLE )
		lpProcess = lpCurThread->lpCurProcess;
	else
		lpProcess = (LPPROCESS)HandleToPtr( hProcess, OBJ_PROCESS );
	// 映射指针
    if( lpProcess )
		lpv = MapProcessPtr( lpv, lpProcess );

⌨️ 快捷键说明

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