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.