-1

当调用DeviceIoControlwith 时,它用指向一些数据(数组)的指针IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS填充结构。虽然在我的代码中创建的结构已被我解除分配,但指针数组似乎令人不安。VOLUME_DISK_EXTENTSExtents

我应该释放那段记忆吗?我如何释放它?

4

2 回答 2

1

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

于 2015-02-16T22:36:55.033 回答
0

实际上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返回码,因为该结构中没有足够的空间。Extents数组的大小定义为 1,如果您尝试访问 1 及以上的元素,您将进入VOLUME_DISK_EXTENTS结构后缓冲区中的空间。所以我们真正需要的不是创建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 调用来释放内存。所有被释放的都是一个缓冲区。

于 2015-02-16T22:45:33.447 回答