RtlUnicodeStringCat
INT64 __stdcall RtlUnicodeStringCat(_UNICODE_STRING *DestinationString, const _UNICODE_STRING *SourceString){
ULONG v2;
unsigned int v3;
__int64 v5;
INT64 result;
unsigned __int16 *v8;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 Length;
wchar_t *Buffer;
unsigned __int64 v13;
int v14;
unsigned __int16 MaximumLength;
__int16 v16;
unsigned __int64 v17;
__int64 v18;
v3 = 0;
v5 = 0i64;
LODWORD(result) = RtlUnicodeStringValidateWorker(DestinationString, (const size_t)SourceString, v2);
if( (int)result >= 0 )
{
if( v8 )
{
v5 = *((_QWORD *)v8 + 1);
v9 = (unsigned __int64)v8[1] >> 1;
v10 = (unsigned __int64)*v8 >> 1;
}
Length = SourceString->Length;
Buffer = 0i64;
v13 = 0i64;
v14 = 0;
if( (Length & 1) != 0
|| (MaximumLength = SourceString->MaximumLength, (MaximumLength & 1) != 0)
|| (unsigned __int16)Length > MaximumLength
|| MaximumLength == 0xFFFF
|| !SourceString->Buffer && ((_WORD)Length || MaximumLength) )
{
v14 = -1073741811;
}
else
{
Buffer = SourceString->Buffer;
v13 = Length >> 1;
}
if( v14 < 0 )
{
return(unsigned int)v14;
}
else
{
v16 = 0;
v17 = v9 - v10;
if( v17 )
{
v18 = v5 + 2 * v10 - (_QWORD)Buffer;
while( v13 )
{
--v13;
*(wchar_t *)((char *)Buffer + v18) = *Buffer;
++v16;
++Buffer;
if( !--v17 )
goto LABEL_15;
}
}
else
{
LABEL_15:
if( v13 )
v3 = -2147483643;
}
result = v3;
DestinationString->Length = 2 * (v16 + v10);
}
}
return result;
}Referenced by:
CmpDoWritethroughReparse
CmpGetSymbolicLinkTarget
CmpLogTransactionAbortedWithChildName
CmpVEExecuteVirtualStoreParseLogic
PopGenerateDeviceFriendlyName
PopIdleWakeGenerateDescriptionString
SshpGenerateDeviceFriendlyName