KseRegisterShimEx

NTSTATUS __fastcall KseRegisterShimEx(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
  int v5; 
  int LoadedModulesList; 
  _QWORD *Paged; 
  _ETHREAD *CurrentThread; 
  __int64 v10; 
  _QWORD *v11; 
  char v12; 
  __int64 v13; 
  __int64 v15; 
  __int64 v16; 
  VOID *retaddr; 
  _RTL_PROCESS_MODULES *LoadedModules; 

  v5 = a3;
  if( !a1 )
    return -1073741811;
  if( dword_140C50324 != 2 )
    return -1073741823;
  LoadedModules = 0i64;
  LoadedModulesList = KsepGetLoadedModulesList(&LoadedModules);
  if( LoadedModulesList >= 0 )
  {
    if( KsepValidateShimProviderAndData(retaddr, LoadedModules, (_KSE_SHIM *)a1) )
    {
      Paged = KsepPoolAllocatePaged(0x28ui64);
      if( Paged )
      {
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --CurrentThread->Tcb.KernelApcDisable;
        ExAcquirePushLockExclusiveEx(&stru_140C50350, 0i64);
        if( (unsigned int)KsepIsShimRegistered((__int64)&Engine, *(_QWORD **)(a1 + 8), v10, 0i64) )
        {
          if( (_InterlockedExchangeAdd64(&stru_140C50350._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock(&stru_140C50350);
          KeAbPostRelease(&stru_140C50350);
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          LoadedModulesList = -1073741771;
          v16 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
          dword_140C2A864[2 * v16] = -1073741771;
          KsepHistoryErrors[2 * v16] = 131310;
          if( (KsepDebugFlag & 2) != 0 )
            KsepDebugPrint(2i64, "KSE: Attempt to re-register shim [0x%08X]\n", **(unsigned int **)(a1 + 8));
          KsepLogError(2, "KSE: Attempt to re-register shim [0x%08X]\n", **(unsigned int **)(a1 + 8));
          KsepPoolFreePaged(Paged);
        }
        else
        {
          *((_DWORD *)Paged + 6) = 0;
          Paged[2] = a1;
          *((_DWORD *)Paged + 7) = v5;
          Paged[4] = a4;
          v11 = qword_140C50338;
          if( (_UNKNOWN *)*qword_140C50338 != &unk_140C50330 )
            __fastfail(3u);
          *Paged = &unk_140C50330;
          Paged[1] = v11;
          *v11 = Paged;
          qword_140C50338 = Paged;
          v12 = _InterlockedExchangeAdd64(&stru_140C50350._bf_0, 0xFFFFFFFFFFFFFFFFui64);
          if( (v12 & 2) != 0 && (v12 & 4) == 0 )
            ExfTryToWakePushLock(&stru_140C50350);
          KeAbPostRelease(&stru_140C50350);
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          LoadedModulesList = 0;
          *(_QWORD *)(a1 + 24) = &unk_140C50358;
          v13 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F;
          HIDWORD(KsepHistoryMessages[v13]) = 0;
          LODWORD(KsepHistoryMessages[v13]) = 131353;
          if( (KsepDebugFlag & 1) != 0 )
            KsepDebugPrint(2i64, "KSE: Succeeded shim [0x%08X] registration\n", **(unsigned int **)(a1 + 8));
          KsepLogInfo(2, "KSE: Succeeded shim [0x%08X] registration\n", **(unsigned int **)(a1 + 8));
        }
      }
      else
      {
        LoadedModulesList = -1073741670;
      }
    }
    else
    {
      LoadedModulesList = -1073741823;
      v15 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
      dword_140C2A864[2 * v15] = -1073741823;
      KsepHistoryErrors[2 * v15] = 131277;
      if( (KsepDebugFlag & 2) != 0 )
        KsepDebugPrint(2i64, "KSE: Shim [0x%08X] is not valid\n", **(unsigned int **)(a1 + 8));
      KsepLogError(2, "KSE: Shim [0x%08X] is not valid\n", **(unsigned int **)(a1 + 8));
    }
  }
  if( LoadedModules )
    KsepPoolFreePaged(LoadedModules);
  return LoadedModulesList;
}

Referenced by:

KseRegisterShim