LdrEnumResources
NTSTATUS __fastcall LdrEnumResources(UINT64 a1, UINT64 *a2, UINT64 a3, UINT64 *a4, INT64 a5){
unsigned int v5;
unsigned int v7;
UINT64 *v8;
unsigned int v9;
unsigned __int16 *v10;
INT64 v11;
INT64 v12;
int v14;
UINT64 *v15;
int v16;
NTSTATUS v17;
bool v18;
INT64 v19;
const WCHAR *v20;
NTSTATUS v21;
__int64 v22;
__int64 v23;
INT64 v24;
UINT64 *v25;
int v26;
int v27;
const WCHAR *v28;
NTSTATUS v29;
__int64 v30;
__int64 v31;
INT64 v32;
UINT64 *v33;
int v34;
int v35;
__int64 v36;
__int64 v37;
INT64 v38;
unsigned int v39;
unsigned int v40;
unsigned int v41;
unsigned int v42;
unsigned int v43;
int v44;
int v45;
unsigned int v46;
unsigned int v49;
UINT64 Size;
v49 = a3;
v5 = 0;
v7 = a3;
v8 = a2;
v9 = 0;
v41 = 0;
if( a5 )
v42 = *(_DWORD *)a4;
else
v42 = 0;
*(_DWORD *)a4 = 0;
v10 = (unsigned __int16 *)RtlImageDirectoryEntryToData((VOID *)a1, 1u, 2u, &Size);
v12 = (INT64)v10;
if( !v10 )
return -1073741687;
v14 = v10[7];
v15 = (UINT64 *)(v10 + 8);
v16 = v10[6];
v17 = 0;
v18 = v16 + v14 == 0;
v19 = (unsigned int)(v16 + v14);
v45 = 0;
v40 = v19;
v44 = 0;
if( v18 )
{
LABEL_37:
*(_DWORD *)a4 = v9;
return v17;
}
while( v7 )
{
v20 = (const WCHAR *)*v8;
LOBYTE(Size) = 0;
v21 = LdrpCompareResourceNamesWithValidation(v19, v11, v20, v12, v15, &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
|| (v28 = (const WCHAR *)v8[1],
LOBYTE(Size) = 0,
v29 = LdrpCompareResourceNamesWithValidation(v19, v11, v28, v12, v25, &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( v49 <= 2
|| (LOBYTE(Size) = 0,
!LdrpCompareResourceNamesWithValidation(v19, v11, (const WCHAR *)a2[2], v12, v33, &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 = a5;
*(_QWORD *)(a5 + 8 * v11) = v24;
*(_QWORD *)(v38 + 8 * v11 + 8) = v32;
*(_QWORD *)(v38 + 8 * v11 + 16) = v19;
*(_QWORD *)(v38 + 8 * v11 + 24) = a1 + *(unsigned int *)(v36 + v12);
*(_QWORD *)(v38 + 8 * v11 + 32) = *(unsigned int *)(v36 + v12 + 4);
}
}
++v5;
++v33;
}
while( v5 < v46 );
v11 = v39;
}
v8 = a2;
v5 = 0;
v7 = v49;
}
++v25;
++v43;
}
while( v43 < (unsigned int)v11 );
v19 = v40;
}
goto LABEL_35;
}
return -1073741701;
}Referenced by:
No references.