Сори, на работе сидел и колупал без IDA, исходя из текста
для полноты картины, вот функция чтения pagetextcache
Код:
int __thiscall sub_7ACBD0(void *this, int a2, int a3)
{
void *v3; // esi@1
int v4; // eax@1
int v5; // ST04_4@1
int v6; // eax@1
int v7; // ebx@1
int result; // eax@1
int v9; // [sp+10h] [bp-4h]@1
v3 = this;
v9 = 0;
CDataStore::GetInt32(&v9);
*(_DWORD *)v3 = v9;
a2 = 0;
CDataStore::GetInt32(&a2);
v4 = a2;
LOBYTE(a2) = 0;
v5 = a2;
*((_DWORD *)v3 + 1) = v4;
LOWORD(v9) = 2048;
v6 = sub_744280(v5);
v7 = v6;
*((_DWORD *)v3 + 2) = v6;
result = sub_410310((char *)v3 + 8, v6);
*((_BYTE *)v3 + v7 + 8) = 0;
return result;
}
а уже из нее вызывается функция получения длины строки:
Код:
int __thiscall sub_744280(int this, int a2)
{
int v2; // edi@1
char v3; // cl@1
unsigned int v4; // eax@2
unsigned int v5; // esi@3
int v7; // [sp+Ah] [bp-6h]@0
unsigned __int8 v8; // [sp+Eh] [bp-2h]@3
unsigned __int8 v9; // [sp+Fh] [bp-1h]@2
v2 = this;
v3 = *(_BYTE *)(this + 5);
if ( v3 == 8 )
{
v9 = 0;
CDataStore::GetInt8(&v9);
v4 = v9;
}
else
{
v5 = (unsigned int)*(_BYTE *)(v2 + 4) >> v3;
v8 = 0;
CDataStore::GetInt8(&v8);
v4 = (v5 << *(_BYTE *)(v2 + 5)) | ((unsigned int)v8 >> (8 - *(_BYTE *)(v2 + 5)));
*(_BYTE *)(v2 + 4) = v8 << *(_BYTE *)(v2 + 5);
}
LOBYTE(v7) = 0;
return 16 * v4 | sub_725A90(v7);
}
а та в свою очередь содержит еще часть
Код:
unsigned int __thiscall sub_725A90(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(&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(&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;
}