LdrpGetFromMUIMemCache
VOID *__stdcall LdrpGetFromMUIMemCache(VOID *Module, UINT16 LangId, UINT64 *Size, UINT64 Flags){
char v4;
_DWORD *v8;
__int64 v9;
VOID *v10;
INT64 *v11;
INT64 v12;
INT64 v13;
__int64 v14;
int i;
__int64 v16;
PLARGE_INTEGER Timeout;
INT64 v19;
INT64 v20;
INT64 v21;
char v22;
v4 = Flags;
v8 = 0i64;
v22 = 0;
if( (Flags & 0xC) == 0 || (Flags & 0xFFFFFFF3) != 0 || (Flags & 4) != 0 && !LangId )
return 0i64;
LODWORD(v9) = RtlImageNtHeader((unsigned __int64)Module & 0xFFFFFFFFFFFFFFFCui64);
v14 = v9;
if( !v9 )
return 0i64;
if( Size )
*Size = 0i64;
LdrpInitMuiCrits(v11, v10, v12, v13, (INT64)Timeout, v19, v20, v21);
KeWaitForSingleObject((UINT64)&MuiMutex, 0, 0, 0, 0i64);
for( i = AlternateResourceModuleCount - 1; i >= 0; --i )
{
v16 = (__int64)i << 6;
if( *(VOID **)((char *)AlternateResourceModules + v16 + 8) == Module )
{
if( *(_DWORD *)((char *)AlternateResourceModules + v16 + 24) != *(_DWORD *)(v14 + 88) )
{
v22 = 1;
break;
}
if( (v4 & 8) != 0 )
{
if( *(_QWORD *)((char *)AlternateResourceModules + v16 + 16) )
{
_mm_lfence();
v8 = (_DWORD *)*((_QWORD *)AlternateResourceModules + 8 * (__int64)i + 2);
if( (unsigned __int64)v8 - 1 <= 0xFFFFFFFFFFFFFFFDui64 && *v8 != -20054323 )
{
v22 = 1;
v8 = 0i64;
}
break;
}
}
else if( (v4 & 4) != 0 && LangId && *(_WORD *)((char *)AlternateResourceModules + v16) == LangId )
{
v8 = *(_DWORD **)((char *)AlternateResourceModules + v16 + 32);
if( Size )
*Size = *(_QWORD *)((char *)AlternateResourceModules + v16 + 48);
break;
}
}
}
KeReleaseMutant(&MuiMutex, 1i64, 0, 0);
if( v22 )
LdrUnloadAlternateResourceModuleEx(Module);
return v8;
}Referenced by:
LdrLoadAlternateResourceModuleEx
LdrResGetRCConfig
LdrpGetRcConfig