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.