天天看点

解析 SCZ 字符串

解析 SCZ 字符串

直接就定义成:

typedef WCHAR *PSCZ;

就是说,PSCZ 就是保存了WCHAR *的首地址。

真正的 SCZ 字符串有两部分组成:第一部分是字符串的长度,第二部分是字符串本身,字符串以空结尾。

//----- (1008EBD7)--------------------------------------------------------

int __fastcall SczAlloc(int *a1,unsigned int a2)

{

  v2 =a1;

  v3 =a2;

  if (!a1 )

    CbsUtil_Assert((int)"base\\cbs\\util\\cbsstr.cpp", 21, (int)"pscz");

  v4 =0;

  v8 =0;

  if (v3 > 0x3FFFFFFF)

  {

    v4 =-2147317563;

    CBSWdsLog(0x4000000, -2147317563, 1, "string sizetoo big");

    return v4;

  }

  if (!*v2 )

    goto LABEL_5;

  v4 =SczSize(*v2,&v8);

  if (v4 < 0)

  {

    CBSWdsLog(0x4000000, v4, 1, "Failed to get size of existing string");

    return v4;

  }

  if (v8 < v3 )

  {

    operator delete((void *)(*v2 - 4));

    *v2= 0;

LABEL_5:

    v5 =(unsigned int *)operatornew(2 * v3 +4);

    if (v5 )

    {

      *v5= v3;

      v6 =v5 + 1;

      *v2= (int)v6;

      *v6= 0;

    }

    else

    {

      v4 =-2147024882;

      CBSWdsLog(0x4000000, -2147024882, 1, "Failed to allocate string");

    }

    return v4;

  }

  if (v8 )

    *(_WORD *)*v2 = 0;

  if (!*v2 )

    goto LABEL_5;

  return v4;

}

//----- (000000018001064C)----------------------------------------------------

__int64 __fastcall SczAlloc(__int64 *a1,unsigned __int64 a2)

{

  v2 =a2;

  v3 =a1;

  if (!a1 )

    CbsUtil_Assert((__int64)"base\\cbs\\util\\cbsstr.cpp", 21i64, (__int64)"pscz");

  v11 =0i64;

  v4 =0;

  if (v2 > 0x3FFFFFFF)

  {

    v4 =-2147317563;

    v5 ="string sizetoo big";

LABEL_15:

    v7 =v4;

    goto LABEL_16;

  }

  if (!*v3 )

  {

LABEL_13:

    v8 =(unsigned __int64 *)operatornew(2 * v2 +8);

    if (v8 )

    {

      *v8= v2;

      v9 =v8 + 1;

      *v3= (__int64)v9;

      *v9= 0;

      return (unsigned int)v4;

    }

    v4 =-2147024882;

    v5 ="Failed to allocate string";

    goto LABEL_15;

  }

  v6 =SczSize(*v3,&v11);

  v4 =v6;

  if (v6 < 0)

  {

    v5 ="Failed to get size of existing string";

    v7 =v6;

LABEL_16:

    CBSWdsLog(0x4000000u,v7, (size_t *)1, v5);

    return (unsigned int)v4;

  }

  if (v2 > 0)

  {

    operator delete((void *)(*v3 - 8));

    *v3= 0i64;

    goto LABEL_13;

  }

  if (v11 )

    *(_WORD *)*v3 = 0;

  if (!*v3 )

    goto LABEL_13;

  return (unsignedint)v4;

}

//----- (1008C877)--------------------------------------------------------

int __fastcall SczSize(int a1, _DWORD *a2)

{

  v2 =a1;

  v3 =a2;

  if (!a1 )

    CbsUtil_Assert((int)"base\\cbs\\util\\cbsstr.cpp", 639, (int)"sz");

  if (!v3 )

    CbsUtil_Assert((int)"base\\cbs\\util\\cbsstr.cpp", 640, (int)"pcch");

  *v3= *(_DWORD *)(v2 - 4);

  return 0;

}

//----- (00000001800117C8)----------------------------------------------------

__int64 __fastcall SczSize(__int64 a1, _QWORD *a2)

{

  v2 =a2;

  v3 =a1;

  if (!a1 )

    CbsUtil_Assert((__int64)"base\\cbs\\util\\cbsstr.cpp", 639i64, (__int64)"sz");

  if (!v2 )

    CbsUtil_Assert((__int64)"base\\cbs\\util\\cbsstr.cpp", 640i64, (__int64)"pcch");

  *v2= *(_QWORD *)(v3 - 8);

  return 0i64;

}

继续阅读