IopAddBugcheckTriageIrp

VOID __fastcall IopAddBugcheckTriageIrp(_IRP *TriageIrp, UINT8 AddDevices){
  int v4; 
  __int64 Size; 
  int StackCount; 
  unsigned __int64 v7; 
  __int64 v8; 
  int v9; 
  int v10; 
  _IRP *v11; 
  INT64 v12; 
  INT64 v13; 

  v4 = 0;
  if( KiIsAddressRangeValid((INT64)TriageIrp, 208i64) )
  {
    Size = TriageIrp->Size;
    if( (unsigned __int16)Size <= 0x800u
      && (StackCount = TriageIrp->StackCount, TriageIrp->StackCount <= 64)
      && (v7 = (unsigned __int64)(Size + 7) >> 3, v8 = TriageIrp->Size, KiIsAddressRangeValid((INT64)TriageIrp, 8 * v7)) )
    {
      IoAddTriageDumpDataBlock(TriageIrp, (_BYTE *)(unsigned int)(8 * v7));
      if( AddDevices == 1 )
      {
        v9 = 0;
        v10 = StackCount;
        if( (char)StackCount > 0 )
        {
          v11 = (_IRP *)((char *)TriageIrp + v8);
          do
          {
            if( &TriageIrp[1].UserIosb + 9 * (char)v9 > (_IO_STATUS_BLOCK **)v11 )
              break;
            v12 = *((_QWORD *)&TriageIrp[1].ThreadListEntry.Blink + 9 * (char)v9);
            if( v12 )
            {
              do
              {
                ++v4;
                if( !KiIsAddressRangeValid(v12, 336i64) )
                  break;
                v13 = *(_QWORD *)(v12 + 312);
                if( !KiIsAddressRangeValid(v13, 112i64) )
                  break;
                v12 = *(_QWORD *)(v13 + 48);
                if( !v12 )
                {
                  IopAddBugcheckTriageDeviceNode(*(_TRIAGE_DEVICE_NODE **)(v13 + 40));
                  break;
                }
              }
              while( v4 < 10 );
            }
            ++v9;
          }
          while( v9 < v10 );
        }
      }
    }
    else
    {
      IoAddTriageDumpDataBlock(TriageIrp, (_BYTE *)0xD0);
    }
  }
}

Referenced by:

IopAddBugcheckPowerTriageData
IopAddBugcheckTriageDeviceNode
IopAddBugcheckTriageThread