KseRegisterShimEx

__int64 __fastcall KseRegisterShimEx(__int64 a1, __int64 a2, int a3, __int64 a4){
  NTSTATUS LoadedModulesList; 
  _QWORD *v8; 
  _QWORD *v9; 
  _ETHREAD *CurrentThread; 
  INT64 v11; 
  _QWORD *v12; 
  char v13; 
  __int64 v14; 
  __int64 v16; 
  __int64 v17; 
  UINT64 retaddr; 
  PVOID Buffer; 
  if( !a1 )
    return 3221225485i64;
  if( dword_140C50324 != 2 )
    return 3221225473i64;
  Buffer = 0i64;
  LoadedModulesList = KsepGetLoadedModulesList((_RTL_PROCESS_MODULES **)&Buffer);
  if( LoadedModulesList >= 0 )
  {
    if( (unsigned int)KsepValidateShimProviderAndData(retaddr, (UINT64 *)Buffer, a1) )
    {
      KsepPoolAllocatePaged(0x28ui64);
      v9 = v8;
      if( v8 )
      {
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)CurrentThread + 242);
        ExAcquirePushLockExclusiveEx((UINT64)&qword_140C50350, 0i64);
        if( (unsigned int)KsepIsShimRegistered((INT64)KseEngine, *(_QWORD **)(a1 + 8), v11, 0i64) )
        {
          if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C50350, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock((volatile INT64 *)&qword_140C50350);
          KeAbPostRelease(&qword_140C50350);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          LoadedModulesList = -1073741771;
          v17 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
          dword_140C2A864[2 * v17] = -1073741771;
          KsepHistoryErrors[2 * v17] = 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(v9);
        }
        else
        {
          *((_DWORD *)v9 + 6) = 0;
          v9[2] = a1;
          *((_DWORD *)v9 + 7) = a3;
          v9[4] = a4;
          v12 = (_QWORD *)qword_140C50338;
          if( *(__int64 **)qword_140C50338 != &qword_140C50330 )
            __fastfail(3u);
          *v9 = &qword_140C50330;
          v9[1] = v12;
          *v12 = v9;
          qword_140C50338 = (__int64)v9;
          v13 = _InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C50350, 0xFFFFFFFFFFFFFFFFui64);
          if( (v13 & 2) != 0 && (v13 & 4) == 0 )
            ExfTryToWakePushLock((volatile INT64 *)&qword_140C50350);
          KeAbPostRelease(&qword_140C50350);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          LoadedModulesList = 0;
          *(_QWORD *)(a1 + 24) = qword_140C50358;
          v14 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F;
          HIDWORD(KsepHistoryMessages[v14]) = 0;
          LODWORD(KsepHistoryMessages[v14]) = 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;
      v16 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
      dword_140C2A864[2 * v16] = -1073741823;
      KsepHistoryErrors[2 * v16] = 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( Buffer )
    KsepPoolFreePaged(Buffer);
  return(unsigned int)LoadedModulesList;
}

Referenced by:

KseRegisterShim