IopAddBugcheckPowerTriageData
VOID __fastcall IopAddBugcheckPowerTriageData(
_DEVICE_OBJECT *TriagePDO,
_TRIAGE_9F_POWER *TriagePower,
_IRP *TriageIrp){
int v5;
_LIST_ENTRY *IrpList;
INT64 i;
_LIST_ENTRY *ThreadList;
int v9;
INT64 j;
v5 = 0;
IopAddBugcheckTriageDevice(TriagePDO);
IopAddBugcheckTriageIrp(TriageIrp, 1u);
if( KiIsAddressRangeValid((INT64)TriagePower, 40i64) && TriagePower->Signature == 0x8000 )
{
IoAddTriageDumpDataBlock(TriagePower, (_BYTE *)0x28);
IrpList = TriagePower->IrpList;
if( IrpList && KiIsAddressRangeValid((INT64)TriagePower->IrpList, 16i64) )
{
IoAddTriageDumpDataBlock(IrpList, (_BYTE *)0x10);
for( i = (INT64)IrpList->Flink; i; i = *(_QWORD *)i )
{
if( (_LIST_ENTRY *)i == TriagePower->IrpList )
break;
if( v5 >= 10 )
break;
++v5;
if( !KiIsAddressRangeValid(i, 32i64) )
break;
IoAddTriageDumpDataBlock((VOID *)i, (_BYTE *)0x20);
if( *(_LIST_ENTRY **)(i + 8) != IrpList )
break;
IopAddBugcheckTriageIrp(*(_IRP **)(i + 16), 1u);
IopAddBugcheckTriageDevice(*(_DEVICE_OBJECT **)(i + 24));
IrpList = (_LIST_ENTRY *)i;
}
}
ThreadList = TriagePower->ThreadList;
if( ThreadList )
{
v9 = 0;
if( KiIsAddressRangeValid((INT64)TriagePower->ThreadList, 16i64) )
{
IoAddTriageDumpDataBlock(ThreadList, (_BYTE *)0x10);
for( j = (INT64)ThreadList->Flink; j; j = *(_QWORD *)j )
{
if( (_LIST_ENTRY *)j == TriagePower->ThreadList )
break;
if( v9 >= 10 )
break;
++v9;
if( !KiIsAddressRangeValid(j, 24i64) )
break;
IoAddTriageDumpDataBlock((VOID *)j, (_BYTE *)0x18);
if( *(_LIST_ENTRY **)(j + 8) != ThreadList )
break;
ThreadList = (_LIST_ENTRY *)j;
IopAddBugcheckTriageThread(*(_ETHREAD **)(j + 16));
}
}
}
IopAddBugcheckTriageWorkQueue(TriagePower->DelayedWorkQueue);
}
}Referenced by:
IopAddBugcheckTriageDataFromParameters