IopAddBugcheckTriageDataFromParameters

VOID __stdcall IopAddBugcheckTriageDataFromParameters(INT64 a1, UINT64 a2, INT64 a3, INT64 a4, INT64 Address){
  int v5; 
  __int64 v9; 
  VOID *v10; 
  _ETHREAD *v11; 
  _ETHREAD *v12; 
  unsigned int v13; 

  v5 = a1;
  IoAddTriageDumpDataBlock((VOID *)(a2 & 0xFFFFFFFFFFFFF000ui64), (_BYTE *)0x1000);
  IoAddTriageDumpDataBlock((VOID *)(a3 & 0xFFFFFFFFFFFFF000ui64), (_BYTE *)0x1000);
  IoAddTriageDumpDataBlock((VOID *)(a4 & 0xFFFFFFFFFFFFF000ui64), (_BYTE *)0x1000);
  IoAddTriageDumpDataBlock((VOID *)(Address & 0xFFFFFFFFFFFFF000ui64), (_BYTE *)0x1000);
  switch( v5 )
  {
    case 205:
    case 214:
      IoAddTriageDumpDataBlock((VOID *)((a2 - 4096) & 0xFFFFFFFFFFFFF000ui64), (_BYTE *)0x1000);
      break;
    case 209:
      if( !MmIsSpecialPoolAddress((VOID *)a2) )
        return;
      v9 = 4096i64;
      v10 = (VOID *)((a2 - 4096) & 0xFFFFFFFFFFFFF000ui64);
      goto LABEL_47;
    case 335:
    case 348:
      if( KiIsAddressRangeValid(Address, 16i64) )
      {
        IoAddTriageDumpDataBlock((VOID *)Address, (_BYTE *)0x10);
        v11 = *(_ETHREAD **)(Address + 8);
        if( v11 )
          IopAddBugcheckTriageThread(v11);
      }
      break;
  }
  if( v5 == 412 )
  {
    if( !a3 || a2 - 16 > 0x40 || (((_BYTE)a2 - 16) & 0xF) != 0 )
      return;
    IopAddBugcheckTriageThread((_ETHREAD *)a3);
  }
  if( v5 == 159 )
  {
    if( a2 == 4 )
    {
      if( a4 )
        IopAddBugcheckPnpTriageData((_ETHREAD *)a4, (_TRIAGE_9F_PNP *)Address);
      return;
    }
    if( a2 != 3 )
      return;
    IopAddBugcheckPowerTriageData((_DEVICE_OBJECT *)a3, (_TRIAGE_9F_POWER *)a4, (_IRP *)Address);
  }
  if( v5 == 469 )
    IopAddBugcheckPnpWatchdogTriageData(a3);
  if( v5 == 160 )
  {
    if( a2 == 1560 )
      IopAddBugcheckTriageThread((_ETHREAD *)a4);
    if( a2 == 1561 )
    {
      IopAddBugcheckTriageDeviceNode(*(_TRIAGE_DEVICE_NODE **)(a3 + 48));
      if( !Address )
        return;
      IopAddBugcheckTriageDeviceNode((_TRIAGE_DEVICE_NODE *)Address);
    }
    if( a2 != 15 && a2 - 240 > 1 || !Address )
      return;
    IopAddBugcheckTriageThread((_ETHREAD *)Address);
  }
  if( v5 == 257 )
  {
    if( a3 || !KiIsAddressRangeValid(a4, 44800i64) )
      return;
    IoAddTriageDumpDataBlock((VOID *)a4, (_BYTE *)0xAF00);
    IoAddTriageDumpDataBlock(*(VOID **)(a4 + 34240), (_BYTE *)0x4D0);
    v12 = *(_ETHREAD **)(a4 + 8);
    if( KiIsAddressRangeValid((INT64)v12, 2200i64) )
      IopAddBugcheckTriageThread(v12);
    IoAddTriageDumpDataBlock(
      (VOID *)((*(_QWORD *)(*(_QWORD *)(a4 + 34240) + 152i64) - 4096i64) & 0xFFFFFFFFFFFFF000ui64),
      (_BYTE *)0x2000);
  }
  if( v5 == 416 )
  {
    IopAddBugcheckTriageThread((_ETHREAD *)a4);
    PopInternalAddToDumpFile(0i64, 0i64, 0i64);
  }
  if( v5 == 292 && KiIsAddressRangeValid(a3, 128i64) )
  {
    v13 = *(_DWORD *)(a3 + 20);
    v9 = 72 * (unsigned int)*(unsigned __int16 *)(a3 + 10) + 128;
    v10 = (VOID *)a3;
    if( v13 >= (unsigned int)v9 )
      v9 = v13;
LABEL_47:
    IoAddTriageDumpDataBlock(v10, (_BYTE *)v9);
  }
}

Referenced by:

IopUpdateMinidumpContext