KsepResolveShimHooks

NTSTATUS __stdcall KsepResolveShimHooks(_RTL_PROCESS_MODULES *LoadedModules, _KSE_HOOK_COLLECTION *HooksCollection){
  __int64 v4; 
  _KSE_HOOK_COLLECTION *v5; 
  _KSE_HOOK_COLLECTION v6; 
  int v7; 
  int v8; 
  VOID *v9; 
  NTSTATUS result; 
  __int64 v11; 
  int v12; 
  VOID *ExportedRoutineByName; 
  VOID *BaseAddress; 

  BaseAddress = 0i64;
  if( LoadedModules && HooksCollection )
  {
    LODWORD(v4) = 0;
    v5 = HooksCollection;
    while( 1 )
    {
      v6 = *v5;
      if( *v5 == 4 )
        return 0;
      if( v6 )
      {
        v7 = v6 - 1;
        if( v7 )
        {
          v8 = v7 - 1;
          if( !v8 )
          {
            result = KsepGetModuleInfoByName(*((WCHAR **)v5 + 1), LoadedModules, &BaseAddress);
            if( result < 0 )
              return result;
            v9 = BaseAddress;
            goto LABEL_15;
          }
          if( v8 != 1 )
            return -1073741811;
          v9 = 0i64;
        }
        else
        {
          v9 = (VOID *)*((_QWORD *)LoadedModules + 40);
        }
      }
      else
      {
        v9 = (VOID *)*((_QWORD *)LoadedModules + 3);
      }
      BaseAddress = v9;
LABEL_15:
      v11 = *((_QWORD *)v5 + 2);
      v12 = 0;
      if( v11 )
      {
        while( *(_DWORD *)v11 != 2 )
        {
          if( !*(_DWORD *)v11 )
          {
            ExportedRoutineByName = RtlFindExportedRoutineByName(v9, *(INT8 **)(v11 + 8));
            if( !ExportedRoutineByName )
              return -1073741823;
            *(_QWORD *)(v11 + 24) = ExportedRoutineByName;
          }
          v11 = *((_QWORD *)v5 + 2) + 32i64 * (unsigned int)++v12;
          if( !v11 )
            break;
        }
      }
      v4 = (unsigned int)(v4 + 1);
      v5 = &HooksCollection[6 * v4];
      if( !v5 )
        return 0;
    }
  }
  return -1073741811;
}

Referenced by:

KsepResolveApplicableShimsForDriver