IopLiveDumpEndMirroringCallback
NTSTATUS __stdcall IopLiveDumpEndMirroringCallback(UINT64 PassNumber){
_GUID *v1;
__int64 v2;
int v3;
unsigned int Data1;
__int64 v5;
__int64 v6;
struct _KPRCB *CurrentPrcb;
struct _KPRCB *v8;
__int64 v9;
_OWORD *v10;
_CONTEXT *Context;
__int64 v12;
__int128 v13;
unsigned int v14;
__int64 v15;
UINT64 *p_Data1;
UINT64 v17;
unsigned int v18;
__int64 v19;
__int64 v20;
__int64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
v1 = IopLiveDumpContext;
v2 = 0i64;
if( (_DWORD)PassNumber )
{
if( (_DWORD)PassNumber == 1 )
{
IopLiveDumpTraceMirroringPhase1End((_LIVEDUMP_CONTEXT *)IopLiveDumpContext);
Data1 = v1[5].Data1;
if( (Data1 & 0x80u) != 0 )
{
LODWORD(v5) = IopLiveDumpGetMillisecondCounter(0);
Data1 = v1[5].Data1;
v2 = v5;
v6 = v5 - qword_140CF50C0;
if( (Data1 & 1) != 0 )
*(_QWORD *)&v1[28].Data1 = v6;
else
*(_QWORD *)&v1[31].Data1 = v6;
}
if( (Data1 & 1) != 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
RtlCaptureContext(CurrentPrcb->Context);
KiSaveProcessorControlState(&CurrentPrcb->ProcessorState);
}
else
{
v8 = KeGetCurrentPrcb();
v9 = *(_QWORD *)&v1[35].Data1;
RtlCaptureContext(v8->Context);
KiSaveProcessorControlState(&v8->ProcessorState);
v10 = (_OWORD *)(v9 + 840);
if( v10 )
{
memset(v10, 0i64, 0xBB8u);
Context = v8->Context;
v12 = 9i64;
do
{
v13 = *(_OWORD *)&Context->P1Home;
Context = (_CONTEXT *)((char *)Context + 128);
*v10 = v13;
v10 += 8;
*(v10 - 7) = Context[-1].VectorRegister[22];
*(v10 - 6) = Context[-1].VectorRegister[23];
*(v10 - 5) = Context[-1].VectorRegister[24];
*(v10 - 4) = Context[-1].VectorRegister[25];
*(v10 - 3) = *(_OWORD *)&Context[-1].VectorControl;
*(v10 - 2) = *(_OWORD *)&Context[-1].LastBranchToRip;
*(v10 - 1) = *(_OWORD *)&Context[-1].LastExceptionToRip;
--v12;
}
while( v12 );
*v10 = *(_OWORD *)&Context->P1Home;
v10[1] = *(_OWORD *)&Context->P3Home;
v10[2] = *(_OWORD *)&Context->P5Home;
v10[3] = *(_OWORD *)&Context->ContextFlags;
v10[4] = *(_OWORD *)&Context->SegGs;
}
if( SaveSupervisorState )
{
KeSaveSupervisorState(
(INT64)KeGetCurrentPrcb()->ExtendedSupervisorState,
KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures | 0x100);
v1[26].Data4[1] = 1;
}
}
v14 = v1[5].Data1;
if( (v14 & 0x80u) != 0 )
{
LODWORD(v15) = IopLiveDumpGetMillisecondCounter(0);
IopLiveDumpTraceCaptureProcessorContextDuration(v1, v15 - v2);
v14 = v1[5].Data1;
}
p_Data1 = 0i64;
if( (v14 & 1) == 0 )
p_Data1 = (UINT64 *)&v1[43].Data1;
v3 = IopLiveDumpMarkRequiredDumpData((_LIVEDUMP_CONTEXT *)v1, p_Data1);
if( v3 >= 0 )
{
if( (v1[5].Data1 & 1) != 0
&& (v17 = RtlNumberOfSetBitsEx((_RTL_BITMAP_EX *)&v1[34]),
v18 = v1[5].Data1,
*(_QWORD *)v1[6].Data4 = v17,
(v18 & 0x200) != 0)
&& v17 > (*(_QWORD *)v1[65].Data4 >> 12) + (unsigned __int64)((*(_QWORD *)v1[65].Data4 & 0xFFFi64) != 0) )
{
v3 = -1073741670;
v1[5].Data1 = v18 | 0x400;
}
else
{
v3 = IopLiveDumpMarkImportantDumpData((_RTL_BITMAP_EX *)v1, p_Data1);
if( v3 >= 0 )
{
if( (v1[5].Data1 & 1) != 0 )
{
IopLiveDumpPopulateBitmapForDump((_LIVEDUMP_CONTEXT *)v1);
}
else
{
IoFillDumpHeader(
*(VOID **)&v1[35].Data1,
6ui64,
v1->Data1,
*(_QWORD *)v1->Data4,
*(_QWORD *)&v1[1].Data1,
*(_QWORD *)v1[1].Data4,
*(_QWORD *)&v1[2].Data1,
KeGetCurrentThread());
if( *(_QWORD *)v1[43].Data4 || *(_QWORD *)&v1[44].Data1 )
{
if( (v1[5].Data1 & 0x80u) != 0 )
{
LODWORD(v20) = IopLiveDumpGetMillisecondCounter(0);
v2 = v20;
}
HvlCollectLivedump(v19, *(_QWORD *)&v1[13].Data1, &v1[12].Data1, (__int64)&v1[9]);
if( (v1[5].Data1 & 0x80u) != 0 )
{
LODWORD(v21) = IopLiveDumpGetMillisecondCounter(0);
*(_QWORD *)&v1[33].Data1 = v21 - v2;
IopLiveDumpTraceCaptureHvlCollectLiveDumpDuration(v1);
}
}
IopLiveDumpGenerateIptSecondaryData();
IopLiveDumpPopulateBitmapForDump((_LIVEDUMP_CONTEXT *)v1);
IopLiveDumpStartDumpDataBuffering((_LIVEDUMP_CORRAL_CONTEXT *)v1);
}
v3 = 0;
}
}
}
IopLiveDumpUncorralProcessors((_LIVEDUMP_CORRAL_CONTEXT *)&v1[19], 0);
if( (v1[5].Data1 & 0x80u) != 0 )
{
LODWORD(v22) = IopLiveDumpGetMillisecondCounter(0);
v23 = v22 - qword_140CF50C0;
if( (v1[5].Data1 & 1) != 0 )
*(_QWORD *)v1[27].Data4 = v23;
else
*(_QWORD *)v1[30].Data4 = v23;
}
}
else
{
return -1073741595;
}
}
else
{
IopLiveDumpTraceMirroringPhase0End((_LIVEDUMP_CONTEXT *)IopLiveDumpContext);
*(_QWORD *)&v1[12].Data1 = 0i64;
*(_QWORD *)v1[12].Data4 = 0i64;
IopLiveDumpCorralProcessors((_LIVEDUMP_CORRAL_CONTEXT *)&v1[19]);
v3 = 0;
if( (v1[5].Data1 & 0x80u) != 0 )
{
LODWORD(v24) = IopLiveDumpGetMillisecondCounter(0);
qword_140CF50C0 = v24;
}
}
return v3;
}Referenced by:
No references.