进程管理器:给定一个id,给你一个对象
作者:陆麟
转载请征得作者同意.
2001.6.14
进程管理器能够管理的对象是进程数据库和线程数据库. 在KERNEL MODE的体现就是EPROCESS和ETHREAD.
EPROCESS和ETHREAD是线程切换, 进程CONTEXT切换所需要的核心数据结构, 如此至关重要的数据结构,
当然隐藏有UNDOCUMENTED ROUTINES提供操纵接口.
WINDOWS 2000的进程管理器为微软内部提供了助手函数, 当需要锁定一个进程管理器的对象时之需要提供它的ID就可.
线程有线程ID, 进程有进程ID. 这就是通向宝库的钥匙.
当需要锁定一个进程时, 进程管理器提供了函数PsLookupProcessByProcessId.
先看一下这个函数的原型:
NTSTATUS
__stdcall
PsLookupProcessByProcessId(
IN
DWORD pid, //Process ID
OUT PEPROCESS
*ppEprocess //pointer to PEPROCESS
);
当函数返回0时, *ppEprocess里有返回了EPROCESS结构的指针.
当需要锁定一个线程时,进程管理器提供了如下函数:
NTSTATUS
__stdcall
PsLookupThreadByThreadId(
DWORD tid, //Thread ID
PETHEREAD *ppEthread //pointer
to PETHREAD
);
当函数返回0时, *ppEthread里有返回了ETHEREAD结构的指针.
当我们需要特定进程里特定线程的线程数据库时下面的函数又可以提供帮助:
NTSTATUS
__stdcall
PsLookupProcessThreadByCid(
PCLIENT_ID cid, //CLIENT
ID.
DWORD
dwUnknow, //Always set to 0
PETHREAD *ppEthread
//pointer to PETHREAD
);
当函数返回0时, *ppEthread里有返回了ETHEREAD结构的指针.
今天就讲到这里. 现在外面公开的东西越来越多, 要写点别人没公开的东西还真有点难.
还需努力啊. :)