LdrpGetMappingFromCacheEntry
UINT8 __stdcall LdrpGetMappingFromCacheEntry(
UINT64 ModuleIndex,
IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry,
PVOID *pAlternateModule,
UINT64 *pImageSize){
unsigned __int64 v7;
unsigned __int64 v8;
UINT64 SizeOfImage;
UINT8 result;
IMAGE_NT_HEADERS *v11;
unsigned __int16 Magic;
if( !ResourceDataEntry )
return 0;
if( !pAlternateModule )
return 0;
if( (unsigned int)ModuleIndex >= (unsigned int)AlternateResourceModuleCount )
return 0;
_mm_lfence();
v7 = (unsigned __int64)(unsigned int)ModuleIndex << 6;
v8 = *(_QWORD *)((char *)AlternateResourceModules + v7 + 32);
SizeOfImage = *(_QWORD *)((char *)AlternateResourceModules + v7 + 48);
if( v8 - 1 > 0xFFFFFFFFFFFFFFFDui64 )
return 0;
if( !SizeOfImage )
{
v11 = RtlImageNtHeader((PVOID)(v8 & 0xFFFFFFFFFFFFFFFCui64));
if( !v11 )
return 0;
Magic = v11->OptionalHeader.Magic;
if( Magic == 267 || Magic == 523 )
SizeOfImage = v11->OptionalHeader.SizeOfImage;
else
SizeOfImage = 0i64;
if( !SizeOfImage )
return 0;
}
if( (unsigned __int64)ResourceDataEntry < (v8 & 0xFFFFFFFFFFFFFFFCui64)
|| (unsigned __int64)ResourceDataEntry >= SizeOfImage + (v8 & 0xFFFFFFFFFFFFFFFCui64) )
{
return 0;
}
*pAlternateModule = (PVOID)v8;
result = 1;
*pImageSize = SizeOfImage;
return result;
}Referenced by:
LdrpGetAlternateResourceModuleHandleEx