LdrResGetRCConfig

NTSTATUS __stdcall LdrResGetRCConfig(
        VOID *ModuleBase,
        UINT64 InitMappingSize,
        VOID **RcConfig,
        UINT64 Flags,
        UINT8 IsCaching){
  unsigned int v5; 
  int v8; 
  void *v9; 
  __int64 v10; 
  NTSTATUS v11; 
  NTSTATUS result; 
  unsigned __int64 v13; 
  NTSTATUS v14; 
  _DWORD *v15; 
  __int64 v16; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned int v20; 
  unsigned int v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  unsigned int v25; 
  unsigned int v26; 
  unsigned int v27; 
  unsigned int v28; 
  unsigned int v29; 
  unsigned int v30; 
  unsigned int v31; 
  unsigned int v32; 
  UINT64 v33; 
  int v34; 
  char v35; 
  UINT64 v36; 
  INT64 ResIdCount; 
  PVOID *Resource; 
  UINT64 *Size; 
  UINT64 *FoundLanguageLength; 
  PVOID v41; 
  UINT64 MappingSize; 
  PVOID ModuleBasea; 
  UINT64 v44[2]; 
  __int64 ResIds[3]; 

  v5 = Flags;
  ModuleBasea = ModuleBase;
  v44[1] = (UINT64)ModuleBase;
  ResIds[0] = (__int64)L"MUI";
  ResIds[1] = 1i64;
  ResIds[2] = 0i64;
  v44[0] = 0i64;
  MappingSize = InitMappingSize;
  v41 = 0i64;
  v8 = Flags & 0x2000;
  if( !ModuleBase )
    return -1073741811;
  if( !IsCaching )
  {
    v10 = -1i64;
    goto LABEL_10;
  }
  v9 = LdrpGetFromMUIMemCache(ModuleBase, 0, 0i64, 8ui64);
  v41 = v9;
  v10 = -1i64;
  if( v9 == (void *)-1i64 )
    return -1073741686;
  if( v9 )
  {
    v11 = 0;
    if( RcConfig )
      *RcConfig = v9;
    return v11;
  }
  ModuleBase = ModuleBasea;
LABEL_10:
  if( InitMappingSize || v8 || (result = LdrpResGetMappingSize(ModuleBase, &MappingSize, v5, Flags), result >= 0) )
  {
    LODWORD(ResIdCount) = 3;
    v13 = (unsigned __int64)ModuleBasea;
    v14 = LdrpResSearchResourceMappedFile(
            ModuleBasea,
            MappingSize,
            (v8 != 0 ? 0x2000 : 4096) | 0x200030u,
            (UINT64 *)ResIds,
            ResIdCount,
            &v41,
            v44,
            0i64,
            0i64);
    if( v14 < 0 )
    {
      if( v14 != -1073741701 )
        v14 = -1073741686;
      v11 = v14;
      goto LABEL_15;
    }
    v15 = v41;
    if( !v8 )
    {
      v16 = *((unsigned int *)v41 + 1);
      if( (unsigned __int64)v41 + v16 > MappingSize + (v13 & 0xFFFFFFFFFFFFFFFCui64) )
      {
        v11 = -1073741701;
LABEL_15:
        v15 = 0i64;
        v41 = 0i64;
LABEL_16:
        if( IsCaching )
        {
          if( v15 )
            v10 = (__int64)v15;
          LODWORD(Size) = v11;
          LODWORD(Resource) = 2;
          LdrpSetAlternateResourceModuleHandle(
            (VOID *)v13,
            0i64,
            0i64,
            (VOID *)v10,
            0,
            (UINT64)Resource,
            (INT64)Size,
            0i64,
            (UINT64)FoundLanguageLength);
        }
        return v11;
      }
      v11 = -1073020925;
      v17 = *((_DWORD *)v41 + 17);
      v18 = v17 + *((_DWORD *)v41 + 18);
      if( v18 > (unsigned int)v16 )
        goto LABEL_15;
      if( v18 < v17 )
        goto LABEL_15;
      v19 = *((_DWORD *)v41 + 19);
      v20 = v19 + *((_DWORD *)v41 + 20);
      if( v20 > (unsigned int)v16 )
        goto LABEL_15;
      if( v20 < v19 )
        goto LABEL_15;
      v21 = *((_DWORD *)v41 + 21);
      v22 = v21 + *((_DWORD *)v41 + 22);
      if( v22 > (unsigned int)v16 )
        goto LABEL_15;
      if( v22 < v21 )
        goto LABEL_15;
      v23 = *((_DWORD *)v41 + 23);
      v24 = v23 + *((_DWORD *)v41 + 24);
      if( v24 > (unsigned int)v16 )
        goto LABEL_15;
      if( v24 < v23 )
        goto LABEL_15;
      v25 = *((_DWORD *)v41 + 25);
      v26 = v25 + *((_DWORD *)v41 + 26);
      if( v26 > (unsigned int)v16 )
        goto LABEL_15;
      if( v26 < v25 )
        goto LABEL_15;
      v27 = *((_DWORD *)v41 + 27);
      v28 = v27 + *((_DWORD *)v41 + 28);
      if( v28 > (unsigned int)v16 )
        goto LABEL_15;
      if( v28 < v27 )
        goto LABEL_15;
      v29 = *((_DWORD *)v41 + 29);
      v30 = v29 + *((_DWORD *)v41 + 30);
      if( v30 > (unsigned int)v16 )
        goto LABEL_15;
      if( v30 < v29 )
        goto LABEL_15;
      v31 = *((_DWORD *)v41 + 31);
      v32 = v31 + *((_DWORD *)v41 + 32);
      if( v32 > (unsigned int)v16 )
        goto LABEL_15;
      if( v32 < v31 )
        goto LABEL_15;
      if( *(_DWORD *)v41 != -20054323 )
        goto LABEL_15;
      if( v16 != v44[0] )
        goto LABEL_15;
      if( *((_DWORD *)v41 + 2) != 0x10000 )
        goto LABEL_15;
      v33 = *((unsigned int *)v41 + 3);
      if( (_DWORD)v33 )
      {
        if( !CheckOneBitValidFlag(v33, 7ui64) )
          goto LABEL_15;
      }
      if( !CheckOneBitValidFlag(v15[4] & 0xFFFFFFCF, 3ui64) )
        goto LABEL_15;
      if( !CheckOneBitValidFlag(v34 & 0xFFFFFFFC, 0x30ui64) )
        goto LABEL_15;
      if( (v35 & 1) != 0 )
      {
        if( !CheckOneBitValidFlag((unsigned int)v15[6], 3ui64) )
          goto LABEL_15;
        v36 = (unsigned int)v15[5];
        if( (_DWORD)v36 )
        {
          if( !CheckOneBitValidFlag(v36, 0x100ui64) )
            goto LABEL_15;
        }
      }
    }
    if( RcConfig )
      *RcConfig = v15;
    v11 = 0;
    goto LABEL_16;
  }
  return result;
}

Referenced by:

LdrpResSearchResourceMappedFile
LdrpVerifyAlternateResourceModuleEx