合并字符串
typedefNTSTATUS(__fastcall *fnRtlAppendLUnicodeStringToLUnicodeString)(LUNICODE_STRING *PathIn, LUNICODE_STRING *PathOut);
staticfnRtlAppendLUnicodeStringToLUnicodeStringRtlAppendLUnicodeStringToLUnicodeString;
typedefNTSTATUS(__stdcall *fnRtlConcatenateLUnicodeStrings)(ULONGFlag, ULONGCount, LUNICODE_STRINGStringIn[], LUNICODE_STRING *StringOut);
staticfnRtlConcatenateLUnicodeStringsRtlConcatenateLUnicodeStrings;
RtlAppendLUnicodeStringToLUnicodeString = (fnRtlAppendLUnicodeStringToLUnicodeString)GetProcAddress(phWCP, "RtlAppendLUnicodeStringToLUnicodeString");
RtlConcatenateLUnicodeStrings = (fnRtlConcatenateLUnicodeStrings)GetProcAddress(phWCP, "RtlConcatenateLUnicodeStrings");
LUNICODE_STRINGa1, a2, a3;
RtlInitLUnicodeString(&a1, L"a1");
RtlInitLUnicodeString(&a2, L"a2");
更多字符串的合并,把需要合并的字符串先放到一个数组中,把数组的长度与与数组的地址作为参数传入,即可得到合并后字符串。
LUNICODE_STRINGas[2] = { a1, a2 };
RtlConcatenateLUnicodeStrings(0, 2, as, &a3);
RtlConcatenateLUnicodeStrings(0, sizeof(as) / sizeof(LUNICODE_STRING), as, &a3);
如果我们一个一个地合并,就需要手动对目标字符串的空间进行重新分配:
LUNICODE_STRINGa1, a2, *a3 = newLUNICODE_STRING();
RtlInitLUnicodeString(&a1, L"a1");
RtlInitLUnicodeString(&a2, L"a2");
先为目标字符串a3 进行空间的分配
RtlAllocateLUnicodeString(a1.Length + 2 , a3);
把 a1 合并到 a3 中
RtlAppendLUnicodeStringToLUnicodeString(a1, a3);
再为先为目标字符串a3 进行空间的重新分配
RtlReallocateLUnicodeString(0, a3->Length + a2.Length, a3);
RtlAppendLUnicodeStringToLUnicodeString(a2, a3);
如果需要再合并,那就要再为目标字符串a3 进行空间的重新分配
RtlReallocateLUnicodeString(0, a3->Length + a2.Length, a3);
RtlAppendLUnicodeStringToLUnicodeString(a2, a3);
当然,也可以在第一次就为目标字符串分配足够的空间,比如:
RtlAllocateLUnicodeString(100, a3);
//-----(1012DFE0) --------------------------------------------------------
int __stdcall RtlConcatenateLUnicodeStrings(int a1, unsigned int a2,_DWORD *a3, int a4)
{
v4 =a3;
v23 =a3;
v5 =0;
i =(_DWORD *)-1073741595;
v6 =0;
if (!a4 )
{
}
v7 =a1 & 1;
*(_DWORD *)a4 = 0;
if (!(a1& 1) )
{
*(_DWORD *)(a4 + 4) = 0;
*(_DWORD *)(a4 + 8) = 0;
}
if (a1 & 0xFFFFFFFE|| (v8= a2)!= 0 && !a3)
{ }
v25 =0;
if (a2 )
{
v9 =(int)a3;
v21 =a3;
while (RtlIsLUnicodeStringValid(v9) )
{
v9 =(int)(v21+ 3);
++v25;
v21 +=3;
if (v25 >= a2 )
{
v4 =a3;
v6 =0;
v7 =a1 & 1;
goto LABEL_12;
}
}
goto LABEL_18;
}
LABEL_12:
v22 =0;
if (a2 )
{
for (i = v4; ; v4 = i )
{
v10 =*v4;
v24 =v10;
v11 =v6 + v10;
if (v11 < v6 || v11 <v24 )
break;
i +=3;
v6 =v11;
if (++v22 >=a2 )
goto LABEL_20;
}
v15 =-1073741675;
v16 =644;
v17 ="BUCL::Rtl::AddInPlaceWithOverflowCheck(&MaximumLength,Sources[i].Length)";
i =(_DWORD *)-1073741675;
goto LABEL_32;
}
LABEL_20:
if (!v7 )
{
v18 =RtlAllocateLUnicodeString(v6, a4);
goto LABEL_23;
}
if (v6 > *(_DWORD *)(a4 + 4) )
{
v18 =RtlReallocateLUnicodeString(0, v6, a4);
LABEL_23:
v15 =v18;
if (v18 < 0)
return v15;
v8 =a2;
}
if (!v8 )
return 0;
v19 =(int)a3;
while (1 )
{
v15 =RtlAppendLUnicodeStringToLUnicodeString(v19,a4);
if (v15 < 0)
break;
++v5;
v19 =(int)(v23+ 3);
v23 +=3;
if (v5 >= a2 )
return 0;
}
return v15;
}
//-----(1012D260) --------------------------------------------------------
int __fastcall RtlAppendLUnicodeStringToLUnicodeString(int a1, int a2)
{
v2 =a2;
v14 =-1073741595;
v3 =a1;
if (!a2 )
if (!RtlIsLUnicodeStringValid(a2) )
if (!v3 )
if (!RtlIsLUnicodeStringValid(v3) )
{ }
v6 =*(_DWORD*)v2; // a2 的长度
v7 =*(_DWORD*)(v2+ 4) - *(_DWORD *)v2;
v8 =*(_DWORD*)v3; // a1 的长度
v14 =v8;
if (v7 < v8 )
{
出错,退出
}
memcpy((void*)(*(_DWORD *)(v2 + 8) + 2 * (v6 >>1)), *(constvoid **)(v3 + 8), v8);
*(_DWORD *)v2 = v6 + v14;
return 0;
}
//-----(1012ED70) --------------------------------------------------------
int __stdcall RtlReallocateLUnicodeString(inta1, ULONG Size, int a3)
{
v10 =-1073741595;
if (a1 )
goto LABEL_12;
if (!a3 )
{
Windows::ErrorHandling::Rtl::CBaseFrame<Windows::ErrorHandling::Rtl::CVoidRaiseFrame>::SetInvalidParameter_NullPointer(&v10);
v8 =1306;
v9 ="Not-null check failed: String";
LABEL_7:
v7 ="RtlReallocateLUnicodeString";
v6 ="base\\lstring\\lunicode_string.cpp";
Windows::ErrorHandling::Rtl::CBaseFrame<Windows::ErrorHandling::Rtl::CVoidRaiseFrame>::ReportErrorOrigination(
&v10,
(int)&v6);
return v10;
}
if (Size & 1|| !RtlIsLUnicodeStringValid(a3) )
{
LABEL_12:
Windows::ErrorHandling::Rtl::CBaseFrame<Windows::ErrorHandling::Rtl::CVoidRaiseFrame>::SetInvalidParameter_NullPointer(&v10);
v8 =v3;
v9 =v4;
goto LABEL_7;
}
result =RtlReallocateLBlob(0,Size, a3);
if (result >= 0)
result =0;
return result;
}