LdrEnumResources
NTSTATUS __stdcall LdrEnumResources(
PVOID BaseAddress,
PLDR_RESOURCE_INFO ResourceInfo,
ULONG Level,
ULONG *ResourceCount,
LDR_ENUM_RESOURCE_INFO *Resources){
unsigned int v5;
ULONG v7;
PLDR_RESOURCE_INFO v8;
ULONG v9;
INT64 v10;
INT64 v11;
INT64 v12;
int v14;
UINT64 *v15;
int v16;
NTSTATUS v17;
bool v18;
INT64 v19;
const WCHAR *Type;
int v21;
__int64 v22;
__int64 v23;
ULONG_PTR v24;
UINT64 *v25;
int v26;
int v27;
const WCHAR *Name;
int v29;
__int64 v30;
__int64 v31;
ULONG_PTR v32;
UINT64 *v33;
int v34;
int v35;
__int64 v36;
__int64 v37;
LDR_ENUM_RESOURCE_INFO *v38;
unsigned int v39;
unsigned int v40;
ULONG v41;
ULONG v42;
unsigned int v43;
int v44;
int v45;
unsigned int v46;
UINT64 Size;
v5 = 0;
v7 = Level;
v8 = ResourceInfo;
v9 = 0;
v41 = 0;
if( Resources )
v42 = *ResourceCount;
else
v42 = 0;
*ResourceCount = 0;
LODWORD(v10) = RtlImageDirectoryEntryToData(BaseAddress, 1u, 2u, &Size);
v12 = v10;
if( !v10 )
return -1073741687;
v14 = *(unsigned __int16 *)(v10 + 14);
v15 = (UINT64 *)(v10 + 16);
v16 = *(unsigned __int16 *)(v10 + 12);
v17 = 0;
v18 = v16 + v14 == 0;
v19 = (unsigned int)(v16 + v14);
v45 = 0;
v40 = v19;
v44 = 0;
if( v18 )
{
LABEL_37:
*ResourceCount = v9;
return v17;
}
while( v7 )
{
Type = (const WCHAR *)v8->Type;
LOBYTE(Size) = 0;
v21 = LdrpCompareResourceNamesWithValidation(v19, v11, Type, v12, v15, (BYTE *)&Size);
v19 = v40;
if( !v21 )
break;
LABEL_35:
++v15;
if( ++v44 >= (unsigned int)v19 )
{
v9 = v41;
v17 = v45;
goto LABEL_37;
}
}
v22 = *((unsigned int *)v15 + 1);
if( (int)v22 < 0 )
{
v23 = *(unsigned int *)v15;
if( (int)v23 >= 0 )
{
v24 = *(unsigned __int16 *)v15;
}
else
{
LODWORD(v23) = v23 & 0x7FFFFFFF;
v24 = v12 + v23;
}
LODWORD(v22) = v22 & 0x7FFFFFFF;
v43 = 0;
v25 = (UINT64 *)(v22 + v12 + 16);
v26 = *(unsigned __int16 *)(v22 + v12 + 14);
v27 = *(unsigned __int16 *)(v22 + v12 + 12);
v18 = v27 + v26 == 0;
v11 = (unsigned int)(v27 + v26);
v39 = v11;
if( !v18 )
{
do
{
if( v7 <= 1
|| (Name = (const WCHAR *)v8->Name,
LOBYTE(Size) = 0,
v29 = LdrpCompareResourceNamesWithValidation(v19, v11, Name, v12, v25, (BYTE *)&Size),
v11 = v39,
!v29) )
{
v30 = *((unsigned int *)v25 + 1);
if( (int)v30 >= 0 )
return -1073741701;
v31 = *(unsigned int *)v25;
if( (int)v31 >= 0 )
{
v32 = *(unsigned __int16 *)v25;
}
else
{
LODWORD(v31) = v31 & 0x7FFFFFFF;
v32 = v12 + v31;
}
LODWORD(v30) = v30 & 0x7FFFFFFF;
v33 = (UINT64 *)(v30 + v12 + 16);
v34 = *(unsigned __int16 *)(v30 + v12 + 14);
v35 = *(unsigned __int16 *)(v30 + v12 + 12);
v18 = v35 + v34 == 0;
v19 = (unsigned int)(v35 + v34);
v46 = v19;
if( !v18 )
{
do
{
if( Level <= 2
|| (LOBYTE(Size) = 0,
!(unsigned int)LdrpCompareResourceNamesWithValidation(
v19,
v11,
(const WCHAR *)ResourceInfo->Language,
v12,
v33,
(BYTE *)&Size)) )
{
v36 = *((unsigned int *)v33 + 1);
if( (int)v36 < 0 )
return -1073741701;
v37 = *(unsigned int *)v33;
if( (int)v37 >= 0 )
{
v19 = *(unsigned __int16 *)v33;
}
else
{
LODWORD(v37) = v37 & 0x7FFFFFFF;
v19 = v12 + v37;
}
v11 = 5i64 * v41++;
if( v41 > v42 )
{
v45 = -1073741820;
}
else
{
v38 = Resources;
*(&Resources->Type + v11) = v24;
*(&v38->Name + v11) = v32;
*(&v38->Language + v11) = v19;
*((_QWORD *)&v38->Data + v11) = (char *)BaseAddress + *(unsigned int *)(v36 + v12);
*(&v38->Size + v11) = *(unsigned int *)(v36 + v12 + 4);
}
}
++v5;
++v33;
}
while( v5 < v46 );
v11 = v39;
}
v8 = ResourceInfo;
v5 = 0;
v7 = Level;
}
++v25;
++v43;
}
while( v43 < (unsigned int)v11 );
v19 = v40;
}
goto LABEL_35;
}
return -1073741701;
}Referenced by:
No references.