释放 DeviceIoControl 分配的内存

Free the memory allocated by DeviceIoControl

当用 IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS 调用 DeviceIoControl 时,它会用指向某些数据(Extents 数组)的指针填充 VOLUME_DISK_EXTENTS 结构。虽然在我的代码中创建的结构已被我释放,但指针数组似乎令人不安。

我应该释放那段内存吗? 我如何释放它?

唯一涉及的指针是指向您传递给 DeviceIoControl() 的缓冲区的指针,用于填充 VOLUME_DISK_EXTENTS 结构的内容。 VOLUME_DISK_EXTENTS 内部没有指针,它的 Extents 成员是结构的平面数组,而不是指针数组。这些结构完全包含在您分配的缓冲区中。所以唯一需要释放的是你的缓冲区,没有别的。

实际上VOLUME_DISK_EXTENTS定义为存储1个项目。

typedef struct _VOLUME_DISK_EXTENTS {
    DWORD       NumberOfDiskExtents;
    DISK_EXTENT Extents[ANYSIZE_ARRAY]; // ANYSIZE_ARRAY == 1
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;

如果我们用下面的方式调用DeviceIoControl

VOLUME_DISK_EXTENTS vde;
ret = DeviceIoControl(
    h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
    NULL, 0, &vde, sizeof(vde), &bytesReturned, NULL
);

我们将得到 ERROR_MORE_DATA return 代码,因为该结构中的 space 不够用。 Extents 数组定义为大小 1,如果您尝试访问元素 1 及以上,您将进入 VOLUME_DISK_EXTENTS 结构之后缓冲区中的 space。所以我们真正需要的不是创建一个 VOLUME_DISK_EXTENTS 而是一个大小为

的缓冲区
sizeof(DISK_EXTENT) * (nextents - 1) + sizeof(VOLUME_DISK_EXTENTS)

其中 nextents 是我们从上次调用中获得的 VOLUME_DISK_EXTENTS::NumberOfDiskExtents 值。那么我们应该使用

VOLUME_DISK_EXTENTS *ext = (VOLUME_DISK_EXTENTS*) buff;

并使用这个结构,假设 Extents 数组有 nextents 个元素。

不需要额外的 API 调用来释放内存。释放的所有内容都是缓冲区。