首页
社区
课程
招聘
[讨论]进程句柄不超过226传说
发表于: 2013-9-18 23:16 6875

[讨论]进程句柄不超过226传说

2013-9-18 23:16
6875
潘爱民老师的《Windows内核原理与实现》一书中关于句柄与句柄表的内容中提到,当句柄大于0小于等于226时为当前进程句柄表中的索引(3.4章,P133)。
51cto上的内容:http://book.51cto.com/art/201011/235763.htm



现在我们来看如何将一个句柄解析成相应的内核对象。首先,一个有效的句柄有4种可能:

-1,代表当前进程。

-2,代表当前线程。

负值,其绝对值为内核句柄表中的索引。仅限于内核模式的函数可以引用。

不超过226 的正值,当前进程的句柄表中的索引。


那么言下之意除了system进程外每个进程的句柄表只能包含226个句柄项了?
WRK中ObReferenceObjectByHandle()的代码逻辑中也没发现相关内容。

于是,纠结了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
上传的附件:
2013-9-18 23:30
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
3
貌似ObpCreateHandle可以指定是否使用内核句柄表(即system进程的句柄表),决定的参数由上一层传入,而不论是那种似乎都会增加句柄计数吧。。。回到ObOpenObjectByName又发现这个参数是更上一层传来的…
2013-9-18 23:43
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
4
而且…为啥这幅图里只有一个超过226的。。
2013-9-18 23:46
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
三层句柄表。。。。。三层。。。。
2013-9-19 02:15
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
6
知道这个,就是没明白潘爱民老师那句话啥意思
2013-9-19 08:38
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
根据楼上的楼上

256的3次方 = 1677 7216  ,也就是能有1千多万个句柄,
2013-9-19 09:31
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
好像是这样...
2013-9-19 09:33
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
9
_HANDLE_TABLE_ENTRY的尺寸是8byte
理论上的最大数量是(pagesize/sizeof(PVOID))^2 * pagesize/sizeof(_HANDLE_TABLE_ENTRY),IA32下为1024^2*512
不过微软加了额外的限制,因为内核中不可能有那么多的对象

这些都是很明白的,但令人费解的是书中的这段话:
现在我们来看如何将一个句柄解析成相应的内核对象。首先,一个有效的句柄有4种可能:

-1,代表当前进程。

-2,代表当前线程。

负值,其绝对值为内核句柄表中的索引。仅限于内核模式的函数可以引用。

不超过226 的正值,当前进程的句柄表中的索引。
2013-9-19 14:06
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
难道是笔误?
2013-9-19 18:15
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
11
怀疑中……

但是为啥要刻意加上这一条
2013-9-19 18:37
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
可以借鉴下你楼上的楼上的文章:
http://hi.baidu.com/_achillis/item/d76dd19faa660e8d5914611a
2013-9-19 19:28
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
单个进程能拥有的句柄数,同三级表及其中某些位的占用有关,一般来说win8以前可以有一千多万个,win8及以后被占了一些,只有8百万左右了

当然,进程不一定就能沾满这个句柄数,因为这个数量还和内存配额有关,如果已经有其它进程占用了大量句柄,那么就无法达到这么多句柄数
2013-9-20 13:06
0
游客
登录 | 注册 方可回帖
返回
//