PspCallProcessNotifyRoutines

NTSTATUS __stdcall PspCallProcessNotifyRoutines(
        _EX_RUNDOWN_REF *Process,
        PSP_CREATE_PROCESS_CONTEXT *CreateContext,
        UINT8 Create){
  void(__fastcall **ExtensionTable)(_EX_RUNDOWN_REF *, unsigned __int64, __int128 *); 
  void(__fastcall **v7)(_EX_RUNDOWN_REF *, unsigned __int64, __int128 *); 
  unsigned __int64 Count; 
  NTSTATUS v9; 
  unsigned int v10; 
  int v11; 
  __int128 v12; 
  char *v13; 
  PSP_CREATE_PROCESS_CONTEXT *v14; 
  __int64 v15; 
  __int64 v16; 
  __int128 *v17; 
  unsigned int v18; 
  _EX_RUNDOWN_REF *v19; 
  __int64 v20; 
  _EX_RUNDOWN_REF *v21; 
  int v23; 
  int v24; 
  _QWORD *v25; 
  void(__fastcall **v26)(_EX_RUNDOWN_REF *, unsigned __int64, __int128 *); 
  unsigned __int64 v27; 
  void(__fastcall **v28)(_EX_RUNDOWN_REF *, unsigned __int64, __int128 *); 
  __int128 v29[8]; 
  char v30; 
  VOID *OutFileObject; 

  memset(v29, 0i64, 0x48u);
  ExtensionTable = (void(__fastcall **)(_EX_RUNDOWN_REF *, unsigned __int64, __int128 *))ExGetExtensionTable((_EX_HOST *)PspDamExtensionHost);
  v26 = ExtensionTable;
  v7 = (void(__fastcall **)(_EX_RUNDOWN_REF *, unsigned __int64, __int128 *))ExGetExtensionTable((_EX_HOST *)PspBamExtensionHost);
  Count = Process[280].Count;
  v9 = 0;
  v10 = ((unsigned int)PspNotifyEnableMask >> 2) & 1;
  v28 = v7;
  OutFileObject = 0i64;
  v30 = 0;
  v27 = Count;
  if( !Create || (PspNotifyEnableMask & 4) == 0 && !ExtensionTable && !v7 )
  {
    v17 = 0i64;
    goto LABEL_17;
  }
  v11 = 0;
  *(_QWORD *)&v29[0] = 72i64;
  if( Count )
    v11 = 2;
  DWORD2(v29[0]) = v11;
  *(_EX_RUNDOWN_REF *)&v29[1] = Process[168];
  v12 = *(_OWORD *)&KeGetCurrentThread()[1].CycleTime;
  LODWORD(v29[4]) = 0;
  *(__int128 *)((char *)&v29[1] + 8) = v12;
  if( Count )
  {
    *((_QWORD *)&v29[2] + 1) = 0i64;
    v29[3] = 0i64;
    if( !CreateContext )
      goto LABEL_16;
    v25 = (_QWORD *)*((_QWORD *)CreateContext + 57);
    if( !v25 )
      goto LABEL_16;
    *((_QWORD *)&v29[2] + 1) = *v25;
    *(_QWORD *)&v29[3] = v25[1];
    v16 = v25[2];
  }
  else
  {
    if( CreateContext && (v13 = (char *)*((_QWORD *)CreateContext + 22)) != 0i64 )
    {
      OutFileObject = (VOID *)*((_QWORD *)CreateContext + 22);
    }
    else
    {
      v30 = 1;
      PsReferenceProcessFilePointer((_EPROCESS *)Process, &OutFileObject);
      v13 = (char *)OutFileObject;
    }
    *((_QWORD *)&v29[2] + 1) = v13;
    if( CreateContext && (CreateContext[1] & 0x20) != 0 )
    {
      DWORD2(v29[0]) |= 1u;
      v14 = CreateContext + 58;
    }
    else
    {
      v14 = (PSP_CREATE_PROCESS_CONTEXT *)(v13 + 88);
    }
    *(_QWORD *)&v29[3] = v14;
    if( !CreateContext || (v15 = *((_QWORD *)CreateContext + 26)) == 0 )
    {
      *((_QWORD *)&v29[3] + 1) = 0i64;
      goto LABEL_16;
    }
    v16 = v15 + 112;
  }
  *((_QWORD *)&v29[3] + 1) = v16;
LABEL_16:
  v17 = v29;
LABEL_17:
  if( (PspNotifyEnableMask & 2) != 0 || (_BYTE)v10 )
  {
    v18 = 0;
    while( 1 )
    {
      v19 = ExReferenceCallBackBlock((INT64 *)&stru_140CEC120.Ptr + v18);
      v21 = v19;
      if( v19 )
      {
        v23 = v19[2].Count;
        if( !v27 || (v23 & 4) != 0 )
        {
          if( (v23 & 2) != 0 )
          {
            if( (_BYTE)v10 )
              ((void(__fastcall *)(_EX_RUNDOWN_REF *, unsigned __int64, __int128 *))v21[1].Count)(
                Process,
                Process[136].Count,
                v17);
          }
          else
          {
            LOBYTE(v20) = Create;
            ((void(__fastcall *)(unsigned __int64, unsigned __int64, __int64))v21[1].Count)(
              Process[168].Count,
              Process[136].Count,
              v20);
          }
        }
        ExDereferenceCallBackBlock((_EX_CALLBACK *)&stru_140CEC120.Ptr + 2 * v18, v21);
        if( v17 )
        {
          v24 = *((_DWORD *)v17 + 16);
          if( v24 < 0 )
            break;
        }
      }
      if( ++v18 >= 0x40 )
        goto LABEL_21;
    }
    v9 = *((_DWORD *)v17 + 16);
    PsTerminateProcess((ULONG_PTR)Process, (unsigned int)v24);
LABEL_21:
    ExtensionTable = v26;
  }
  if( v28 && (!v17 || *((int *)v17 + 16) >= 0) )
  {
    (*v28)(Process, Process[136].Count, v17);
    ExReleaseExtensionTable(PspBamExtensionHost);
  }
  if( ExtensionTable && (!v17 || *((int *)v17 + 16) >= 0) )
  {
    (*ExtensionTable)(Process, Process[136].Count, v17);
    ExReleaseExtensionTable(PspDamExtensionHost);
  }
  if( v30 )
    HalPutDmaAdapter((PADAPTER_OBJECT)OutFileObject);
  return v9;
}

Referenced by:

PspExitProcess
PspInsertThread