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