IopAddBugcheckTriageDevice

NTSTATUS __stdcall IopAddBugcheckTriageDevice(_DEVICE_OBJECT *TriageDevice){
  NTSTATUS v1; 
  int v3; 
  __int64 v4; 
  int v5; 
  unsigned int v6; 
  void *v7; 
  INT64 v8; 
  UNICODE_STRING TriageString; 
  v1 = 0;
  v3 = 0;
  while( 1 )
  {
    ++v3;
    if( !KiIsAddressRangeValid((INT64)TriageDevice, 336i64) )
      break;
    v4 = *((unsigned __int16 *)TriageDevice + 1);
    if( (unsigned __int16)v4 <= 0x3000u
      && (v5 = v4 + 7, KiIsAddressRangeValid((INT64)TriageDevice, (v4 + 7) & 0xFFFFFFFFFFFFFFF8ui64)) )
    {
      v6 = v5 & 0xFFFFFFF8;
    }
    else
    {
      v6 = 336;
    }
    IoAddTriageDumpDataBlock(TriageDevice, v6);
    v7 = (void *)*((_QWORD *)TriageDevice + 39);
    if( KiIsAddressRangeValid((INT64)v7, 112i64) )
      IoAddTriageDumpDataBlock(v7, 0x70ui64);
    v8 = *((_QWORD *)TriageDevice + 1);
    if( KiIsAddressRangeValid(v8, 336i64) )
    {
      IoAddTriageDumpDataBlock((PVOID)v8, 0x150ui64);
      TriageString = *(UNICODE_STRING *)(v8 + 56);
      IopAddBugcheckTriageUnicodeString(&TriageString);
    }
    TriageDevice = (_DEVICE_OBJECT *)*((_QWORD *)TriageDevice + 3);
    if( !TriageDevice || v3 >= 10 )
      return v1;
  }
  return -1073741823;
}

Referenced by:

IopAddBugcheckPnpWatchdogTriageData
IopAddBugcheckPowerTriageData
IopAddBugcheckTriageDeviceNode