IopAddLiveDumpPagesToPartialKernelDump
INT64 __fastcall IopAddLiveDumpPagesToPartialKernelDump(UINT64 BugCheckCode, INT64 a2, UINT64 a3, INT64 a4, UINT64 a5){
unsigned int v7;
__int64 v8;
__int64 v9;
INT64 result;
__int64 v11;
_ETW_GUID_ENTRY *v12;
UINT64 v13;
__int64 *i;
_QWORD **v15;
_QWORD *v16;
__int64 v17[2];
__int128 v18;
__int64 v19;
_EVENT_HEADER UserEventHeader;
int v21;
int v22;
v22 = HIDWORD(a4);
*(_QWORD *)&UserEventHeader.EventDescriptor.Id = 0i64;
v21 = 0;
v19 = 0i64;
v7 = BugCheckCode;
v18 = 0i64;
v8 = *(_QWORD *)(CrashdmpDumpBlock + 8);
v9 = *(_QWORD *)(v8 + 48);
*(_QWORD *)&UserEventHeader.ThreadId = 0i64;
*(_QWORD *)&UserEventHeader.EventDescriptor.Id = 3i64;
v17[0] = v9;
v17[1] = v8 + 56;
UserEventHeader.TimeStamp.QuadPart = (LONGLONG)v17;
*(_QWORD *)UserEventHeader.ProviderId.Data4 = &AvailablePagesForPartialDump;
*(_QWORD *)&UserEventHeader.Size = IoSetDumpRangeForPartialKernelDump;
*(_QWORD *)&UserEventHeader.ProviderId.Data1 = v8;
result = MmAddRangeToCrashDump(&UserEventHeader, (unsigned __int64)&KdDebuggerDataBlock, 896i64);
if( (int)result >= 0 )
{
result = MmAddRangeToCrashDump(
&UserEventHeader,
(unsigned __int64)&KiProcessorBlock,
8i64 * (unsigned int)KeNumberProcessors_0);
if( (int)result >= 0 )
{
v11 = 0i64;
if( (_DWORD)KeNumberProcessors_0 )
{
while( 1 )
{
result = MmAddRangeToCrashDump(&UserEventHeader, (unsigned __int64)*(&KiProcessorBlock + v11), 44800i64);
if( (int)result < 0 )
break;
v11 = (unsigned int)(v11 + 1);
if( (unsigned int)v11 >= (unsigned int)KeNumberProcessors_0 )
goto LABEL_6;
}
}
else
{
LABEL_6:
*((_QWORD *)&v18 + 1) = KeActiveProcessors.Bitmap[0];
*(_QWORD *)&v18 = &KeActiveProcessors;
while( !(unsigned int)KeEnumerateNextProcessor(&v21, (unsigned __int16 **)&v18) )
{
result = IopMarkPagesForProcessorData(&UserEventHeader, v21);
if( (int)result < 0 )
return result;
}
result = MmAddPrivateDataToCrashDump(&UserEventHeader, 2);
if( (int)result >= 0 )
{
result = MmAddRangeToCrashDump(&UserEventHeader, 0xFFFFF78000000000ui64, 1824i64);
if( (int)result >= 0 )
{
result = MmAddPrivateDataToCrashDump(&UserEventHeader, 4);
if( (int)result >= 0 )
{
result = MmAddPrivateDataToCrashDump(&UserEventHeader, 8);
if( (int)result >= 0 )
{
if( !MmPhysicalMemoryBlock
|| (result = MmAddRangeToCrashDump(
&UserEventHeader,
(unsigned __int64)MmPhysicalMemoryBlock,
16 * ((unsigned int)(*(_DWORD *)MmPhysicalMemoryBlock - 1) + 2i64)),
(int)result >= 0) )
{
result = MmAddPrivateDataToCrashDump(&UserEventHeader, 32);
if( (int)result >= 0 )
{
if( v7 != 351 || a2 != 2 )
goto LABEL_24;
result = MmAddRangeToCrashDump(&UserEventHeader, a3, 56i64);
if( (int)result < 0 )
return result;
if( (unsigned int)IopMarkPagesForDeviceNode(&UserEventHeader, *(_QWORD *)(a3 + 48)) == -1073741789 )
return 3221225507i64;
v12 = (_ETW_GUID_ENTRY *)a5;
if( !a5 || (result = IopMarkPagesForDeviceNode(&UserEventHeader, a5), (int)result >= 0) )
{
LABEL_24:
LOBYTE(result) = ExAddPrivateDataToCrashDump(&UserEventHeader, v12, v13);
if( (int)result >= 0 )
{
for( i = (__int64 *)PsActiveProcessHead; i != &PsActiveProcessHead; i = (__int64 *)*i )
{
v15 = (_QWORD **)(i + 51);
v16 = *v15;
result = MmAddRangeToCrashDump(&UserEventHeader, (unsigned __int64)(i - 137), 2624i64);
if( (int)result < 0 )
return result;
while( v16 != v15 )
{
result = MmAddRangeToCrashDump(&UserEventHeader, (unsigned __int64)(v16 - 157), 2200i64);
if( (int)result < 0 )
return result;
result = MmAddRangeToCrashDump(&UserEventHeader, *(v16 - 151), *(v16 - 150) - *(v16 - 151));
if( (int)result < 0 )
return result;
v16 = (_QWORD *)*v16;
}
}
result = MmAddPrivateDataToCrashDump(&UserEventHeader, 16);
if( (int)result >= 0 )
{
IopDumpCallAddPagesCallbacks(v7);
IoSaveBugCheckProgress(0x21ui64);
return MmAddPrivateDataToCrashDump(&UserEventHeader, 1);
}
}
}
}
}
}
}
}
}
}
}
}
return result;
}Referenced by:
IoAddPagesForPartialKernelDump