RtlLoadString

INT64 __stdcall RtlLoadString(
        PVOID DllHandle,
        UINT16 StringId,
        const WCHAR *StringLanguage,
        UINT64 Flags,
        const WCHAR **ReturnString,
        UINT16 *ReturnStringLen,
        WCHAR *ReturnLanguageName,
        UINT64 *ReturnLanguageLen){
  UINT64 v8; 
  char v10; 
  UINT16 v12; 
  int v13; 
  unsigned __int16 v14; 
  int v15; 
  UINT16 v16; 
  UINT64 Size; 
  int v18; 
  VOID *Address; 
  PVOID ResourceDirectoryOrData; 
  const WCHAR **v21; 
  UINT64 InitResIds[4]; 
  v8 = StringId;
  v21 = ReturnString;
  ResourceDirectoryOrData = 0i64;
  Address = 0i64;
  v10 = Flags & 1;
  if( DllHandle && ReturnString && (Flags & 0xFFFFFFFE) == 0 )
  {
    if( v10 && (ReturnLanguageName || ReturnLanguageLen) )
      return 3221225659i64;
    if( (unsigned int)StringLanguage > 0xFFFF )
    {
      if( *StringLanguage )
      {
        v12 = DownLevelLanguageNameToLangID((PWCHAR)StringLanguage, 2ui64);
        LODWORD(StringLanguage) = v12;
        v18 = v12;
        if( !v12 )
          return 3221225485i64;
      }
      else
      {
        LODWORD(StringLanguage) = 0;
        v18 = 0;
      }
    }
    InitResIds[0] = 6i64;
    InitResIds[1] = ((unsigned int)v8 >> 4) + 1;
    InitResIds[2] = (unsigned int)StringLanguage;
    InitResIds[3] = v8;
    Size = 0i64;
    if( v10 )
    {
      v13 = LdrpSearchResourceSection_U(DllHandle, InitResIds, 4ui64, 1ui64, &ResourceDirectoryOrData);
      if( v13 < 0 )
        return(unsigned int)v13;
      v13 = LdrpAccessResourceData(
              DllHandle,
              (const _IMAGE_RESOURCE_DATA_ENTRY *)ResourceDirectoryOrData,
              &Address,
              0i64);
    }
    else
    {
      v13 = LdrResSearchResource(
              DllHandle,
              InitResIds,
              4ui64,
              1ui64,
              &Address,
              &Size,
              ReturnLanguageName,
              ReturnLanguageLen);
      if( v13 >= 0 && Size > 0xFFFF )
        v13 = -1073741701;
    }
    if( v13 >= 0 && Address )
    {
      v14 = 0;
      v15 = v8 & 0xF;
      Size >>= 1;
      do
      {
        v16 = *((_WORD *)Address + v14);
        v14 += v16 + 1;
        if( !v10 && v14 > Size )
          return(unsigned int)-1073741701;
        --v15;
      }
      while( v15 >= 0 );
      if( v14 && v16 )
        v14 -= v16;
      *v21 = (const WCHAR *)((char *)Address + 2 * v14);
      if( ReturnStringLen )
        *ReturnStringLen = v16;
    }
    return(unsigned int)v13;
  }
  return 3221225485i64;
}

Referenced by:

No references.