You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ZwQueryDirectoryFile二次调用返回STATUS_BUFFER_OVERFLOW原因咨询

STATUS_BUFFER_OVERFLOW 触发原因分析
  • 缓冲区容量不足:FILE_BOTH_DIR_INFORMATION 结构体末尾的 FileName 成员是可变长度的宽字符数组,你定义的栈上单结构体变量的大小仅包含固定头部加1个宽字符的预留空间,只能容纳文件名长度≤1的目录条目。第一次调用成功是因为返回的是当前目录.(文件名长度1)这类短名条目,第二个条目文件名更长,超出了缓冲区承载上限。
  • 未匹配API返回逻辑:你调用 ZwQueryDirectoryFile 时设置了 ReturnSingleEntry 参数为 TRUE,该参数要求每次调用仅返回一个目录条目,当待返回的条目总长度(固定头部 + 实际文件名所占字节数)超过传入的缓冲区大小时,API会直接返回 STATUS_BUFFER_OVERFLOW 状态码告知需要扩容缓冲区。
  • 缺少动态长度校验逻辑:第一次调用成功后,你没有从 IO_STATUS_BLOCK 的 Information 字段或 directory_information.NextEntryOffset 字段读取当前条目实际占用的字节数,也没有评估下一个条目所需的缓冲区容量,直接复用相同大小的缓冲区发起第二次调用,必然会在遇到长文件名条目时触发溢出错误。

修复建议

  • 预先分配一块足够大的内存(如4KB页面大小)作为查询缓冲区,替代栈上的单结构体变量,覆盖绝大多数长文件名场景。
  • 遇到 STATUS_BUFFER_OVERFLOW 返回时,可根据 IO_STATUS_BLOCK.Information 返回的最小所需长度重新分配缓冲区后重试调用。
  • 遍历目录时建议传入整块缓冲区的长度,利用 NextEntryOffset 遍历同一块缓冲区内的多个条目,提升遍历效率的同时减少API调用次数。

内容的提问来源于stack exchange,提问作者Christopher Lorr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:48:01