Getting some more info about my .vhd and .avhd files.

I often have the need to get more info on the .vhd and .avhd (Snapshots or Differencing) files. I use the below .vbs script to read the info from the file.

Here's a sample output:

C:\VMs\mergetest\>cscript vhdinfo.vbs C:\VMs\mergetest\mergetest\mergetest_23855B6F-070C-426D-82FC-94E2916391EC.avhd
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.

VHDInfo.vbs v1.00 robertvi  091217
Cookie .................... conectix
Feature.................... 2
Format .................... 65536
Creator ................... win
Creator Host OS............ Wi2k
Disk Type.................. Differencing
Saved State................ 0

Dynamic Info
Cookie .................... cxsparse
Parent .................... C:\VMs\mergetest\mergetest\mergetest.vhd

VHDSize 328191

Finished!

The most used info is Parent to identify the Parent of a snapshot

 

copy and paste the below and save as vhdinfo.vbs

 

Option Explicit  
WScript.Echo "VHDInfo.vbs v1.01 robertvi  091217"

' common consts  
Const TypeBinary = 1  
   
' getting file from args (no checks!)  
Dim arguments, inFile
   
Set arguments = WScript.Arguments  
inFile = arguments(0)  
   
Dim inByteArray, disktype
 
inByteArray = readBytes(inFile)  

' Basic Footer

'ByteArray2Text(inByteArray)
 
WScript.Echo "Cookie .................... " & ByteArray2Text(inByteArray,0,8)

WScript.Echo "Feature.................... " & ByteArray2DWORD(inByteArray,8)
WScript.Echo "Format .................... " & ByteArray2DWORD(inByteArray,12)

WScript.Echo "Creator ................... " & ByteArray2Text(inByteArray,28,4)
WScript.Echo "Creator Host OS............ " & ByteArray2Text(inByteArray,36,4)

disktype = ByteArray2DWORD(inByteArray,60)
If disktype = 1 Then WScript.Echo"Disk Type.................. Reserved(deprecated)" End If
If disktype = 2 Then WScript.Echo"Disk Type.................. Fixed" End If
If disktype = 3 Then WScript.Echo"Disk Type.................. Dynamic" End If
If disktype = 4 Then WScript.Echo"Disk Type.................. Differencing" End If
If disktype = 5 Then WScript.Echo"Disk Type.................. Reserved(deprecated)" End If
If disktype = 6 Then WScript.Echo"Disk Type.................. Reserved(deprecated)" End If
If disktype >= 6 Then WScript.Echo"Disk Type.................. Unknown!" End If
'bare with me, if it would be C i would have used switch

WScript.Echo "Saved State................ " & ByteArray2DWORD(inByteArray,84)

'Dynamic Info

If disktype = 3 Then

 WScript.Echo vbCrLf & "Dynamic Info"
 WScript.Echo "Cookie .................... " & ByteArray2Text(inByteArray,512,8)

End If

If disktype = 4 Then

 WScript.Echo vbCrLf & "Dynamic Info"
 WScript.Echo "Cookie .................... " & ByteArray2Text(inByteArray,512,8)
    WScript.Echo "Parent .................... " & ByteArray2UText(inByteArray,1536,512)

End If

WScript.Echo vbcrlf & "VHDSize " & UBound(inByteArray)
WScript.echo "Finished!" 

 
private function readBytes(file)  
  dim inStream  
  ' ADODB stream object used  
  set inStream = WScript.CreateObject("ADODB.Stream")  
  ' open with no arguments makes the stream an empty container   
  inStream.Open  
  inStream.type= TypeBinary  
  inStream.LoadFromFile(file)  
  readBytes = inStream.Read()  
end function  
   
Function ByteArray2Text(varByteArray,offset,lenght)
    Dim strBuffer, lngCounter, strData
    strData = ""
    strBuffer = ""
    For lngCounter = offset to offset+lenght-1
        strBuffer = strBuffer & Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
    Next   
    ByteArray2Text = strData & strBuffer
End Function

Function ByteArray2UText(varByteArray,offset,lenght)
    Dim strBuffer, lngCounter, strData
    strData = ""
    strBuffer = ""
    For lngCounter = offset to offset+lenght-1 Step 2
        strBuffer = strBuffer & Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
    Next   
    ByteArray2UText = strData & strBuffer
End Function

Function ByteArray2DWORD(varByteArray,offset)
    Dim strBuffer, lngCounter, strData
    strData = ""
    strBuffer = ""
    For lngCounter = 0 to 3
     ByteArray2DWORD = ByteArray2DWORD * 256
        ByteArray2DWORD = ByteArray2DWORD + Ascb(Midb(varByteArray,offset+ lngCounter + 1, 1))
    Next   
End Function

'*** End