LdrpGetAlternateResourceModuleHandleEx

NTSTATUS __fastcall LdrpGetAlternateResourceModuleHandleEx(
        VOID *Module,
        VOID *LangId,
        _IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry,
        UINT64 *AlternateSize,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  int v11; 
  int i; 
  __int64 v13; 
  int j; 
  bool v15; 
  __int64 v16; 
  __int16 v17; 
  INT64 v19; 
  INT64 v20; 
  INT64 v21; 
  UINT64 pImageSize; 
  PVOID pAlternateModule; 

  pAlternateModule = 0i64;
  LdrpInitMuiCrits((INT64 *)Module, LangId, (INT64)ResourceDataEntry, (INT64)AlternateSize, v19, v20, v21, 0i64);
  KeWaitForSingleObject((UINT64)&MuiMutex, 0, 0, 0, 0i64);
  *AlternateSize = 0i64;
  v11 = AlternateResourceModuleCount;
  for( i = AlternateResourceModuleCount - 1; i >= 0; --i )
  {
    v13 = (__int64)i << 6;
    if( *(VOID **)((char *)AlternateResourceModules + v13 + 8) == Module )
    {
      if( pAlternateModule )
      {
        for( j = v11; ; --j )
        {
          v15 = j < 0;
          if( j < 0 )
            break;
          if( *((VOID **)AlternateResourceModules + 8 * (__int64)j + 1) == Module
            && LdrpGetMappingFromCacheEntry((unsigned int)j, ResourceDataEntry, &pAlternateModule, &pImageSize) )
          {
            v11 = j;
            v15 = j < 0;
            break;
          }
        }
        if( v15 )
          v11 = AlternateResourceModuleCount;
        break;
      }
      pAlternateModule = *(PVOID *)((char *)AlternateResourceModules + v13 + 32);
      pImageSize = *(_QWORD *)((char *)AlternateResourceModules + v13 + 48);
      v11 = i;
    }
  }
  if( v11 == (_DWORD)AlternateResourceModuleCount )
  {
    pAlternateModule = 0i64;
  }
  else
  {
    if( !pImageSize )
    {
      LODWORD(v16) = RtlImageNtHeader((unsigned __int64)pAlternateModule & 0xFFFFFFFFFFFFFFFCui64);
      if( v16 )
      {
        v17 = *(_WORD *)(v16 + 24);
        if( v17 == 267 || v17 == 523 )
          pImageSize = *(unsigned int *)(v16 + 80);
        else
          pImageSize = 0i64;
      }
    }
    *AlternateSize = pImageSize;
  }
  KeReleaseMutant(&MuiMutex, 1i64, 0, 0);
  return(int)pAlternateModule;
}

Referenced by:

LdrpAccessResourceData