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.