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