standardlover
驱动牛犊
驱动牛犊
  • 注册日期2002-06-09
  • 最后登录2003-02-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1654回复:10

98下怎么由进程句柄得到进程的ID?--看似简单的问题

楼主#
更多 发布于:2003-01-05 03:11
    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;
可是在调试中却发现从第二项往后全是空?
  为什么?
   有人有好的解决办法马?多谢了.
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-01-05 06:54
9x的process id 和 PROCESS HANDLE 相互之间只是一个 对某一个magic(固定)取异或而已。 手边没有9X,没法告诉你具体得值,自己看一下SOFTICE的 PROC输出很快就可以总结出来的。
standardlover
驱动牛犊
驱动牛犊
  • 注册日期2002-06-09
  • 最后登录2003-02-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-05 14:44
PROCESS HANDLE 不是和process id是异或关系, PROCESS HANDLE实际上只是句柄表的索引值,根据这个索引值找出句柄表的对应项,项里面pObject和MAGIC Num异或才是process id,我有这样的源程,但是在98下就不行了,索引值对应的项竟然是空的,百思不得其解.郁闷阿.
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-01-05 18:31
看来我把问题看错了。

确实process handle只是一个索引。

pProcess和processid是简单的异或关系。具体说me上是7e81408d.
这个值存在固定的[bffbb9dc]里面。

我只是奇怪你的用途。你是在自己的process还是别的process?
是在ring0 还是ring3?

根据要求不同,pProcess的取得方法不同的。
不过,你已经根据[陆老大给的98的进程的数据结构]分析了一定的东西,八成pProcess就在你手里吧。
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-06 11:20
95下, 8代表第8个入口. 以后的版本. 8代表第2个入口.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
5楼#
发布于:2003-01-06 11:29
奇怪了!不知道说的是ring0还是ring3呢?如果是ring3的话!完全可以通过api得到!如果是ring0的话!可是与应用程序进行协作得到这个magic number
flyonearth
驱动中牛
驱动中牛
  • 注册日期2002-12-25
  • 最后登录2009-07-01
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-06 11:35
95下, 8代表第8个入口. 以后的版本. 8代表第2个入口.

为什么8代表第2个入口,那第一个入口是几?中间有什么转换的规律吗?
standardlover
驱动牛犊
驱动牛犊
  • 注册日期2002-06-09
  • 最后登录2003-02-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-01-06 12:30
为什么8代表第2个入口,那第一个入口是几?中间有什么转换的规律吗?
---------------------------------------------------------
对阿,第九个对应第几个入口呢?
standardlover
驱动牛犊
驱动牛犊
  • 注册日期2002-06-09
  • 最后登录2003-02-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-01-06 13:24
刚才测试了一下,果然0X00000008对应的是句柄表的第二项,陆老大能把转化公式给以下马?
kernel_kernel
驱动小牛
驱动小牛
  • 注册日期2002-12-08
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分435分
  • 威望51点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
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;
standardlover
驱动牛犊
驱动牛犊
  • 注册日期2002-06-09
  • 最后登录2003-02-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-01-07 16:55
谢谢kernel_kernel,lu0,zdhe等热情的帮忙, 在lu0讲完之后,调试的时候我也猜可能句柄值要除以4,因为98及以后句柄都是按4的倍数分配的.问题已经完满解决,谢谢大家的帮忙.
游客

返回顶部