释放 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 调用来释放内存。释放的所有内容都是缓冲区。
当用 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 调用来释放内存。释放的所有内容都是缓冲区。