[StructLayout(LayoutKind.Sequential, Pack
=
1
)]
public struct RCTID
{
public RCTID(
bool
newobj, Guid Lowval, uint Highval)
{
Guid Low_0
=
Lowval;
uint High_10
=
Highval;
uint Limit_14
=
0
;
}
}
public static SafeFileHandle CreateVHDChain(string vhd_path_child, string vhd_path_parent, string vhd_path_source,
bool
parentdisk, ulong DefaultDiskSizeNext, RCTID newrctid)
{
VIRTUAL_STORAGE_TYPE vhd_type
=
new VIRTUAL_STORAGE_TYPE();
vhd_type.DeviceId
=
StorageDeviceType.Vhdx;
vhd_type.VendorId
=
VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT;
CreateVirtualDiskParameters ps
=
new CreateVirtualDiskParameters();
ps.SectorSizeInBytes
=
512
;
ps.MaximumSize
=
DefaultDiskSize;
CreateVirtualDiskFlag Flags
=
CreateVirtualDiskFlag.UseChangeTrackingSourceLimit;
ps.Version
=
CreateVirtualDiskVersion.Version3;
ps.ParentPath
=
vhd_path_parent;
ps.SourcePath
=
vhd_path_source;
string SourceLimitPath
=
newrctid.ToString();
ps.SourceLimitPath
=
SourceLimitPath;
ps.UniqueId
=
Guid.NewGuid();
int
error
=
CreateVirtualDisk(ref vhd_type, vhd_path_child, VirtualDiskAccessMask.
None
, null,
Flags,
0
, ref ps, IntPtr.Zero, out IntPtr hDisk);
return
new SafeFileHandle(hDisk, true);
}
void __fastcall Rct::SequenceTable::ReadCompleteForQuery(struct AE_ENVIRON
*
a1, RctQueryRecursiveOperation
*
opref, struct AE_TODO
*
a3)
{
while
( startidx < diff3fdminuscalc )
{
pagbufvalptr
=
pagebuf
+
4
*
startidx
+
4
*
startoffrefless3FD;
currentoffsetbase0x1
=
1
;
for
( j
=
*
(pagbufvalptr
+
3
); currentoffsetbase0x1 < diff3fdminuscalc
-
startidx;
+
+
currentoffsetbase0x1 )
{
if
(
*
&pagbufvalptr[
4
*
currentoffsetbase0x1
+
0xC
] !
=
j )
break
;
}
ActiveSequenceNumberref
=
seqtbl
-
>ActiveSequenceNumber_140;
if
( j <
=
ActiveSequenceNumberref )
ActiveSequenceNumberref
=
j;
/
/
fffff805`
5038cb90
48895c2410
mov qword ptr [rsp
+
10h
],rbx
/
/
2
: kd> k
/
/
/
/
00
fffff609`b9e0e878 fffff805`
5039c31a
vhdmp!VhdmpiRctQueryRecursiveCallback
/
/
01
fffff609`b9e0e880 fffff805`
5034a6ed
vhdmp!Rct::SequenceTable::ReadCompleteForQuery
+
0x2ba
/
/
02
fffff609`b9e0e910 fffff805`
5038caee
vhdmp!AeProcessTodo
+
0x7d
/
/
03
fffff609`b9e0e970 fffff805`
5038e30a
vhdmp!VhdmpiRctQueryRecursive
+
0x10a
/
/
04
fffff609`b9e0ea50 fffff805`
503ed0ca
vhdmp!VhdmpiQueryChangesSinceRctId
+
0x1c2
/
/
05
fffff609`b9e0ec40 fffff805`
503ed3bf
vhdmp!VhdmpiReadChangedData
+
0x8e
/
/
06
fffff609`b9e0ee80 fffff805`
503ed2bb
vhdmp!VhdmpiReadFromSource
+
0x47
/
/
07
fffff609`b9e0eec0 fffff805`
503fde09
vhdmp!VhdmpiPopulateVirtualDiskFromSource
+
0x11b
/
/
08
fffff609`b9e0f060 fffff805`
5042b0ed
vhdmp!VhdmpiVhd2FinalizeNewBackingStoreFile
+
0xd9
/
/
09
fffff609`b9e0f160 fffff805`
504249fb
vhdmp!VhdmpiCreateNewVhd
+
0xfc5
/
/
0a
fffff609`b9e0f3d0 fffff805`
50426d18
vhdmp!VhdmpiCreateThread
+
0x19b
/
/
0b
fffff609`b9e0f470 fffff805`a3a5666a vhdmp!VhdmpiAsyncOpThread
+
0x58
/
/
0c
fffff609`b9e0f4b0 fffff805`a3c74de4 nt!PspSystemThreadStartup
+
0x5a
/
/
0d
fffff609`b9e0f500
00000000
`
00000000
nt!KiStartSystemThread
+
0x34
if
( !(opref
-
>RctQueryRecursiveCallback_78)(
opref,
startidx
+
*
startoffsetptr,
currentoffsetbase0x1,
ActiveSequenceNumberref) )
{
break
;
}
}
Rct::SequenceTable::ContinueQuery(seqtbl, opref, a3);
}