code: func (d *Driver) Changes(id, parent string) ([]archive.Change, error) {
  	rID, err := d.resolveID(id)
  	if err != nil {
  		return nil, err
  	}
  	parentChain, err := d.getLayerChain(rID)
  	if err != nil {
  		return nil, err
  	}
  
  	if err := hcsshim.ActivateLayer(d.info, rID); err != nil {
  		return nil, err
  	}
  	defer func() {
  		if err2 := hcsshim.DeactivateLayer(d.info, rID); err2 != nil {
  			logrus.Errorf("changes() failed to DeactivateLayer %s %s: %s", id, rID, err2)
  		}
  	}()
  
  	var changes []archive.Change
  	err = winio.RunWithPrivilege(winio.SeBackupPrivilege, func() error {
  		r, err := hcsshim.NewLayerReader(d.info, id, parentChain)
  		if err != nil {
  			return err
  		}
  		defer r.Close()
  
  		for {
  			name, _, fileInfo, err := r.Next()
  			if err == io.EOF {
  				return nil
  			}
  			if err != nil {
  				return err
  			}
  			name = filepath.ToSlash(name)
  			if fileInfo == nil {
  				changes = append(changes, archive.Change{Path: name, Kind: archive.ChangeDelete})
  			} else {
  				// Currently there is no way to tell between an add and a modify.
  				changes = append(changes, archive.Change{Path: name, Kind: archive.ChangeModify})
  			}
  		}
  	})
  	if err != nil {
  		return nil, err
  	}
  
  	return changes, nil
  }
docs: // Changes produces a list of changes between the specified layer
  // and its parent layer. If parent is "", then all changes will be ADD changes.
  // The layer should not be mounted when calling this function.