IopWriteCapsuleTriageDumpToFirmware

VOID __fastcall IopWriteCapsuleTriageDumpToFirmware(
        UINT64 BugCheckCode,
        UINT64 BugCheckParameter1,
        UINT64 BugCheckParameter2,
        UINT64 BugCheckParameter3,
        UINT64 BugCheckParameter4,
        _CONTEXT *ContextSave,
        _ETHREAD *Thread,
        _KTRAP_FRAME *TrapFrame){
  char *v8; 
  unsigned int v12; 
  _KTRAP_FRAME *v13; 
  const UINT16 *v14; 
  UINT64 v15; 
  NTSTATUS v16; 
  __int64 v17; 
  UINT64 TriageOptions; 
  UINT64 NumDataArrays; 
  VOID *DataArraysIn; 
  UINT64 BugCheckCodea; 
  UINT64 ModifyArrayIn[2]; 
  _CONTEXT *Context; 
  UINT64 BugCheckParameters[4]; 

  v8 = (char *)TriageDumpBlock;
  BugCheckCodea = (unsigned int)BugCheckCode;
  Context = ContextSave;
  if( TriageDumpBlock )
  {
    VfDisableHalVerifier();
    BugCheckParameters[3] = BugCheckParameter4;
    BugCheckParameters[0] = BugCheckParameter1;
    BugCheckParameters[1] = BugCheckParameter2;
    BugCheckParameters[2] = BugCheckParameter3;
    IopUpdateMinidumpContext(
      v12,
      BugCheckParameter1,
      BugCheckParameter2,
      BugCheckParameter3,
      BugCheckParameter4,
      ContextSave,
      v13);
    MmSnapTriageDumpInformation(ContextSave, BugCheckParameters, v14, v15);
    IoFillDumpHeader(
      v8 + 4124,
      4ui64,
      (unsigned int)BugCheckCodea,
      BugCheckParameter1,
      BugCheckParameter2,
      BugCheckParameter3,
      BugCheckParameter4,
      &Thread->Tcb);
    ModifyArrayIn[0] = *(&stru_140C452E0 + 718) | 0x10000000000i64;
    ModifyArrayIn[1] = (UINT64)&stru_140C452E0 + 2880;
    LODWORD(DataArraysIn) = 1;
    LODWORD(NumDataArrays) = 65;
    LODWORD(TriageOptions) = CmNtCSDVersion;
    v16 = IoFillTriageDumpBuffer(
            0x3E000ui64,
            v8 + 12316,
            1u,
            0xDFFui64,
            0i64,
            Context,
            &Thread->Tcb,
            TriageOptions,
            NumDataArrays,
            DataArraysIn,
            ModifyArrayIn,
            ModifyArrayIn);
    *(_OWORD *)(v8 + 4220) = 0i64;
    *(_OWORD *)(v8 + 4236) = 0i64;
    *((_DWORD *)v8 + 2070) = 0;
    v17 = *((unsigned int *)v8 + 3080);
    *((_DWORD *)v8 + 2075) |= 0x88u;
    *(_QWORD *)(v8 + 8124) = v17;
    *((_DWORD *)v8 + 2069) = 3583;
    if( v16 >= 0 )
      IopWriteTriageDumpToFirmware((UINT8 *)TriageDumpBlock);
  }
}

Referenced by:

IoWriteCrashDump