Показать сообщение отдельно
Старый 11.03.2013, 12:58   #1
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию wdb string 5.2.0 Build 16650

С выходом патча 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 или с текущей позиции, или что это вообще за оффсет?
__________________

Последний раз редактировалось Konctantin; 11.03.2013 в 13:07.
Konctantin вне форума   Ответить с цитированием