IOCTL_DISK_GET_DRIVE_LAYOUT_EX 从不打电话 returns
IOCTL_DISK_GET_DRIVE_LAYOUT_EX call never returns
我正在为 IOCTL_DISK_GET_DRIVE_LAYOUT_EX 函数编写托管包装器。它在我测试过的闪存驱动器上运行良好(使用“\\.\PHYSICALDRIVE1”获取句柄)。但是当调用\\.\PHYSICALDRIVE0(系统驱动器)时,该函数不能正常工作,即:
第一次使用默认缓冲区大小调用时,returns 出现 INSUFFICIENT_BUFFER 错误。当缓冲区自动调整大小(使用 Marshal.GlobalHRealloc)并再次调用该函数时,它永远不会 returns.
(我使用的是没有访问权限的有效句柄。)
可能是什么问题?
我发现了我的错误。
在调整 lpOutBuffer 的大小时以适应 INSUFFICIENT_BUFFER 错误时,我使用了 Marshal.ReAllocHGlobal 而没有将 returned 值分配给我的 lpOutBuffer。 ReAllocHGlobal 正在释放我的指针并给我新的指针,我一直忽略它,这意味着正在使用 freed/invalid 指针调用 IOCTL。我不知道为什么 Windows 没有抛出错误,但我已经解决了眼前的问题。
(首先,我尝试扩大默认缓冲区大小,它奏效了,这就是我意识到我的后续调用一定有问题的原因 buffer/pointer,一把中提琴!现在一切正常。)
我正在为 IOCTL_DISK_GET_DRIVE_LAYOUT_EX 函数编写托管包装器。它在我测试过的闪存驱动器上运行良好(使用“\\.\PHYSICALDRIVE1”获取句柄)。但是当调用\\.\PHYSICALDRIVE0(系统驱动器)时,该函数不能正常工作,即:
第一次使用默认缓冲区大小调用时,returns 出现 INSUFFICIENT_BUFFER 错误。当缓冲区自动调整大小(使用 Marshal.GlobalHRealloc)并再次调用该函数时,它永远不会 returns.
(我使用的是没有访问权限的有效句柄。)
可能是什么问题?
我发现了我的错误。
在调整 lpOutBuffer 的大小时以适应 INSUFFICIENT_BUFFER 错误时,我使用了 Marshal.ReAllocHGlobal 而没有将 returned 值分配给我的 lpOutBuffer。 ReAllocHGlobal 正在释放我的指针并给我新的指针,我一直忽略它,这意味着正在使用 freed/invalid 指针调用 IOCTL。我不知道为什么 Windows 没有抛出错误,但我已经解决了眼前的问题。
(首先,我尝试扩大默认缓冲区大小,它奏效了,这就是我意识到我的后续调用一定有问题的原因 buffer/pointer,一把中提琴!现在一切正常。)