LdrpResGetResourceDirectory
NTSTATUS __stdcall LdrpResGetResourceDirectory(
VOID *ModuleBase,
ULONGLONG MappingSize,
UINT64 Flags,
VOID **TopResourceDirectory,
VOID **NtHeaders){
unsigned __int64 v5;
NTSTATUS v6;
char v7;
bool v8;
int v9;
NTSTATUS result;
__int64 v11;
VOID *v12;
__int128 *v13;
__int16 v14;
unsigned int v15;
unsigned int v16;
UINT64 v17;
__int64 v18;
unsigned int *v19;
unsigned __int64 v20;
int v21;
int v22;
UINT64 pullResult;
UINT64 v24;
__int128 v25;
__int128 v26;
__int128 v27;
__int128 v28;
__int128 v29;
__int128 v30;
__int128 v31;
__int128 ullAddend;
__int128 v33;
__int128 v34;
__int128 v35;
__int128 v36;
__int128 v37;
__int128 v38;
__int128 v39;
__int64 v40;
__int64 v41;
VOID **v42;
v42 = TopResourceDirectory;
v41 = MappingSize;
v5 = (unsigned __int64)ModuleBase;
v6 = 0;
v24 = 0i64;
v40 = 0i64;
v7 = 1;
v8 = 1;
pullResult = 0i64;
if( !ModuleBase || !TopResourceDirectory || !NtHeaders )
return -1073741811;
if( ((unsigned __int8)ModuleBase & 3) != 0 )
{
v5 = (unsigned __int64)ModuleBase & 0xFFFFFFFFFFFFFFFCui64;
v8 = !((unsigned __int8)ModuleBase & 1);
}
v9 = Flags & 0x1000;
result = RtlImageNtHeaderEx(v9 == 0, v5, MappingSize, &v40);
if( result >= 0 )
{
v12 = (VOID *)v40;
v13 = (__int128 *)(v40 + 24);
v14 = *(_WORD *)(v40 + 24);
if( v14 == 267 )
{
v25 = *v13;
v26 = *(_OWORD *)(v40 + 40);
v27 = *(_OWORD *)(v40 + 56);
v28 = *(_OWORD *)(v40 + 72);
v29 = *(_OWORD *)(v40 + 88);
v30 = *(_OWORD *)(v40 + 104);
v31 = *(_OWORD *)(v40 + 120);
ullAddend = *(_OWORD *)(v40 + 136);
v33 = *(_OWORD *)(v40 + 152);
v34 = *(_OWORD *)(v40 + 168);
v35 = *(_OWORD *)(v40 + 184);
v36 = *(_OWORD *)(v40 + 200);
v37 = *(_OWORD *)(v40 + 216);
v38 = *(_OWORD *)(v40 + 232);
}
else
{
if( v14 != 523 )
return -1073741701;
v25 = *v13;
v26 = *(_OWORD *)(v40 + 40);
v27 = *(_OWORD *)(v40 + 56);
v28 = *(_OWORD *)(v40 + 72);
v29 = *(_OWORD *)(v40 + 88);
v30 = *(_OWORD *)(v40 + 104);
v31 = *(_OWORD *)(v40 + 120);
ullAddend = *(_OWORD *)(v40 + 136);
v33 = *(_OWORD *)(v40 + 152);
v34 = *(_OWORD *)(v40 + 168);
v35 = *(_OWORD *)(v40 + 184);
v36 = *(_OWORD *)(v40 + 200);
v37 = *(_OWORD *)(v40 + 216);
v38 = *(_OWORD *)(v40 + 232);
v39 = *(_OWORD *)(v40 + 248);
v7 = 0;
}
v15 = HIDWORD(v31);
if( v7 )
v15 = HIDWORD(v30);
if( v15 <= 2 )
return -1073741687;
v16 = v33;
if( v7 )
v16 = ullAddend;
if( !v16 )
return -1073741687;
if( v5 < 0x7FFFFFFEFFFFi64 && v5 + v16 >= 0x7FFFFFFEFFFFi64 )
return -1073741701;
if( v8 || v16 < HIDWORD(v28) )
{
if( RtlULongLongAdd(v5, v16, &pullResult) < 0 )
return -1073741701;
v17 = pullResult;
v24 = pullResult;
v18 = v41;
}
else
{
v18 = v41;
v19 = (unsigned int *)LdrpSectionTableFromVirtualAddress(v5, v41, v40, v11, v16, v9 != 0);
if( !v19 )
return -1073741701;
if( !v19[4] )
return -1073741687;
v17 = v5 + v19[5] - (unsigned __int64)v19[3] + v16;
v24 = v17;
}
if( !v17 )
return -1073741687;
if( v9 )
{
if( v17 <= v5 )
return -1073741701;
v20 = (v5 & 0xFFFFFFFFFFFFFFFCui64) + v18;
if( v17 + 16 > v20 )
return -1073741701;
v21 = *(unsigned __int16 *)(v17 + 12);
v22 = *(unsigned __int16 *)(v17 + 14);
if( !__PAIR32__(v22, v21) )
return -1073741686;
if( v17 + 8i64 * (unsigned int)(v21 + v22) > v20 )
return -1073741701;
}
*v42 = (VOID *)v17;
*NtHeaders = v12;
return v6;
}
return result;
}Referenced by:
LdrpResSearchResourceMappedFile