С выходом патча 5.2 в кеше появилсь новые типы строк.
В первых 2х байтах содержится длина строки (но не в чистом виде).
для получения длины строки клиент использует 2 функции:
Код:
unsigned int __thiscall CDataStore::GetStrLen(int this, int a2)
{
int v2; // edi@1
char v3; // cl@1
int v4; // ecx@2
unsigned int v5; // eax@2
unsigned int v6; // esi@3
int v7; // ecx@3
int v9; // [sp+Ah] [bp-6h]@0
unsigned __int8 v10; // [sp+Eh] [bp-2h]@3
unsigned __int8 v11; // [sp+Fh] [bp-1h]@2
v2 = this;
v3 = *(_BYTE *)(this + 5);
if ( v3 == 8 )
{
v4 = *(_DWORD *)v2;
v11 = 0;
CDataStore::GetInt8(v4, (int)&v11);
v5 = v11;
}
else
{
v6 = (unsigned int)*(_BYTE *)(v2 + 4) >> v3;
v7 = *(_DWORD *)v2;
v10 = 0;
CDataStore::GetInt8(v7, (int)&v10);
v5 = (v6 << *(_BYTE *)(v2 + 5)) | ((unsigned int)v10 >> (8 - *(_BYTE *)(v2 + 5)));
*(_BYTE *)(v2 + 4) = v10 << *(_BYTE *)(v2 + 5);
}
LOBYTE(v9) = 0;
return 16 * v5 | CDataStore::GetLoByte(v2, v9);
}
unsigned int __thiscall CDataStore::GetLoByte(int this, int a2)
{
int v2; // esi@1
unsigned __int8 v3; // cl@1
unsigned __int8 v4; // dl@2
unsigned int result; // eax@2
unsigned int v6; // edi@5
unsigned __int8 v7; // bl@5
char v8; // dl@5
unsigned int v9; // eax@5
char v10; // cl@5
unsigned __int8 v11; // [sp+7h] [bp-1h]@3
v2 = this;
v3 = *(_BYTE *)(this + 5);
if ( v3 > 4u )
{
v11 = 0;
if ( v3 == 8 )
{
CDataStore::GetInt8(*(_DWORD *)v2, (int)&v11);
result = (unsigned int)v11 >> 4;
*(_BYTE *)(v2 + 4) = 16 * v11;
*(_BYTE *)(v2 + 5) = 4;
}
else
{
v6 = (unsigned int)*(_BYTE *)(v2 + 4) >> v3;
CDataStore::GetInt8(*(_DWORD *)v2, (int)&v11);
v7 = v11;
v8 = *(_BYTE *)(v2 + 5) - 4;
v9 = (unsigned int)v11 >> (8 - v8);
v10 = *(_BYTE *)(v2 + 5) - 4;
*(_BYTE *)(v2 + 5) = v8;
result = (v6 << v10) | v9;
*(_BYTE *)(v2 + 4) = v7 << v10;
}
}
else
{
v4 = *(_BYTE *)(v2 + 4);
result = (unsigned int)v4 >> 4;
*(_BYTE *)(v2 + 4) = 16 * v4;
*(_BYTE *)(v2 + 5) = v3 + 4;
}
return result;
}
я попытался написать ридер таких строк, но увы - не получилось (видать где-то косячу), больше всего смущает такое:
v3 = *(_BYTE *)(this + 5);.
Собственно сам вопрос, от куда считается смещение, от начала потока DataStore или с текущей позиции, или что это вообще за оффсет?