in vhdInspectCmdHandler.go [216:289]
func showVhdBAT(c *cli.Context) error {
vhdPath := c.String("path")
if vhdPath == "" {
return errors.New("Missing required argument --path")
}
startRange := uint32(0)
var err error
if c.IsSet("start-range") {
r, err := strconv.ParseUint(c.String("start-range"), 10, 32)
if err != nil {
return fmt.Errorf("invalid index value --start-range: %s", err)
}
startRange = uint32(r)
}
endRange := uint32(0)
if c.IsSet("end-range") {
r, err := strconv.ParseUint(c.String("end-range"), 10, 32)
if err != nil {
return fmt.Errorf("invalid index value --end-range: %s", err)
}
endRange = uint32(r)
}
vFileFactory := &vhdfile.FileFactory{}
vFile, err := vFileFactory.Create(vhdPath)
if err != nil {
return err
}
defer vFileFactory.Dispose(nil)
if vFile.GetDiskType() == footer.DiskTypeFixed {
return errors.New("Warn: Only expandable VHDs has Block Allocation Table, this is a fixed VHD")
}
maxEntries := vFile.BlockAllocationTable.BATEntriesCount
if !c.IsSet("end-range") {
endRange = maxEntries - 1
}
if startRange > maxEntries || endRange > maxEntries {
return fmt.Errorf("index out of boundary, this vhd BAT index range is [0, %d]", maxEntries)
}
if startRange > endRange {
return errors.New("invalid range --start-range > --end-range")
}
fMap := template.FuncMap{
"adj": func(i int) int {
return i + int(startRange)
},
}
t, _ := template.New("root").
Funcs(fMap).
Parse(batTempl)
if !c.IsSet("skip-empty") {
t.Execute(os.Stdout, vFile.BlockAllocationTable.BAT[startRange:endRange+1])
} else {
nonEmptyBATEntries := make(map[int]uint32)
for blockIndex := startRange; blockIndex <= endRange; blockIndex++ {
if vFile.BlockAllocationTable.HasData(blockIndex) {
nonEmptyBATEntries[int(blockIndex-startRange)] = vFile.BlockAllocationTable.BAT[blockIndex]
}
}
t.Execute(os.Stdout, nonEmptyBATEntries)
}
return nil
}