IopAddBugcheckTriageIrp

NTSTATUS __stdcall IopAddBugcheckTriageIrp(_IRP *TriageIrp, UINT8 AddDevices){
  int v4; 
  NTSTATUS v5; 
  __int64 v6; 
  int v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  int v10; 
  int v11; 
  char *v12; 
  INT64 v13; 
  INT64 v14; 
  v4 = 0;
  v5 = 0;
  if( !KiIsAddressRangeValid((INT64)TriageIrp, 208i64) )
    return -1073741823;
  v6 = *((unsigned __int16 *)TriageIrp + 1);
  if( (unsigned __int16)v6 > 0x800u
    || (v7 = *((char *)TriageIrp + 66), *((char *)TriageIrp + 66) > 64)
    || (v8 = (unsigned __int64)(v6 + 7) >> 3,
        v9 = *((unsigned __int16 *)TriageIrp + 1),
        !KiIsAddressRangeValid((INT64)TriageIrp, 8 * v8)) )
  {
    IoAddTriageDumpDataBlock(TriageIrp, 0xD0ui64);
    return -1073741823;
  }
  IoAddTriageDumpDataBlock(TriageIrp, (unsigned int)(8 * v8));
  if( AddDevices == 1 )
  {
    v10 = 0;
    v11 = v7;
    if( (char)v7 > 0 )
    {
      v12 = (char *)TriageIrp + v9;
      while( (char *)TriageIrp + 72 * (char)v10 + 280 <= v12 )
      {
        v13 = *((_QWORD *)TriageIrp + 9 * (char)v10 + 31);
        if( v13 )
        {
          while( 1 )
          {
            ++v4;
            if( !KiIsAddressRangeValid(v13, 336i64) )
              break;
            v14 = *(_QWORD *)(v13 + 312);
            if( !KiIsAddressRangeValid(v14, 112i64) )
              break;
            v13 = *(_QWORD *)(v14 + 48);
            if( !v13 )
            {
              v5 = IopAddBugcheckTriageDeviceNode(*(_TRIAGE_DEVICE_NODE **)(v14 + 40));
              goto LABEL_17;
            }
            if( v4 >= 10 )
              goto LABEL_17;
          }
          v5 = -1073741823;
        }
LABEL_17:
        if( ++v10 >= v11 )
          return v5;
      }
      return -1073741823;
    }
  }
  return v5;
}

Referenced by:

IopAddBugcheckPowerTriageData
IopAddBugcheckTriageDeviceNode
IopAddBugcheckTriageThread