📄 process.c
字号:
#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 + -