This project is read-only.

Access NtfsVolume on .vdi

Mar 28, 2010 at 2:14 PM

    I'm currently playing around with the 0.8 Preview. I'm trying to access the Ntfs-Volume on the first (and only) partition of a Windows7-.vdi-image.
    I open the stream like this.
        FileStream fileStream = new FileStream("C:\\Windows7.vdi", FileMode.Open);
    Then I create the Disk-File.       
        DiscUtils.Vdi.DiskImageFile diskImage = new DiskImageFile(fileStream);
        DiscUtils.Vdi.Disk disk = new Disk(diskImage);

    Then I've tried three ways to access the Ntfs-Volume:       
            VolumeManager mgr = new VolumeManager(this.disk);
            PhysicalVolumeInfo[] pVInfo = mgr.GetPhysicalVolumes();
            PhysicalVolumeInfo pInfo = pVInfo[0];
            NtfsFileSystem fileSystem = new NtfsFileSystem(pInfo.Open());

            VolumeManager mgr = new VolumeManager(this.disk);
            LogicalVolumeInfo[] lVInfo = mgr.GetLogicalVolumes();
            VolumeInfo vInfo = lVInfo[0];
            NtfsFileSystem fileSystem = new NtfsFileSystem(vInfo.Open());

            PartitionTable partitionTable = this.disk.Partitions;
            PartitionInfo info = this.disk.Partitions[0];
            SparseStream ntfsStream = info.Open();
            NtfsFileSystem fileSystem = new NtfsFileSystem(ntfsStream);
    No matter which way I try, I always get an IndexOutOfRangeException in Utilities.BytesToString(byte[] data, int offset, int count),
    because the size of data is 0.    
    As far as I can see the array-size is 0, because of these four lines in the NtfsFileSystem-constructor.   
        byte[] bytes = Utilities.ReadFully(stream, 512);                             // bytes = { 0,0,0,0,0,0,0,0,.... }    
        _context.BiosParameterBlock = BiosParameterBlock.FromBytes(bytes, 0);        /*_context.BiosParameterBlock
                                                                                                                                  .BiosDriveNumber           0
                                                                                                                                  .BytesPerCluster              0
                                                                                                                                  .BytesPerSector               0
                                                                                                                                  .ChkDskFlags                  0
                                                                                                                                  .FatRootEntriesCount       0
                                                                                                                                  .FatSize16                      0    
                                                                                                                                  .HiddenSectors               0
                                                                                                                                  .IndexBufferSize              0
                                                                                                                                  .Media                          0
                                                                                                                                  .MftCluster                    0
                                                                                                                                  .MftMirrorCluster           0
                                                                                                                                  .MftRecordSize              0
                                                                                                                                  .NumFats                     0
                                                                                                                                  .NumHeads                  0
                                                                                                                                  .OemId                        "\0\0\0\0\0\0\0\0"
                                                                                                                                  .PaddingByte                 0
                                                                                                                                  .RawIndexBufferSize       0
                                                                                                                                  .RawMftRecordSize        0
                                                                                                                                  .ReservedSectors            0
                                                                                                                                  .SectorsPerCluster          0
                                                                                                                                  .SectorsPerTrack            0
                                                                                                                                  .SignatureByte               0
                                                                                                                                  .TotalSectors16             0
                                                                                                                                  .TotalSectors32             0
                                                                                                                                  .TotalSectors64             0
                                                                                                                                  .VolumeSerialNumber    0

        // Bootstrap the Master File Table
        _context.Mft = new MasterFileTable(_context);
        File mftFile = new File(_context, _context.Mft.GetBootstrapRecord()); // <-- here the Exception occurs

     DiscUtils.dll!DiscUtils.Utilities.BytesToString(byte[] data = {byte[0]}, int offset = 0, int count = 4) Line 475    C#
     DiscUtils.dll!DiscUtils.Ntfs.FixupRecordBase.FromBytes(byte[] buffer = {byte[0]}, int offset = 0, bool ignoreMagic = false) Line 91 + 0xd bytes    C#
     DiscUtils.dll!DiscUtils.Ntfs.FixupRecordBase.FromBytes(byte[] buffer = {byte[0]}, int offset = 0) Line 86 + 0x10 bytes    C#
     DiscUtils.dll!DiscUtils.Ntfs.MasterFileTable.GetBootstrapRecord() Line 128 + 0xf bytes    C#
     DiscUtils.dll!DiscUtils.Ntfs.NtfsFileSystem.NtfsFileSystem(System.IO.Stream stream = {DiscUtils.SubStream}) Line 75 + 0x2c bytes    C#
    Do I have an error in my code somewhere, is my image-file somehow corrupted or do you know of another way to access the image?

Mar 28, 2010 at 3:02 PM

Doesn't look like it's finding a valid NTFS file system.

Sometimes, the first partition on a Windows 7 disk isn't a data partition, but it could be a bug in the .vdi support in DiscUtils.

Can you try running a couple of utilities in the DiscUtils binary zip.  DiskDump should help understand the partition structure, posting the output here might help (cut out the bit about 'stored extents' if it's large).  Running NTFSDump on the disk could also be interesting, to see if it can access the first partition - the output of that will probably be too large to post.




Mar 28, 2010 at 3:36 PM
Edited Mar 28, 2010 at 3:43 PM


DiskDump provides this information:

DiskDump v0.8.0, available from
Copyright (c) Kenneth Bell, 2008-2009
Free software issued under the MIT License, see LICENSE.TXT for details.

DISK: C:\VirtualDiscs\Windows7.vdi

       Capacity: 0000000280000000
       Geometry: (1305/255/63)
  BIOS Geometry: (1024/255/63)
      Signature: 96E5C356
           GUID: 00000000-0000-0000-0000-000000000000

  Stored Extents

    0000000000000000 - 0000000280000000


  T   Start (bytes)     End (bytes)       Type
  07  0000000000007E00  000000027FCBB200  IFS (NTFS or HPFS)

  (0/1/1) (1023/254/63)


  Physical Volumes

    Type: BiosPartition
    BIOS Type: 07 [IFS (NTFS or HPFS)]
    Size: 10733958144
    Disk Id: 00000000-0000-0000-0000-000000000000
    Disk Sig: 96E5C356
    Partition: 00000000-0000-0000-0000-000000000000
    Disk Geometry: (1305/255/63)
    BIOS Geometry: (1024/255/63)
    First Sector: 63

  Logical Volumes

    BIOS Type: 07 [IFS (NTFS or HPFS)]
    Status: Healthy
    Size: 10733958144
    Disk Geometry: (1305/255/63)
    BIOS Geometry: (1024/255/63)
    First Sector: 63

NtfsDump throws an exception, which seems to be the same (or a similar) error I get:

Unhandled Exception: System.IndexOutOfRangeException: Index was outside the boun
ds of the array.
   at DiscUtils.Utilities.BytesToString(Byte[] data, Int32 offset, Int32 count)
   at DiscUtils.Ntfs.FixupRecordBase.FromBytes(Byte[] buffer, Int32 offset, Bool
ean ignoreMagic)
   at DiscUtils.Ntfs.MasterFileTable.GetBootstrapRecord()
   at DiscUtils.Ntfs.NtfsFileSystem..ctor(Stream stream)
   at NTFSDump.Program.DoRun()
   at DiscUtils.Common.ProgramBase.Run(String[] args)
   at NTFSDump.Program.Main(String[] args)


I iterated through the SparseStream I get from the PartitionInfo.Open() method.

I noticed, that only from the 498th iteration (using a byte[2048] as buffer) on, the values in the byte-Array are not 0.

So the first (2048 * 498 = ) 1,019,904 bytes are 0!

This doesn't seem to be right, but the .vdi-Image is working fine, with VirtualBox?!



Mar 28, 2010 at 3:47 PM
This discussion has been copied to a work item. Click here to go to the work item and continue the discussion.
Mar 28, 2010 at 3:51 PM



Mar 29, 2010 at 12:47 PM

Problem solved!

The .vdi obviously was messed up.

Tried with a different .vdi and it worked like a charm.

Thanks again for your quick response and sorry if I wasted your time...