IopLiveDumpPopulateBitmapForDump
VOID __stdcall IopLiveDumpPopulateBitmapForDump(_LIVEDUMP_CONTEXT *Context){
__int64 v1;
_LIVEDUMP_CONTEXT v3;
__int64 v4;
_RTL_BITMAP_EX *v5;
UINT64 v6;
_LIVEDUMP_CONTEXT *v7;
UINT64 SetBits;
UINT64 v9;
unsigned __int64 *v10;
UINT64 v11;
UINT64 v12;
UINT64 v13;
UINT64 v14;
UINT64 v15;
__int64 v16;
UINT64 NextForwardRunClear;
UINT64 v18;
_RTL_BITMAP_EX BitMapHeader;
UINT64 StartingIndex;
UINT64 StartingRunIndex;
__int64 v22;
INT64 v23;
StartingRunIndex = 0i64;
v23 = 0i64;
v22 = 0i64;
v3 = Context[20];
BitMapHeader = 0i64;
if( (v3 & 0x80u) != 0 )
{
LODWORD(v4) = IopLiveDumpGetMillisecondCounter(0);
v22 = v4;
}
v5 = (_RTL_BITMAP_EX *)(Context + 136);
v6 = *((_QWORD *)Context + 68);
v18 = v6;
IopLiveDumpRemoveSystemCacheFromDump((__int64)Context, v1, &v23);
v7 = Context + 150;
if( Context != (_LIVEDUMP_CONTEXT *)-600i64 )
{
do
{
SetBits = RtlFindSetBitsEx((_RTL_BITMAP_EX *)v7, 1ui64, 0i64);
if( SetBits != -1i64 )
{
do
{
NextForwardRunClear = RtlFindNextForwardRunClearEx((_RTL_BITMAP_EX *)v7, SetBits, &StartingRunIndex);
if( NextForwardRunClear )
v6 = StartingRunIndex;
v9 = v6 - SetBits;
if( (Context[20] & 1) != 0 )
{
RtlSetBitsEx(v5, SetBits, v9);
}
else
{
v10 = (unsigned __int64 *)*((_QWORD *)Context + 69);
BitMapHeader.SizeOfBitMap = SetBits + v9;
v11 = SetBits;
BitMapHeader.Buffer = v10;
StartingIndex = SetBits;
do
{
v12 = RtlFindNextForwardRunClearEx(&BitMapHeader, v11, &StartingIndex);
if( !v12 )
break;
v13 = *((_QWORD *)Context + 86);
if( v12 > v13 )
{
Context[20] |= 2u;
v12 = v13;
}
v14 = StartingIndex;
if( v12 )
{
RtlSetBitsEx(&BitMapHeader, StartingIndex, v12);
*((_QWORD *)Context + 86) -= v12;
}
if( (Context[20] & 2) != 0 )
return;
v11 = v12 + v14;
StartingIndex = v11;
}
while( v11 < SetBits + v9 );
v5 = (_RTL_BITMAP_EX *)(Context + 136);
}
v15 = v9 + NextForwardRunClear;
v6 = v18;
SetBits += v15;
}
while( SetBits < v18 );
}
if( v7 == Context + 150 && (Context[10] & 4) != 0 )
v7 = Context + 164;
else
v7 = 0i64;
}
while( v7 );
}
if( (Context[20] & 0x80u) != 0 )
{
LODWORD(v16) = IopLiveDumpGetMillisecondCounter(0);
IopLiveDumpTracePopulateBitmapForDumpDuration((_GUID *)Context, v16 - v22, v23);
}
}Referenced by:
IopLiveDumpEndMirroringCallback