进程句柄表的索引等于句柄值除以4? 如何来的
进程句柄表的索引等于句柄值除以4? 怎么来的?
下面一段话来自《windows核心编程》第五版的37页最下面:
用于创建内核对象的任何函数都会返回一个与进程相关的句柄,这个句柄可由同一个进程中运行的所有线程使用。系统用索引来表示内核对象的信息保存在进程句柄表中的具体位置,要得到实际的索引值,句柄实际值应该除以4(或右移两位,以忽略windows操作系统内部使用的最后两位)。所以,在调试应用程序时查看内核对象句柄的实际值时,会看到4、8之类的很小的值。记住,句柄的含义尚未公开,将来可能发生变化。
问:
1、句柄是个 void* 吧?除以4怎么就得到索引了? void* 和索引有除4的关系? 除后的结果不会带小数点吗?
2、右移两位和除以4是一回事?忽略window的最后两位要干什么?最后两位是什么东西,为什么要忽略?
3、查看句柄实际值会看到4、8这种数?怎么查看句柄值?void*会有这么小? 4、8看起来像是索引,不像是句柄值啊!!
------解决方案--------------------
void* 指针长度为 4 字节
------解决方案--------------------
看 <<windows内核原理与实现>>关于句柄的部分
------解决方案--------------------
DWORD 4字节.
------解决方案--------------------
句柄是特殊的指针,经过处理(应该只有MS或者大神知道的算法),就可以得到在内核中的内核对象比如FILE_OBJECT之类,每个进程都有一个句柄表,句柄可以得到句柄表中的索引,句柄表指向内核对象
------解决方案--------------------
32位系统嘛。
下面一段话来自《windows核心编程》第五版的37页最下面:
用于创建内核对象的任何函数都会返回一个与进程相关的句柄,这个句柄可由同一个进程中运行的所有线程使用。系统用索引来表示内核对象的信息保存在进程句柄表中的具体位置,要得到实际的索引值,句柄实际值应该除以4(或右移两位,以忽略windows操作系统内部使用的最后两位)。所以,在调试应用程序时查看内核对象句柄的实际值时,会看到4、8之类的很小的值。记住,句柄的含义尚未公开,将来可能发生变化。
问:
1、句柄是个 void* 吧?除以4怎么就得到索引了? void* 和索引有除4的关系? 除后的结果不会带小数点吗?
2、右移两位和除以4是一回事?忽略window的最后两位要干什么?最后两位是什么东西,为什么要忽略?
3、查看句柄实际值会看到4、8这种数?怎么查看句柄值?void*会有这么小? 4、8看起来像是索引,不像是句柄值啊!!
------解决方案--------------------
void* 指针长度为 4 字节
------解决方案--------------------
看 <<windows内核原理与实现>>关于句柄的部分
------解决方案--------------------
DWORD 4字节.
------解决方案--------------------
句柄是特殊的指针,经过处理(应该只有MS或者大神知道的算法),就可以得到在内核中的内核对象比如FILE_OBJECT之类,每个进程都有一个句柄表,句柄可以得到句柄表中的索引,句柄表指向内核对象
------解决方案--------------------
32位系统嘛。