t8-mod/source/proxy-dll/demonware/protobuf_helper.cpp
project-bo4 354d022967 Squashed commit of the following:
commit f44d146e4ac906ff898e8968c6857fd2280f6d20
Author: project-bo4 <127137346+project-bo4@users.noreply.github.com>
Date:   Thu May 11 13:39:29 2023 -0700

    remove lpc package from repository

commit 29fb0f63e50de468ab0b9db35f7e8fdadf58afc3
Author: project-bo4 <themanwithantidote@gmail.com>
Date:   Thu May 11 13:06:13 2023 -0700

    generic improvements

    + added identity configuration
    + objectstore improvements
    + added battlenet 'US' servers to blocklist
    + some other minor improvements

commit 5d5e31099ebcce5a637b9a02d4936a97fb0802a7
Author: project-bo4 <themanwithantidote@gmail.com>
Date:   Sat Mar 25 16:32:52 2023 -0700

    lpc improvements

    + fix lpc issue with foreign languages(non-english) not being considered in listing
    + check lpc files pre-start and warn user if missing any of core items

commit 2de1a54b6f4cc5c44dc906871021cfbc85057ca9
Author: project-bo4 <themanwithantidote@gmail.com>
Date:   Thu Mar 23 12:45:56 2023 -0700

    demonware improvements

    + handle object store uploadUserObject
    + silence bdUNK125

commit 710dcc3ec6178071d67c27e5bf6705f08cabe7e2
Author: project-bo4 <themanwithantidote@gmail.com>
Date:   Mon Mar 20 13:43:56 2023 -0700

    forgot to update names

commit 217682dfb07b35f7a09399fb2698924bb7fe8b77
Author: project-bo4 <themanwithantidote@gmail.com>
Date:   Mon Mar 20 11:09:18 2023 -0700

    upload lpc and update readme

commit 83f812b33b90791a8d13b9468f27da51e0a4f2b9
Author: project-bo4 <themanwithantidote@gmail.com>
Date:   Mon Mar 20 10:53:43 2023 -0700

    demonware emulator

    + demonware emulator
    + platform name and id
    + xxhash and picoproto
    - remove g_runframe hook
    -disable discovery(save time)
    + improvements to utils
    + add new resources
2023-05-11 13:50:11 -07:00

110 lines
3.0 KiB
C++

#include <std_include.hpp>
#include "protobuf_helper.hpp"
#include "ida_defs.h"
bdProtobufHelper::bdProtobufHelper() {}
bdProtobufHelper::~bdProtobufHelper() {}
/* Yes we unlocked next level of copy-pasta; someone bring the trophy :) */
bool bdProtobufHelper::encodeVarInt(uint64_t value)
{
__int64 v2; // rbx
unsigned __int64 v4; // rax
char v5; // cl
char valuea[16]; // [rsp+20h] [rbp-28h] BYREF
v2 = 0i64;
if (value)
{
do
{
if ((unsigned int)v2 >= 0xA)
break;
v4 = value;
v5 = value | 0x80;
value >>= 7;
valuea[v2] = v5;
v2 = (unsigned int)(v2 + 1);
} while (v4 >= 0x80);
valuea[(unsigned int)(v2 - 1)] &= 0x7Fu;
}
else
{
valuea[0] = 0;
LODWORD(v2) = 1;
}
//return bdStructSerializationOutputStream::write(stream, valuea, v2) == (_DWORD)v2;
this->buffer.append(std::string(valuea, v2));
this->length += v2;
return true;
}
bool bdProtobufHelper::encodeVarInt(int64_t value)
{
unsigned __int64 v2; // rax
v2 = 2 * value;
if (value < 0)
v2 = ~v2;
return bdProtobufHelper::encodeVarInt(v2);
}
bool bdProtobufHelper::encodeString(const char* value, uint32_t len)
{
bool result; // al
result = bdProtobufHelper::encodeVarInt(static_cast<uint64_t>(len));
if (result)
{
this->buffer.append(std::string(value, len));
this->length += len;
}
//result = bdStructSerializationOutputStream::write(stream, value, len) == len;
return result;
}
bool bdProtobufHelper::encodeTag(uint32_t tagId, eWireType wireType)
{
unsigned __int64 tag = (int)wireType | (8i64 * tagId);
return bdProtobufHelper::encodeVarInt(tag);
}
bool bdProtobufHelper::writeInt64(uint32_t tag, int64_t value)
{
return bdProtobufHelper::encodeTag(tag, WIRETYPE_VARINT) && bdProtobufHelper::encodeVarInt(value);
}
bool bdProtobufHelper::writeUInt64(uint32_t tag, uint64_t value)
{
return bdProtobufHelper::encodeTag(tag, WIRETYPE_VARINT) && bdProtobufHelper::encodeVarInt(value);
}
bool bdProtobufHelper::writeInt32(uint32_t tag, int32_t value)
{
return bdProtobufHelper::encodeTag(tag, WIRETYPE_VARINT) && bdProtobufHelper::encodeVarInt(static_cast<int64_t>(value));
}
bool bdProtobufHelper::writeUInt32(uint32_t tag, uint32_t value)
{
return bdProtobufHelper::encodeTag(tag, WIRETYPE_VARINT) && bdProtobufHelper::encodeVarInt(static_cast<uint64_t>(value));
}
bool bdProtobufHelper::writeString(uint32_t tag, const char* value, uint32_t size)
{
unsigned int v5; // edi
const void* v8; // rax
v5 = size;
v8 = memchr(value, 0, size);
if (v8)
v5 = (_DWORD)v8 - (_DWORD)value;
return bdProtobufHelper::encodeTag(tag, WIRETYPE_STRING) && bdProtobufHelper::encodeString(value, v5);
}
bool bdProtobufHelper::writeBlob(uint32_t tag, void* buffer, uint32_t size)
{
return bdProtobufHelper::encodeTag(tag, WIRETYPE_STRING) && bdProtobufHelper::encodeString(reinterpret_cast<const char*>(buffer), size);
}