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