LdrResGetRCConfig
NTSTATUS __stdcall LdrResGetRCConfig(
VOID *ModuleBase,
UINT64 InitMappingSize,
VOID **RcConfig,
UINT64 Flags,
UINT8 IsCaching){
unsigned int v5;
int v8;
void *v9;
__int64 v10;
NTSTATUS v11;
NTSTATUS result;
unsigned __int64 v13;
NTSTATUS v14;
_DWORD *v15;
__int64 v16;
unsigned int v17;
unsigned int v18;
unsigned int v19;
unsigned int v20;
unsigned int v21;
unsigned int v22;
unsigned int v23;
unsigned int v24;
unsigned int v25;
unsigned int v26;
unsigned int v27;
unsigned int v28;
unsigned int v29;
unsigned int v30;
unsigned int v31;
unsigned int v32;
UINT64 v33;
int v34;
char v35;
UINT64 v36;
INT64 ResIdCount;
PVOID *Resource;
UINT64 *Size;
UINT64 *FoundLanguageLength;
PVOID v41;
UINT64 MappingSize;
PVOID ModuleBasea;
UINT64 v44[2];
__int64 ResIds[3];
v5 = Flags;
ModuleBasea = ModuleBase;
v44[1] = (UINT64)ModuleBase;
ResIds[0] = (__int64)L"MUI";
ResIds[1] = 1i64;
ResIds[2] = 0i64;
v44[0] = 0i64;
MappingSize = InitMappingSize;
v41 = 0i64;
v8 = Flags & 0x2000;
if( !ModuleBase )
return -1073741811;
if( !IsCaching )
{
v10 = -1i64;
goto LABEL_10;
}
v9 = LdrpGetFromMUIMemCache(ModuleBase, 0, 0i64, 8ui64);
v41 = v9;
v10 = -1i64;
if( v9 == (void *)-1i64 )
return -1073741686;
if( v9 )
{
v11 = 0;
if( RcConfig )
*RcConfig = v9;
return v11;
}
ModuleBase = ModuleBasea;
LABEL_10:
if( InitMappingSize || v8 || (result = LdrpResGetMappingSize(ModuleBase, &MappingSize, v5, Flags), result >= 0) )
{
LODWORD(ResIdCount) = 3;
v13 = (unsigned __int64)ModuleBasea;
v14 = LdrpResSearchResourceMappedFile(
ModuleBasea,
MappingSize,
(v8 != 0 ? 0x2000 : 4096) | 0x200030u,
(UINT64 *)ResIds,
ResIdCount,
&v41,
v44,
0i64,
0i64);
if( v14 < 0 )
{
if( v14 != -1073741701 )
v14 = -1073741686;
v11 = v14;
goto LABEL_15;
}
v15 = v41;
if( !v8 )
{
v16 = *((unsigned int *)v41 + 1);
if( (unsigned __int64)v41 + v16 > MappingSize + (v13 & 0xFFFFFFFFFFFFFFFCui64) )
{
v11 = -1073741701;
LABEL_15:
v15 = 0i64;
v41 = 0i64;
LABEL_16:
if( IsCaching )
{
if( v15 )
v10 = (__int64)v15;
LODWORD(Size) = v11;
LODWORD(Resource) = 2;
LdrpSetAlternateResourceModuleHandle(
(VOID *)v13,
0i64,
0i64,
(VOID *)v10,
0,
(UINT64)Resource,
(INT64)Size,
0i64,
(UINT64)FoundLanguageLength);
}
return v11;
}
v11 = -1073020925;
v17 = *((_DWORD *)v41 + 17);
v18 = v17 + *((_DWORD *)v41 + 18);
if( v18 > (unsigned int)v16 )
goto LABEL_15;
if( v18 < v17 )
goto LABEL_15;
v19 = *((_DWORD *)v41 + 19);
v20 = v19 + *((_DWORD *)v41 + 20);
if( v20 > (unsigned int)v16 )
goto LABEL_15;
if( v20 < v19 )
goto LABEL_15;
v21 = *((_DWORD *)v41 + 21);
v22 = v21 + *((_DWORD *)v41 + 22);
if( v22 > (unsigned int)v16 )
goto LABEL_15;
if( v22 < v21 )
goto LABEL_15;
v23 = *((_DWORD *)v41 + 23);
v24 = v23 + *((_DWORD *)v41 + 24);
if( v24 > (unsigned int)v16 )
goto LABEL_15;
if( v24 < v23 )
goto LABEL_15;
v25 = *((_DWORD *)v41 + 25);
v26 = v25 + *((_DWORD *)v41 + 26);
if( v26 > (unsigned int)v16 )
goto LABEL_15;
if( v26 < v25 )
goto LABEL_15;
v27 = *((_DWORD *)v41 + 27);
v28 = v27 + *((_DWORD *)v41 + 28);
if( v28 > (unsigned int)v16 )
goto LABEL_15;
if( v28 < v27 )
goto LABEL_15;
v29 = *((_DWORD *)v41 + 29);
v30 = v29 + *((_DWORD *)v41 + 30);
if( v30 > (unsigned int)v16 )
goto LABEL_15;
if( v30 < v29 )
goto LABEL_15;
v31 = *((_DWORD *)v41 + 31);
v32 = v31 + *((_DWORD *)v41 + 32);
if( v32 > (unsigned int)v16 )
goto LABEL_15;
if( v32 < v31 )
goto LABEL_15;
if( *(_DWORD *)v41 != -20054323 )
goto LABEL_15;
if( v16 != v44[0] )
goto LABEL_15;
if( *((_DWORD *)v41 + 2) != 0x10000 )
goto LABEL_15;
v33 = *((unsigned int *)v41 + 3);
if( (_DWORD)v33 )
{
if( !CheckOneBitValidFlag(v33, 7ui64) )
goto LABEL_15;
}
if( !CheckOneBitValidFlag(v15[4] & 0xFFFFFFCF, 3ui64) )
goto LABEL_15;
if( !CheckOneBitValidFlag(v34 & 0xFFFFFFFC, 0x30ui64) )
goto LABEL_15;
if( (v35 & 1) != 0 )
{
if( !CheckOneBitValidFlag((unsigned int)v15[6], 3ui64) )
goto LABEL_15;
v36 = (unsigned int)v15[5];
if( (_DWORD)v36 )
{
if( !CheckOneBitValidFlag(v36, 0x100ui64) )
goto LABEL_15;
}
}
}
if( RcConfig )
*RcConfig = v15;
v11 = 0;
goto LABEL_16;
}
return result;
}Referenced by:
LdrpResSearchResourceMappedFile
LdrpVerifyAlternateResourceModuleEx