首页
社区
课程
招聘
[求助]对核心编程中第十章I/O完成端口内容中的一点疑惑!
发表于: 2011-7-21 11:56 4162

[求助]对核心编程中第十章I/O完成端口内容中的一点疑惑!

2011-7-21 11:56
4162
书上讲:当创建一个I/O完成端口的时候,系统内核实际上会创建5个数据结构。。。
第二个是I/O完成队列,当设备的一个异步I/O请求完成时,系统会坚持设备是否与一个I/O完成端口相关联,如果关联,那么系统将会该完成的I/O请求追加到I/O完成端口的I/O完成队列的末尾。。。
然后下面有段说明文字:(就是这里迷茫)
向设备发出I/O请求,但不把该项已完成的I/O请求添加到I/O完成端口的队列中也是可能的。。。为了发生一个在完成的时候不要被添加到队列中的I/O请求,需要在OVERLAPPED结构的hEvent成员中保存一个有效的事件句柄,并将他与1按位或运算
code:
Overlapped.hEvent=Create(NULL,TRUE,FALSE,NULL);
Overlapped.hEvent=(HANDLE)((DWORD_PTR)Overlapped.hEvent | 1);//最低位为1没啥特色啊?为什么这样就能不将请求添加到I/O完成端口的队列中呢?
ReadFile(...,&Overlapped);

下面这样就不行:
Overlapped.hEvent=1;
ReadFile(...,&Overlapped);

另外,关闭此事件句柄的时候,记住清除最低位:
CloseHandle((HANDLE)(DWORD_PTR)Overlapped.hEvent & ~1));

请大牛们给小弟弟解释一下上面这几个问题,感激涕零,三克油!!!

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
应该是OS都不会让内核对象的最低位为1,以保留作其他用途吧,或者是IO完成端口内部的检查程序在发现内核对象无效时,会作这样的检查,可能是设计之初没想到不把完成项添加到队列末尾,后来才想了这么个办法

以上是一个网友猜测的,个人觉得挺合理得体的,不晓得大家怎么看。。。。。。
2011-7-22 22:39
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
经过讨论,仔细发现,终于还是在书中找到了一些蛛丝马迹出来:
内核对象那章有所透露:
系统用索引来表示内核对象的信息保存在进程句柄表中的具体位置,要得到实际的索引值,句柄值实际应该除以4(或右移两位,以忽略Windows操作系统内部使用的最后两位)。。。。。。。。。。。。。
其他的不想说了,就说一句吧:看来真相作者是清楚的,但是他不想说或许是不能说。。。总之是没说,欢迎大家说。
2011-7-22 22:57
0
游客
登录 | 注册 方可回帖
返回
//