【问题标题】:IOCTL_DISK_GET_DRIVE_LAYOUT_EX call never returnsIOCTL_DISK_GET_DRIVE_LAYOUT_EX 调用永远不会返回
【发布时间】:2015-07-28 13:51:19
【问题描述】:

我正在为 IOCTL_DISK_GET_DRIVE_LAYOUT_EX 函数编写一个托管包装器。它在我测试过的闪存驱动器上运行良好(使用“\\.\PHYSICALDRIVE1”来获取句柄)。但是在调用\\.\PHYSICALDRIVE0(系统驱动器)时,该功能无法正常工作,即:

第一次使用默认缓冲区大小调用它时,它会返回 INSUFFICIENT_BUFFER 错误。当缓冲区自动调整大小(使用 Marshal.GlobalHRealloc)并再次调用该函数时,它永远不会返回。

(我正在使用没有访问权限的有效句柄。)

可能是什么问题?

【问题讨论】:

  • 磁盘是否干净(磁盘管理或chkdsk 没有报告错误)?它在本机代码(例如 C++)中是否正常工作?
  • 另外,您的路径似乎缺少一些 `\` 反斜杠
  • @BenVoigt - 你是对的。我没有意识到 S.O.在没有转义字符的情况下将它们剥离。磁盘没问题。 (这是我的主要驱动力!)

标签: .net winapi pinvoke


【解决方案1】:

我发现了我的错误。

当调整 lpOutBuffer 的大小以适应 INSUFFICIENT_BUFFER 错误时,我使用 Marshal.ReAllocHGlobal 而不将 returned 值分配给我的 lpOutBuffer。 ReAllocHGlobal 正在释放我的指针并给我一个新的指针,我一直忽略它,这意味着 IOCTL 正在使用释放/无效指针调用。我不知道为什么 Windows 没有抛出错误,但我已经解决了我的直接问题。

(首先我尝试扩大默认缓冲区大小,它起作用了,这就是我意识到我的后续调用一定是缓冲区/指针有问题,中提琴!现在一切正常。)

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2011-12-27
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多