IOCTL_DISK_GET_DRIVE_LAYOUT_EX调用永远不会返回

时间:2015-07-28 13:51:20

标签: .net winapi pinvoke

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

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

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

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

我发现了我的错误。

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

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