で呼び出すDeviceIoControl
とIOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
、構造体にデータ (配列)VOLUME_DISK_EXTENTS
へのポインターが格納されます。Extents
私のコードで作成された構造体は私によって割り当て解除されていますが、ポインターの配列は邪魔なようです。
そのメモリを解放する必要がありますか?どうすれば解放できますか?
で呼び出すDeviceIoControl
とIOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
、構造体にデータ (配列)VOLUME_DISK_EXTENTS
へのポインターが格納されます。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
その構造体には十分なスペースがないため、リターン コードが返されます。Extents
array はサイズ 1 で定義されており、要素 1 以上にアクセスしようとすると、VOLUME_DISK_EXTENTS
構造体の後のバッファ内のスペースに入ります。したがって、実際に必要なのはVOLUME_DISK_EXTENTS
、サイズのバッファではなく、バッファを作成することです
sizeof(DISK_EXTENT) * (nextents - 1) + sizeof(VOLUME_DISK_EXTENTS)
wherenextents
はVOLUME_DISK_EXTENTS::NumberOfDiskExtents
前の呼び出しから取得した値です。次に、使用する必要があります
VOLUME_DISK_EXTENTS *ext = (VOLUME_DISK_EXTENTS*) buff;
Extents
配列にnextents
要素があると仮定して、この構造を操作します。
メモリを解放するために追加の API 呼び出しを行う必要はありません。解放されるものはすべてバッファです。