LdrpResCompareResourceNames

NTSTATUS __stdcall LdrpResCompareResourceNames(
        VOID *ModuleBase,
        VOID *FileHandle,
        UINT64 MappingSize,
        UINT64 ResourceName,
        const _IMAGE_RESOURCE_DIRECTORY *ResourceDirectory,
        const _IMAGE_RESOURCE_DIRECTORY_ENTRY *ResourceDirectoryEntry,
        UINT64 Flags,
        INT64 *Return){
  NTSTATUS v9; 
  __int64 Name; 
  unsigned __int16 *v13; 
  NTSTATUS v14; 
  __int64 v15; 

  v9 = 0;
  if( ResourceDirectory && ResourceDirectoryEntry )
  {
    Name = ResourceDirectoryEntry->Name;
    if( (ResourceName & 0xFFFFFFFFFFFF0000ui64) != 0 )
    {
      if( (int)Name >= 0 )
      {
        *(_DWORD *)Return = -1;
        return v9;
      }
      LODWORD(Name) = Name & 0x7FFFFFFF;
      v13 = (unsigned __int16 *)((char *)ResourceDirectory + Name);
      if( (Flags & 0x1000) != 0
        && (v13 < (unsigned __int16 *)ResourceDirectory
         || (unsigned __int64)v13 > MappingSize + ((unsigned __int64)ModuleBase & 0xFFFFFFFFFFFFFFFCui64))
        || ((unsigned __int64)(v13 + 1) & 0xFFFFFFFFFFFF0000ui64) == 0 )
      {
        return -1073741701;
      }
      v14 = wcsncmp((const WCHAR *)ResourceName, v13 + 1, *v13);
      if( v14 )
        goto LABEL_18;
      v15 = -1i64;
      do
        ++v15;
      while( *(_WORD *)(ResourceName + 2 * v15) );
      if( v15 == *v13 )
      {
LABEL_18:
        *(_DWORD *)Return = v14;
        return v9;
      }
    }
    else
    {
      if( (int)Name >= 0 )
      {
        if( (Flags & 0x1000) == 0 || (Name & 0xFFFFFFFFFFFF0000ui64) == 0 )
        {
          *(_DWORD *)Return = ResourceName - Name;
          return v9;
        }
        return -1073741701;
      }
      if( (Flags & 0x1000) != 0 && (Name & 0xFFFFFFFFFFFF0000ui64) == 0 )
        return -1073741701;
    }
    *(_DWORD *)Return = 1;
    return v9;
  }
  return -1073741811;
}

Referenced by:

LdrpResSearchResourceInsideDirectory