Attach Child to Parent
Disk
VixDiskLib_Attach()
attaches the child disk
into its parent disk chain. Afterwards, the parent handle is invalid and the
child handle represents the combined disk chain of redo logs. On failure
(vixError
!=
VIX_OK
) the parent handle is also invalid, so do not close
it.
vixError = VixDiskLib_Attach(parent.Handle(), child.Handle());
For example, suppose you want to access the
older disk image recorded by Child1. Attach the handle of new Child1a to
Child1, which provides Child1a’s parent handle, as shown below. It is now
permissible to open, read, and write the Child1a virtual disk.
The parent-child disk chain is efficient in
terms of storage space, because the child VMDK records only the sectors that
changed since the last
VixDiskLib_CreateChild()
. The
parent-child disk chain also provides a redo mechanism, permitting programmatic
access to any generation with
VixDiskLib_Attach()
.
Child disk attached to disk
chain

Before VDDK 6.7.1 it was an
error to close
parentHandle
after
VixDiskLib_Attach
succeeds. The VDDK library now marks
parentHandle
internally
to prevent closure and ensure cleanup. Here is the calling sequence for open
and attach:
- Open the disk for attach.
- Create a local connection.
- With backed-up disk (referred to as the parent disk) still open, create child disk with a unique name.
- Open uniquely namedtmp.vmdk(referred to as the redo log).
- Attach the redo log to its parent disk.
VixDiskLib_Open(remoteConnection, virtualDiskPath, flags, &parentHandle); VixDiskLib_Connect(NULL, &localConnection); VixDiskLib_CreateChild(parentHandle, "C:\tmp.vmdk", VIXDISKLIB_DISK_MONOLITHIC_SPARSE, NULL, NULL); VixDiskLib_Open(localConnection, "C:\tmp.vmdk", VIXDISKLIB_FLAG_OPEN_SINGLE_LINK, &redoHandle); VixDiskLib_Attach(parentHandle, redoHandle);
Here is the calling sequence
for close:
- Close the redo log. Whether to close the parent disk handle is release dependent.
- Unlink the redo log to detach it from the parent disk.
VixDiskLib_Close(redoHandle); if (VIXDISKLIB_VERSION_MAJOR > 7) { VixDiskLib_Close(parentHandle); // to avoid memory leaks } VixDiskLib_Unlink(localConnection, "C:\tmp.vmdk");