翻译《The Old New Thing》- Why does OpenProcess succeed even when I add three to the process ID?

Why does OpenProcess succeed even when I add three to the process ID? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20080606-00/?p=22043

Raymond Chen 2008年06月06日


        一位用户发现,如果将进程ID增加3,然后传递给OpenProcess函数,该函数仍然能够成功执行。这是怎么一回事呢?

        首先,我必须明确指出,您所观察到的现象是实现上的一种偶然结果,并非功能规范的一部分。您传递了故意错误的参数,您期望得到什么结果呢?这个问题的背景是“我们发现了这种行为,但我们无法解释”,而不是“我们正在使用这种技巧,希望得到确认它是否正确”。

事实上,您已经知道答案了。

  • 为什么进程和线程ID是4的倍数?
  • 内核句柄总是4的倍数

        正如我们之前讨论的,为了便捷,Windows NT内核使用句柄管理器来分配进程和线程ID,而句柄管理器会忽略句柄的最低两位。因此,向进程ID增加3并不会影响进程ID到对象的映射。

        这种机制是特定于基于Windows NT的内核的。基于Windows 95内核的Windows版本在映射进程ID到进程上采用了不同的机制,这个机制是严格不变的。如果您增加3,OpenProcess函数会将您的进程ID视为无效并拒绝它。至于Windows CE如何处理这种情况,我就不得而知了。

        再次强调,您在基于Windows NT的内核中观察到的行为只是一种实现上的偶然现象,随时都可能发生变化。谁知道呢,也许内核团队在阅读了这篇文章之后,会决定让OpenProcess变得更加严格。

        预先发布的Yuhong Bao评论:“在Windows 95中,进程ID是一个指向内部数据结构的指针,通过与一个常量进行异或操作来混淆。”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x0007

可不可奖励我吃只毛嘴鸡 馋😋

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值