LdrpResGetResourceDirectory

INT64 __fastcall LdrpResGetResourceDirectory(
        VOID *ModuleBase,
        UINT64 MappingSize,
        UINT64 Flags,
        VOID **TopResourceDirectory,
        VOID **NtHeaders){
  UINT64 v5; 
  unsigned int v6; 
  char v7; 
  bool v8; 
  int v9; 
  INT64 result; 
  _IMAGE_SECTION_HEADER *v11; 
  PIMAGE_NT_HEADERS v12; 
  _IMAGE_OPTIONAL_HEADER64 *p_OptionalHeader; 
  unsigned __int16 Magic; 
  unsigned int v15; 
  unsigned int v16; 
  ULONGLONG v17; 
  UINT64 v18; 
  _IMAGE_SECTION_HEADER *v19; 
  unsigned __int64 v20; 
  int v21; 
  int v22; 
  ULONGLONG pullResult; 
  ULONGLONG 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; 
  PIMAGE_NT_HEADERS NtHeader; 
  UINT64 MappingSizea; 
  VOID **v42; 
  v42 = TopResourceDirectory;
  MappingSizea = MappingSize;
  v5 = (UINT64)ModuleBase;
  v6 = 0;
  v24 = 0i64;
  NtHeader = 0i64;
  v7 = 1;
  v8 = 1;
  pullResult = 0i64;
  if( !ModuleBase || !TopResourceDirectory || !NtHeaders )
    return 3221225485i64;
  if( ((unsigned __int8)ModuleBase & 3) != 0 )
  {
    v5 = (unsigned __int64)ModuleBase & 0xFFFFFFFFFFFFFFFCui64;
    v8 = !((unsigned __int8)ModuleBase & 1);
  }
  v9 = Flags & 0x1000;
  LODWORD(result) = RtlImageNtHeaderEx(v9 == 0, (PVOID)v5, MappingSize, &NtHeader);
  if( (int)result >= 0 )
  {
    v12 = NtHeader;
    p_OptionalHeader = &NtHeader->OptionalHeader;
    Magic = NtHeader->OptionalHeader.Magic;
    if( Magic == 267 )
    {
      v25 = *(_OWORD *)&p_OptionalHeader->Magic;
      v26 = *(_OWORD *)&NtHeader->OptionalHeader.AddressOfEntryPoint;
      v27 = *(_OWORD *)&NtHeader->OptionalHeader.SectionAlignment;
      v28 = *(_OWORD *)&NtHeader->OptionalHeader.MajorSubsystemVersion;
      v29 = *(_OWORD *)&NtHeader->OptionalHeader.CheckSum;
      v30 = *(_OWORD *)&NtHeader->OptionalHeader.SizeOfStackCommit;
      v31 = *(_OWORD *)&NtHeader->OptionalHeader.SizeOfHeapCommit;
      ullAddend = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[0].VirtualAddress;
      v33 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[2].VirtualAddress;
      v34 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[4].VirtualAddress;
      v35 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[6].VirtualAddress;
      v36 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[8].VirtualAddress;
      v37 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[10].VirtualAddress;
      v38 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[12].VirtualAddress;
    }
    else
    {
      if( Magic != 523 )
        return(unsigned int)-1073741701;
      v25 = *(_OWORD *)&p_OptionalHeader->Magic;
      v26 = *(_OWORD *)&NtHeader->OptionalHeader.AddressOfEntryPoint;
      v27 = *(_OWORD *)&NtHeader->OptionalHeader.SectionAlignment;
      v28 = *(_OWORD *)&NtHeader->OptionalHeader.MajorSubsystemVersion;
      v29 = *(_OWORD *)&NtHeader->OptionalHeader.CheckSum;
      v30 = *(_OWORD *)&NtHeader->OptionalHeader.SizeOfStackCommit;
      v31 = *(_OWORD *)&NtHeader->OptionalHeader.SizeOfHeapCommit;
      ullAddend = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[0].VirtualAddress;
      v33 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[2].VirtualAddress;
      v34 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[4].VirtualAddress;
      v35 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[6].VirtualAddress;
      v36 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[8].VirtualAddress;
      v37 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[10].VirtualAddress;
      v38 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[12].VirtualAddress;
      v39 = *(_OWORD *)&NtHeader->OptionalHeader.DataDirectory[14].VirtualAddress;
      v7 = 0;
    }
    v15 = HIDWORD(v31);
    if( v7 )
      v15 = HIDWORD(v30);
    if( v15 <= 2 )
    {
      return(unsigned int)-1073741687;
    }
    else
    {
      v16 = v33;
      if( v7 )
        v16 = ullAddend;
      if( v16 )
      {
        if( v5 < 0x7FFFFFFEFFFFi64 && v5 + v16 >= 0x7FFFFFFEFFFFi64 )
        {
          return(unsigned int)-1073741701;
        }
        else
        {
          if( v8 || v16 < HIDWORD(v28) )
          {
            if( RtlULongLongAdd(v5, v16, &pullResult) < 0 )
              return(unsigned int)-1073741701;
            v17 = pullResult;
            v24 = pullResult;
            v18 = MappingSizea;
          }
          else
          {
            v18 = MappingSizea;
            v19 = LdrpSectionTableFromVirtualAddress((PVOID)v5, MappingSizea, NtHeader, v11);
            if( !v19 )
              return(unsigned int)-1073741701;
            if( !*((_DWORD *)v19 + 4) )
              return(unsigned int)-1073741687;
            v17 = v5 + *((unsigned int *)v19 + 5) - (unsigned __int64)*((unsigned int *)v19 + 3) + v16;
            v24 = v17;
          }
          if( !v17 )
            return(unsigned int)-1073741687;
          if( v9 )
          {
            if( v17 <= v5 )
              return(unsigned int)-1073741701;
            v20 = (v5 & 0xFFFFFFFFFFFFFFFCui64) + v18;
            if( v17 + 16 > v20 )
              return(unsigned int)-1073741701;
            v21 = *(unsigned __int16 *)(v17 + 12);
            v22 = *(unsigned __int16 *)(v17 + 14);
            if( !__PAIR32__(v22, v21) )
              return(unsigned int)-1073741686;
            if( v17 + 8i64 * (unsigned int)(v21 + v22) > v20 )
              return(unsigned int)-1073741701;
          }
          *v42 = (VOID *)v17;
          *NtHeaders = v12;
        }
      }
      else
      {
        return(unsigned int)-1073741687;
      }
    }
    return v6;
  }
  return result;
}

Referenced by:

LdrpResSearchResourceMappedFile