ReadDirectoryChangesW:异步使用时如何检测缓冲区溢出?

时间:2011-12-01 15:18:57

标签: buffer-overflow readdirectorychangesw

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

3 个答案:

答案 0 :(得分:2)

异步使用ReadDirectoryChangesW时,您将获得第一组事件,然后您必须再次调用它以获取更多事件。拥有的事件多于 缓冲区中的事件不是错误。在事件级缓冲区中有更多的事件是错误条件,你会发现如下:

  1. 发生了一些事件。
  2. ReadDirectoryChangesW启动的异步操作成功完成。填充缓冲区,设置事件句柄或触发IOCP。
  3. 发生其他事件,这些事件存储在OS级缓冲区中。
  4. 发生更多其他事件,这些事件会溢出OS级缓冲区。这不会改变重叠操作的状态,该操作已在步骤2中成功完成。
  5. 您等待事件句柄,或处理IOCP,并发现已完成的OVERLAPPED呼叫。
  6. 您再次致电ReadDirectoryChangesW 以开始异步重叠操作,检查自第2步以来发生的任何事件。此调用同步失败,GetLastError() == ERROR_NOTIFY_ENUM_DIR the documentation says this also means to re-enumerate the directory
  7. 以来{> 1或dwBytesTransferred == 0成功
      

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

答案 1 :(得分:1)

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

您还可以查看this other question.

的答案

答案 2 :(得分:0)

here判断,似乎没有返回异步的错误代码。

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