DbgkWerCaptureLiveKernelDump

NTSTATUS __stdcall DbgkWerCaptureLiveKernelDump(
        const WCHAR *ComponentName,
        UINT64 BugCheckCode,
        UINT64 P1,
        UINT64 P2,
        UINT64 P3,
        UINT64 P4,
        VOID *CallbackContext,
        INT64 *CallbackRoutine,
        VOID *a9,
        INT64 *a10,
        VOID *a11,
        const _GUID *a12,
        VOID *a13,
        UINT64 a14,
        UINT64 a15,
        UINT64 a16,
        UINT64 a17,
        UINT64 a18,
        UINT64 a19,
        VOID *a20,
        DBGK_LIVEDUMP_FLAGS Flags){
  int v23; 
  _ETHREAD *CurrentThread; 
  int v27; 
  VOID **PoolWithTag; 
  VOID **v29; 
  unsigned int v30; 
  _WER_LIVE_KERNEL_POLICY v31; 
  int v32; 
  char FreeContext[4]; 
  _WER_LIVE_KERNEL_POLICY WerPolicy; 
  VOID *hWerReport; 

  FreeContext[0] = 1;
  WerPolicy = WerLiveKernelPolicyNoDump;
  hWerReport = 0i64;
  v23 = BugCheckCode;
  if( KeGetCurrentIrql() )
  {
    DbgPrintEx(5u, 1u, "DBGK: DbgkWerCaptureLiveKernelDump: called at IRQL > PASSIVE_LEVEL\n");
    return -1073741496;
  }
  if( !byte_140C50880 )
  {
    DbgPrintEx(5u, 1u, "DBGK: DbgkWerCaptureLiveKernelDump: called before initialization.\n");
    return -1073741661;
  }
  if( DbgkpWerIsFullLiveDumpDisabled() )
  {
    DbgPrintEx(5u, 1u, "DBGK: Full Live Kernel Dumps are disabled. Failing request.\n");
    return -1073739772;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  if( _InterlockedExchange(&DbgkpBusy, 1) != 1 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 0xB8ui64, 1466393156i64);
    v29 = PoolWithTag;
    if( PoolWithTag )
    {
      memset(PoolWithTag, 0i64, 0xB8u);
      v27 = RtlStringCchLengthW((WCHAR *)ComponentName, 0x10ui64, 0i64);
      if( v27 >= 0 )
      {
        v27 = RtlStringCchCopyW((WCHAR *)v29, v30, (WCHAR *)ComponentName);
        if( v27 >= 0 )
        {
          v31 = DbgkpWerDefaultPolicy;
          if( ((unsigned __int8)a9 & 2) != 0 )
            v31 = WerLiveKernelPolicyMiniDump;
          WerPolicy = v31;
          v29[7] = (VOID *)P3;
          v29[8] = (VOID *)P4;
          v29[9] = CallbackContext;
          v29[10] = CallbackRoutine;
          *((_DWORD *)v29 + 8) = v23;
          v29[5] = (VOID *)P1;
          v29[6] = (VOID *)P2;
          *((_DWORD *)v29 + 22) = (_DWORD)a9;
          v32 = WerLiveKernelCreateReport(v29, &WerPolicy, &hWerReport);
          v27 = v32;
          if( v32 >= 0 )
          {
            v27 = DbgkpWerProcessPolicyResult((_DBGKWER_CONTEXT *)v29, WerPolicy, hWerReport, (UINT8 *)FreeContext);
            if( !FreeContext[0] )
              goto LABEL_20;
          }
          else
          {
            DbgPrintEx(
              5u,
              0,
              "DBGK: DbgkWerCaptureLiveKernelDump: WerLiveKernelCreateReport failed, status 0x%x.\n\n",
              (unsigned int)v32);
          }
        }
      }
      DbgkpWerCleanupContext((_DBGKWER_CONTEXT *)v29);
      ExFreePoolWithTag(v29, 0x57676244u);
    }
    else
    {
      v27 = -1073741670;
    }
    _InterlockedExchange(&DbgkpBusy, 0);
    goto LABEL_20;
  }
  v27 = -1073741267;
LABEL_20:
  KeLeaveCriticalRegion();
  return v27;
}

Referenced by:

MiForceCrashForInvalidAccess
NtPowerInformation
PopDripsWatchdogTakeAction
PopIdlePhaseWatchdogCallback