-1

で呼び出すDeviceIoControlIOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS、構造体にデータ (配列)VOLUME_DISK_EXTENTSへのポインターが格納されます。Extents私のコードで作成された構造体は私によって割り当て解除されていますが、ポインターの配列は邪魔なようです。

そのメモリを解放する必要がありますか?どうすれば解放できますか?

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その構造体には十分なスペースがないため、リターン コードが返されます。Extentsarray はサイズ 1 で定義されており、要素 1 以上にアクセスしようとすると、VOLUME_DISK_EXTENTS構造体の後のバッファ内のスペースに入ります。したがって、実際に必要なのはVOLUME_DISK_EXTENTS、サイズのバッファではなく、バッファを作成することです

sizeof(DISK_EXTENT) * (nextents - 1) + sizeof(VOLUME_DISK_EXTENTS)

wherenextentsVOLUME_DISK_EXTENTS::NumberOfDiskExtents前の呼び出しから取得した値です。次に、使用する必要があります

VOLUME_DISK_EXTENTS *ext = (VOLUME_DISK_EXTENTS*) buff;

Extents配列にnextents要素があると仮定して、この構造を操作します。

メモリを解放するために追加の API 呼び出しを行う必要はありません。解放されるものはすべてバッファです。

于 2015-02-16T22:45:33.447 に答える