【问题标题】:ReadDirectoryChangesW: how to detect buffer overflow when using asynchronously?ReadDirectoryChangesW:异步使用时如何检测缓冲区溢出?
【发布时间】:2017-07-24 22:11:31
【问题描述】:

我正在结合 GetQueuedCompletionStatus 异步使用 ReadDirectoryChangesW (Windows API)。如何检测可能的缓冲区溢出以了解至少一个文件系统更改事件已丢失?

【问题讨论】:

  • 请展示一些源代码...
  • 显示使用 GetQueuedCompletionStatus 可靠检测缓冲区溢出的源代码正是问题所在。

标签: buffer-overflow readdirectorychangesw


【解决方案1】:

当异步使用ReadDirectoryChangesW时,你会得到第一组事件,然后你必须再次调用它以获得更多事件。 你的缓冲区中的事件多于容纳不下的事件不是错误。有更多的事件超出操作系统级缓冲区的容量是错误条件,您会发现如下:

  1. 发生了一些事件。
  2. ReadDirectoryChangesW 启动的异步操作成功完成。您的缓冲区已填满,您的事件句柄已设置或 IOCP 已触发。
  3. 会发生其他事件,这些事件存储在操作系统级缓冲区中。
  4. 会发生更多其他事件,这些事件会溢出操作系统级缓冲区。这不会更改已在第 2 步成功的重叠操作的状态。
  5. 您等待事件句柄或处理 IOCP,然后发现已完成的 OVERLAPPED 调用。
  6. 您再次调用 ReadDirectoryChangesW 开始异步重叠操作,检查自第 2 步以来发生的所有事件。此调用同步失败,GetLastError() == ERROR_NOTIFY_ENUM_DIR,或成功 @ 987654326@,自the documentation says this also means to re-enumerate the directory

如果传输的字节数为零,则缓冲区要么太大而系统无法分配,要么太小而无法提供有关目录或子树中发生的所有更改的详细信息。在这种情况下,您应该通过枚举目录或子树来计算更改。

【讨论】:

  • 听起来很有趣。这是你的经验吗?是否有任何文档指定此行为?对于更新的 Windows 版本,这可能会有所改变吗? 5 年前,我正在调查 ReadDirectoryChangesW 的行为,但我很确定我没有看到同步调用 ReadDirectoryChangesW 的任何错误指示。
  • @mstrap:实际上我对#6 并不完全确定。文档建议它可以改为使用dwBytesTransferred == 0 完成。我可以肯定的是,错误将在后续调用中报告,因为它发生在数据可用于完成第一次调用之后。
【解决方案2】:

您可能无法通过这种方式完成检测,但here 是一个很好的教程,可能会有所帮助。

您也可以查看this other question.的答案

【讨论】:

    【解决方案3】:

    here来看,好像没有这样的错误码异步返回

    建议:同步监控更改,但在专用线程中,并注意ERROR_NOTIFY_ENUM_DIR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 2015-07-02
      • 2012-05-19
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多