public IList <InstallCost> GetTotalCost()
        {
            this.ValidateSessionAccess();

            IList <InstallCost> costs    = new List <InstallCost>();
            StringBuilder       driveBuf = new StringBuilder(20);

            for (uint i = 0; true; i++)
            {
                int  cost, tempCost;
                uint driveBufSize = (uint)driveBuf.Capacity;
                uint ret          = RemotableNativeMethods.MsiEnumComponentCosts(
                    (int)this.Handle,
                    null,
                    i,
                    (int)InstallState.Default,
                    driveBuf,
                    ref driveBufSize,
                    out cost,
                    out tempCost);
                if (ret == (uint)NativeMethods.Error.NO_MORE_ITEMS)
                {
                    break;
                }
                if (ret == (uint)NativeMethods.Error.MORE_DATA)
                {
                    driveBuf.Capacity = (int)++driveBufSize;
                    ret = RemotableNativeMethods.MsiEnumComponentCosts(
                        (int)this.Handle,
                        null,
                        i,
                        (int)InstallState.Default,
                        driveBuf,
                        ref driveBufSize,
                        out cost,
                        out tempCost);
                }

                if (ret != 0)
                {
                    throw InstallerException.ExceptionFromReturnCode(ret);
                }
                costs.Add(new InstallCost(driveBuf.ToString(), cost * 512L, tempCost * 512L));
            }
            return(costs);
        }