IopUpdateMinidumpContext

VOID __stdcall IopUpdateMinidumpContext(
        UINT64 BugCheckCode,
        UINT64 BugCheckParameter1,
        UINT64 BugCheckParameter2,
        UINT64 BugCheckParameter3,
        UINT64 BugCheckParameter4,
        _CONTEXT *ContextSave,
        _KTHREAD *Thread,
        _KTRAP_FRAME *TrapFrame){
  struct _KPRCB *CurrentPrcb; 
  char v9; 
  UINT64 v11; 
  unsigned int v12; 
  UINT64 v13; 
  unsigned __int64 v14; 
  void *v15; 
  UINT64 v16; 
  unsigned int MaxValidMemorySize; 
  __int64 v18; 
  unsigned __int64 v19; 
  unsigned int v20; 
  unsigned int v21; 
  unsigned __int64 v22; 
  unsigned __int64 *v23; 
  void *v24; 
  unsigned __int64 v25; 
  unsigned int v26; 
  unsigned int v27; 
  __int64 v28; 
  __int64 v29; 
  _QWORD *v30; 
  _QWORD *i; 
  void *v32; 
  void *v33; 
  UINT64 v34; 
  unsigned int v35; 
  PVOID *j; 
  __int64 v37; 
  _OWORD *v38; 
  __int128 v39; 
  unsigned int v40; 
  v40 = BugCheckCode;
  CurrentPrcb = KeGetCurrentPrcb();
  v9 = 0;
  v11 = BugCheckParameter1;
  v12 = BugCheckCode;
  if( (_DWORD)BugCheckCode != 126 )
  {
    if( (_DWORD)BugCheckCode == 127 )
    {
      v13 = (UINT64)ContextSave;
      if( BugCheckParameter1 == 8 )
      {
        ContextSave->Rbp = *(_QWORD *)(BugCheckParameter2 + 344);
        ContextSave->Rip = *(_QWORD *)(BugCheckParameter2 + 360);
        ContextSave->Rsp = *(_QWORD *)(BugCheckParameter2 + 384);
      }
      goto LABEL_5;
    }
LABEL_8:
    v13 = (UINT64)ContextSave;
    goto LABEL_9;
  }
  if( !BugCheckParameter4 )
    goto LABEL_8;
  v13 = BugCheckParameter4;
LABEL_5:
  v9 = 1;
LABEL_9:
  v14 = *((_QWORD *)KeGetPcr() + 1618) + 80i64;
  v15 = *(void **)(v13 + 152);
  if( v14 - (unsigned int)KeKernelStackSize <= (unsigned __int64)v15 && (unsigned __int64)v15 < v14 )
  {
    if( v14 - (unsigned __int64)v15 >= 0x7FFF )
      v16 = 0x7FFFi64;
    else
      v16 = (unsigned int)(v14 - (_DWORD)v15);
    MaxValidMemorySize = IopGetMaxValidMemorySize(*(PVOID *)(v13 + 152), v16);
    IoAddTriageDumpDataBlock(v15, MaxValidMemorySize);
  }
  v18 = 2i64;
  if( *((_BYTE *)CurrentPrcb + 32408) > 2u )
  {
    v19 = *((_QWORD *)KeGetPcr() + 4331);
    if( v19 - 24576 <= (unsigned __int64)v15 && (unsigned __int64)v15 < v19 )
    {
      if( v19 - (unsigned __int64)v15 >= 0x7FFF )
        v20 = 0x7FFF;
      else
        v20 = v19 - (_DWORD)v15;
      v21 = IopGetMaxValidMemorySize(v15, v20);
      IoAddTriageDumpDataBlock(v15, v21);
    }
  }
  if( v12 == 307 )
  {
    if( (*((_BYTE *)KeGetPcr() + 12972) & 1) != 0 && Thread != *((_ETHREAD **)CurrentPrcb + 3) )
    {
      v22 = *((_QWORD *)KeGetPcr() + 1618) + 80i64;
      v23 = (unsigned __int64 *)(*((_QWORD *)KeGetPcr() + 4331) - 8i64);
      v24 = (void *)(v22 - (unsigned int)KeKernelStackSize);
      if( KiIsAddressRangeValid((INT64)v23, 8i64) )
      {
        v25 = *v23;
        if( KiIsAddressRangeValid(v25, 8i64) )
        {
          if( (unsigned __int64)v24 <= v25 && v25 < v22 )
            v24 = (void *)v25;
        }
      }
      if( v22 - (unsigned __int64)v24 >= 0x7FFF )
        v26 = 0x7FFF;
      else
        v26 = v22 - (_DWORD)v24;
      v27 = IopGetMaxValidMemorySize(v24, v26);
      IoAddTriageDumpDataBlock(v24, v27);
    }
    KeGetPrcb(*((unsigned int *)Thread + 134));
    v29 = v28;
    v30 = (_QWORD *)(v28 + 12480);
    do
    {
      for( i = (_QWORD *)*v30; i; i = (_QWORD *)*i )
      {
        IoAddTriageDumpDataBlock(i - 1, 0x40ui64);
        v32 = (void *)i[6];
        if( v32 != (void *)1 )
          IoAddTriageDumpDataBlock(v32, 0x60ui64);
      }
      v30 += 5;
      --v18;
    }
    while( v18 );
    v33 = *(void **)(v29 + 33960);
    if( v33 && v33 != *(void **)(v29 + 33968) )
    {
      v34 = (unsigned int)(8 * dword_140CFA32C);
      v35 = *(_DWORD *)(v29 + 33968) - (_DWORD)v33;
      if( v35 <= (unsigned int)v34 )
        v34 = v35;
      IoAddTriageDumpDataBlock(v33, v34);
    }
    v12 = v40;
    v11 = BugCheckParameter1;
  }
  for( j = (PVOID *)PopThermal; j != &PopThermal; j = (PVOID *)*j )
    IoAddTriageDumpDataBlock(j, 0x420ui64);
  IopAddBugcheckTriageDataFromParameters(v12, v11, BugCheckParameter2, BugCheckParameter3, BugCheckParameter4);
  if( v9 && CrashdmpDumpBlock )
  {
    *(_DWORD *)(CrashdmpDumpBlock + 24) |= 0x10000000u;
    v37 = 9i64;
    v38 = (_OWORD *)(CrashdmpDumpBlock + 64);
    do
    {
      *v38 = *(_OWORD *)v13;
      v38[1] = *(_OWORD *)(v13 + 16);
      v38[2] = *(_OWORD *)(v13 + 32);
      v38[3] = *(_OWORD *)(v13 + 48);
      v38[4] = *(_OWORD *)(v13 + 64);
      v38[5] = *(_OWORD *)(v13 + 80);
      v38[6] = *(_OWORD *)(v13 + 96);
      v38 += 8;
      v39 = *(_OWORD *)(v13 + 112);
      v13 += 128i64;
      *(v38 - 1) = v39;
      --v37;
    }
    while( v37 );
    *v38 = *(_OWORD *)v13;
    v38[1] = *(_OWORD *)(v13 + 16);
    v38[2] = *(_OWORD *)(v13 + 32);
    v38[3] = *(_OWORD *)(v13 + 48);
    v38[4] = *(_OWORD *)(v13 + 64);
  }
}

Referenced by:

IoWriteCrashDump
IopAddMiniDumpPagesToPartialKernelDump
IopWriteCapsuleTriageDumpToFirmware