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