PsSetProcessFaultInformation

NTSTATUS __stdcall PsSetProcessFaultInformation(ULONG_PTR Process, PROCESS_FAULT_INFORMATION *FaultInformation){
  _EPROCESS *v3; 
  PROCESS_FAULT_INFORMATION v4; 
  _EX_PUSH_LOCK *p_ProcessLock; 
  _ETHREAD *v6; 
  void(__fastcall **ExtensionTable)(_EPROCESS *, struct _KTHREAD *, PROCESS_FAULT_INFORMATION *); 
  signed __int32 v9; 
  signed __int32 v10; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v12; 
  int v13; 
  int v14; 

  v3 = *(_EPROCESS **)&Process;
  if( (*FaultInformation & 1) != 0 )
  {
    _m_prefetchw((const void *)(*(_QWORD *)&Process + 2172i64));
    v9 = *(_DWORD *)(*(_QWORD *)&Process + 2172i64);
    do
    {
      v10 = v9;
      v9 = _InterlockedCompareExchange((volatile signed __int32 *)(*(_QWORD *)&Process + 2172i64), v9 | 4, v9);
    }
    while( v10 != v9 );
    if( (v9 & 4) == 0 )
    {
      if( dword_140C0EE84 < KUSER_SHARED_DATA.TelemetryCoverageRound )
      {
        if( !dword_140C0EE80 )
          dword_140C0EE80 = TelemetryCoverageStringHashInternal((_BYTE *)off_140C0EE78, &v13);
        EtwTelemetryCoverageReport((INT64)&off_140C0EE78);
      }
      PspRecordCrashedProcessIntoBlackbox((INT64)v3);
      PsSetProcessTelemetryAppState(v3, PsTelemetryAppStateCrash);
    }
  }
  v4 = *FaultInformation;
  if( (*FaultInformation & 2) != 0 )
  {
    if( dword_140C0EE6C < KUSER_SHARED_DATA.TelemetryCoverageRound )
    {
      if( !dword_140C0EE68 )
        dword_140C0EE68 = TelemetryCoverageStringHashInternal((_BYTE *)off_140C0EE60, &v14);
      EtwTelemetryCoverageReport((INT64)&off_140C0EE60);
    }
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    p_ProcessLock = &v3->ProcessLock;
    ExAcquirePushLockExclusiveEx(&v3->ProcessLock, 0i64);
    if( (v3->_bf_87b & 7) != 7 )
      v3->_bf_87b ^= (v3->_bf_87b ^ (v3->_bf_87b + 1)) & 7;
    if( (_InterlockedExchangeAdd64(&p_ProcessLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&v3->ProcessLock);
    KeAbPostRelease(&v3->ProcessLock);
    KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
    v4 = *FaultInformation;
  }
  else
  {
    p_ProcessLock = &v3->ProcessLock;
  }
  if( (v4 & 4) != 0 )
  {
    v6 = (_ETHREAD *)KeGetCurrentThread();
    --v6->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx(p_ProcessLock, 0i64);
    if( (v3->_bf_87b & 0x38u) < 0x38 )
      v3->_bf_87b ^= (v3->_bf_87b ^ (v3->_bf_87b + 8)) & 0x38;
    if( (_InterlockedExchangeAdd64(&p_ProcessLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(p_ProcessLock);
    KeAbPostRelease(p_ProcessLock);
    KeLeaveCriticalRegionThread(&v6->Tcb);
    v4 = *FaultInformation;
  }
  if( (v4 & 8) != 0 )
  {
    v12 = (_ETHREAD *)KeGetCurrentThread();
    --v12->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx(p_ProcessLock, 0i64);
    v3->_bf_87b |= 0x40u;
    if( (_InterlockedExchangeAdd64(&p_ProcessLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(p_ProcessLock);
    KeAbPostRelease(p_ProcessLock);
    KeLeaveCriticalRegionThread(&v12->Tcb);
  }
  ExtensionTable = (void(__fastcall **)(_EPROCESS *, struct _KTHREAD *, PROCESS_FAULT_INFORMATION *))ExGetExtensionTable((_EX_HOST *)PspHwTraceExtensionHost);
  if( ExtensionTable )
  {
    (*ExtensionTable)(v3, KeGetCurrentThread(), FaultInformation);
    ExReleaseExtensionTable(PspHwTraceExtensionHost);
  }
  return 0;
}

Referenced by:

DbgkForwardException
NtSetInformationProcess