释放DeviceIoControl分配的内存

时间:2015-02-16 22:30:09

标签: c++ winapi memory-management deviceiocontrol

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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调用来释放内存。释放的一切都是缓冲。