-
-
[求助]对核心编程中第十章I/O完成端口内容中的一点疑惑!
-
发表于:
2011-7-21 11:56
4161
-
[求助]对核心编程中第十章I/O完成端口内容中的一点疑惑!
书上讲:当创建一个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作者讲授!