【问题标题】:How to signal file HANDLE waiting with WaitForSingleObject如何用 WaitForSingleObject 发出文件句柄等待的信号
【发布时间】: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,包括 ReleaseMutexReleaseSemaphoreSetEvent。它们都返回错误 6(句柄无效)。是否有适用于文件、命名管道或通信设备的 API?

我知道它是 not recommendedWaitForSingleObject(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


【解决方案1】:

据我所知,文件句柄的信号发生在 Windows 内部,即使在内核模式下运行也没有 API。 (我相信文件系统驱动程序只是告诉 Windows 操作已完成,并让 Windows 弄清楚如何通知用户模式进程。我可能错了。)

一种解决方法是针对句柄发出真正的 ReadFile(零字节读取可能就足够了)以发出信号。

但挂钩 WaitForSingleObject 可能更明智,检查是否在相关文件句柄上调用它,如果是,则根据需要修改行为。

【讨论】:

  • 谢谢。挂钩 WFSO 和其他(例如 WFMO、GOR 等)似乎是最好的解决方法。
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
相关资源
最近更新 更多