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

Comments

  • Anonymous
    January 14, 2010
    Do you know of a way to change the offset of vhd? We have some 2003 servers that need the offset changed, and I would rather not have to 'ghost' them all to new correctly aligned VHD's, that will take a long time. Thanks!   Don't know if Í understand your Q correctly, But when you change the offset to the Data within the header, you would also need to move the data. So what is your expected saving from gost? Maybe you could discard all header info, save it as a raw disk info and use vhdtool to create a new vhd of from that. Cheers Robert