阅读:1654回复:10
98下怎么由进程句柄得到进程的ID?--看似简单的问题
2000下倒是简单,可是98下好难.想根据陆老大给的98的进程的数据结构,自己查进程里面的句柄表的句柄表,自己由进程表里面的数据得出和MAGIC NUM得出进程的ID,可是问题是,98下的句柄表竟然没有给定的句柄的项,例如进程的HANDLE的值是0X00000008,按说应该是在
HANDLE_TABLE结构的是HANDLE_TABLE_ENTRY 的第八项,结构如下 typedef struct _HANDLE_TABLE_ENTRY { DWORD flags; // Valid flags depend on what type of object this is PVOID pObject; // Pointer to the object that the handle refers to } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY; typedef struct _HANDLE_TABLE { DWORD cEntries; // Max number of handles in table HANDLE_TABLE_ENTRY array[1]; // An array (number is given by cEntries) } HANDLE_TABLE, *PHANDLE_TABLE; 可是在调试中却发现从第二项往后全是空? 为什么? 有人有好的解决办法马?多谢了. |
|
沙发#
发布于:2003-01-05 06:54
9x的process id 和 PROCESS HANDLE 相互之间只是一个 对某一个magic(固定)取异或而已。 手边没有9X,没法告诉你具体得值,自己看一下SOFTICE的 PROC输出很快就可以总结出来的。
|
|
板凳#
发布于:2003-01-05 14:44
PROCESS HANDLE 不是和process id是异或关系, PROCESS HANDLE实际上只是句柄表的索引值,根据这个索引值找出句柄表的对应项,项里面pObject和MAGIC Num异或才是process id,我有这样的源程,但是在98下就不行了,索引值对应的项竟然是空的,百思不得其解.郁闷阿.
|
|
地板#
发布于:2003-01-05 18:31
看来我把问题看错了。
确实process handle只是一个索引。 pProcess和processid是简单的异或关系。具体说me上是7e81408d. 这个值存在固定的[bffbb9dc]里面。 我只是奇怪你的用途。你是在自己的process还是别的process? 是在ring0 还是ring3? 根据要求不同,pProcess的取得方法不同的。 不过,你已经根据[陆老大给的98的进程的数据结构]分析了一定的东西,八成pProcess就在你手里吧。 |
|
地下室#
发布于:2003-01-06 11:20
95下, 8代表第8个入口. 以后的版本. 8代表第2个入口.
|
|
|
5楼#
发布于:2003-01-06 11:29
奇怪了!不知道说的是ring0还是ring3呢?如果是ring3的话!完全可以通过api得到!如果是ring0的话!可是与应用程序进行协作得到这个magic number
|
|
6楼#
发布于:2003-01-06 11:35
95下, 8代表第8个入口. 以后的版本. 8代表第2个入口. 为什么8代表第2个入口,那第一个入口是几?中间有什么转换的规律吗? |
|
7楼#
发布于:2003-01-06 12:30
为什么8代表第2个入口,那第一个入口是几?中间有什么转换的规律吗?
--------------------------------------------------------- 对阿,第九个对应第几个入口呢? |
|
8楼#
发布于:2003-01-06 13:24
刚才测试了一下,果然0X00000008对应的是句柄表的第二项,陆老大能把转化公式给以下马?
|
|
9楼#
发布于:2003-01-06 15:40
刚才测试了一下,果然0X00000008对应的是句柄表的第二项,陆老大能把转化公式给以下马? 你不已经得到了吗?在98下: typedef struct _HANDLE_TABLE { DWORD cEntries; // Max number of handles in table HANDLE_TABLE_ENTRY array[1]; // An array (number is given by cEntries) } HANDLE_TABLE, *PHANDLE_TABLE; 如果handle的值是i(必为4的整倍数),则 pObject=table.array[i/4].pObject; |
|
10楼#
发布于:2003-01-07 16:55
谢谢kernel_kernel,lu0,zdhe等热情的帮忙, 在lu0讲完之后,调试的时候我也猜可能句柄值要除以4,因为98及以后句柄都是按4的倍数分配的.问题已经完满解决,谢谢大家的帮忙.
|
|