IopLiveDumpPopulateBitmapForDump
char __fastcall IopLiveDumpPopulateBitmapForDump(__int64 a1, __int64 a2){
int v3;
INT64 v4;
UINT64 v5;
UINT64 *v6;
UINT64 SetBits;
UINT64 v8;
INT64 v9;
UINT64 v10;
UINT64 v11;
UINT64 v12;
UINT64 v13;
int v14;
UINT64 v15;
INT64 v16;
UINT64 NextForwardRunClear;
UINT64 v19;
INT64 v20[2];
UINT64 v21;
UINT64 v22;
INT64 MillisecondCounter;
INT64 a3;
v22 = 0i64;
a3 = 0i64;
MillisecondCounter = 0i64;
v3 = *(_DWORD *)(a1 + 80);
*(_OWORD *)v20 = 0i64;
if( (v3 & 0x80u) != 0 )
MillisecondCounter = IopLiveDumpGetMillisecondCounter(0);
v4 = a1 + 544;
v5 = *(_QWORD *)(a1 + 544);
v19 = v5;
IopLiveDumpRemoveSystemCacheFromDump(a1, a2, &a3);
v6 = (UINT64 *)(a1 + 600);
if( a1 != -600 )
{
do
{
SetBits = RtlFindSetBitsEx(v6, 1ui64, 0i64);
if( SetBits != -1i64 )
{
do
{
NextForwardRunClear = RtlFindNextForwardRunClearEx((INT64)v6, SetBits, &v22);
if( NextForwardRunClear )
v5 = v22;
v8 = v5 - SetBits;
if( (*(_DWORD *)(a1 + 80) & 1) != 0 )
{
RtlSetBitsEx(v4, SetBits, v8);
}
else
{
v9 = *(_QWORD *)(a1 + 552);
v20[0] = SetBits + v8;
v10 = SetBits;
v20[1] = v9;
v21 = SetBits;
do
{
v11 = RtlFindNextForwardRunClearEx((INT64)v20, v10, &v21);
if( !v11 )
break;
v12 = *(_QWORD *)(a1 + 688);
if( v11 > v12 )
{
*(_DWORD *)(a1 + 80) |= 2u;
v11 = v12;
}
v13 = v21;
if( v11 )
{
RtlSetBitsEx((INT64)v20, v21, v11);
*(_QWORD *)(a1 + 688) -= v11;
}
v14 = *(_DWORD *)(a1 + 80);
if( (v14 & 2) != 0 )
return v14;
v10 = v11 + v13;
v21 = v10;
}
while( v10 < SetBits + v8 );
v4 = a1 + 544;
}
v15 = v8 + NextForwardRunClear;
v5 = v19;
SetBits += v15;
}
while( SetBits < v19 );
}
if( v6 == (UINT64 *)(a1 + 600) && (*(_DWORD *)(a1 + 40) & 4) != 0 )
v6 = (UINT64 *)(a1 + 656);
else
v6 = 0i64;
}
while( v6 );
}
v14 = *(_DWORD *)(a1 + 80);
if( (v14 & 0x80u) != 0 )
{
v16 = IopLiveDumpGetMillisecondCounter(0);
LOBYTE(v14) = IopLiveDumpTracePopulateBitmapForDumpDuration((GUID *)a1, v16 - MillisecondCounter, a3);
}
return v14;
}Referenced by:
IopLiveDumpEndMirroringCallback