【发布时间】:2016-03-26 03:58:44
【问题描述】:
我无法控制的这段代码使用重叠 I/O 读取文件:
// Read file asynchronously
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...);
BYTE buffer[10];
OVERLAPPED oRead = { 0 };
ReadFile(hFile, buffer, 10, NULL, &oRead);
// Do work while file is being read
...
// Wait for read to finish
WaitForSingleObject(hFile, INFINITE);
// ReadFile has finished
// buffer now contains data which can be used
...
在另一个线程中(实际上是在 ReadFile 的 API 挂钩中),我需要向 hFile 发出信号以解除对 WaitForSingleObject 的阻塞。通常 Windows(或处理ReadFile 的设备驱动程序)会这样做,但我需要模拟它。
我发现没有一个 API 通常可以使用 hFile,包括 ReleaseMutex、ReleaseSemaphore 和 SetEvent。它们都返回错误 6(句柄无效)。是否有适用于文件、命名管道或通信设备的 API?
我知道它是 not recommended 到 WaitForSingleObject(hFile),但上面的代码是给定的,我需要使用它。谢谢!
【问题讨论】:
-
“模拟”很粗糙,它实际上向驱动程序发出请求,您必须取消它。这需要 CancelIo()
-
@HansPassant - 我的钩子返回自己的数据,实际上并没有将调用转发给驱动程序。这就是为什么我的钩子需要在不涉及驱动程序的情况下向 hFile 发出信号。
-
嗯,钩子,这不是很明显。我想你最好也钩住WFSO。
-
@HansPassant - 抱歉,不清楚。 was suggested 挂钩 WFSO 并用
hFile替换我将创建的hEvent。然后钩子可以调用SetEvent。但我不敢相信没有 API 可以发出hFile的信号。驱动程序是如何做到的(尽管这样的 API 无疑是内核模式)? -
@selbie:
WaitForSingleObject确实使用文件句柄(就像任何其他内核对象句柄一样)。事实上,当为OVERLAPPED结构的hEvent 成员传递NULL时,系统会发出hFile 信号来代替hEvent。这记录在GetOverlappedResult 下。
标签: c++ multithreading winapi thread-synchronization overlapped-io