LdrLoadAlternateResourceModuleEx
NTSTATUS __stdcall LdrLoadAlternateResourceModuleEx(
PVOID Module,
UINT16 LangId,
PVOID *ReturnAlternateModule,
UINT64 *AlternateViewSize,
UINT64 Flags){
unsigned int v7;
void *v9;
unsigned __int64 v10;
__int64 v12;
int v13;
const WCHAR *v14;
int ResourceFileName;
INT64 v16;
UINT64 v17;
UINT64 *pViewSize;
UINT64 v19;
INT64 ErrorCode;
PVOID MappedBase;
UINT64 Size;
HANDLE Handle;
int v24;
UNICODE_STRING pResourceFileName;
__int64 v26;
INT64 result[22];
char v28;
v7 = LangId;
MappedBase = 0i64;
Handle = 0i64;
pResourceFileName = 0i64;
memset((INT64)result, 0i64);
Size = 0i64;
if( !Module || !(_WORD)v7 || !ReturnAlternateModule )
return -1073741811;
LODWORD(v9) = LdrpGetFromMUIMemCache(Module, v7, &Size, 4ui64);
v10 = (unsigned __int64)v9;
if( v9 == (void *)-1i64 )
{
*ReturnAlternateModule = 0i64;
return -1073020922;
}
if( v9 )
{
*ReturnAlternateModule = v9;
if( AlternateViewSize )
*AlternateViewSize = Size;
v24 = 0;
return 0;
}
LODWORD(v12) = LdrpKrnGetDataTableEntry(Module);
v26 = v12;
if( v12 )
{
pResourceFileName.Buffer = (wchar_t *)&v28;
*(_DWORD *)&pResourceFileName.Length = 34078720;
v13 = Flags & 0x1000000;
if( (Flags & 0x1000000) != 0 )
{
LABEL_14:
v14 = L".mun";
if( !v13 )
v14 = L".mui";
ResourceFileName = LdrpGetResourceFileName(v12, v13 != 0, v14, (const WCHAR *)result, &pResourceFileName);
if( ResourceFileName >= 0 )
{
ResourceFileName = LdrpMapResourceFile(Module, &pResourceFileName, &Handle, &MappedBase, &Size);
if( ResourceFileName >= 0 )
{
v10 = (unsigned __int64)MappedBase | 1;
LODWORD(pViewSize) = Flags;
if( !LdrpVerifyAlternateResourceModuleEx(
Module,
(VOID *)((unsigned __int64)MappedBase | 1),
v16,
(const WCHAR *)result,
(INT64)pViewSize) )
{
MmUnmapViewInSystemSpace(MappedBase);
ZwClose(Handle);
Handle = 0i64;
v10 = 0i64;
ResourceFileName = -1073020926;
}
}
}
goto LABEL_20;
}
if( DownLevelLangIDToLanguageName(v7, (PWCHAR)result, 85i64, 2ui64) )
{
v12 = v26;
goto LABEL_14;
}
DbgPrintEx(0x55u, 1u, "LDR: No Locale name for LangId %d \n", v7);
}
ResourceFileName = -1073020927;
LABEL_20:
if( !v10 )
v10 = -1i64;
MappedBase = (PVOID)v10;
v17 = Size;
LODWORD(ErrorCode) = ResourceFileName;
LODWORD(v19) = 1;
LdrpSetAlternateResourceModuleHandle(Module, &MappedBase, &Handle, 0i64, v7, v19, ErrorCode, Size);
if( MappedBase == (PVOID)-1i64 )
{
*ReturnAlternateModule = 0i64;
}
else
{
*ReturnAlternateModule = MappedBase;
if( AlternateViewSize )
*AlternateViewSize = v17;
return 0;
}
return ResourceFileName;
}Referenced by:
LdrResSearchResource
LdrpLoadResourceFromAlternativeModule
LdrpResSearchResourceMappedFile