合并字符串

179 篇文章 0 订阅
86 篇文章 0 订阅

合并字符串

 

 

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值