Batch #5973 by superintelligence: 0 byte-identical, 1 confirmed by peer review. - fn_04789 CStoveMgr::OnInitializeCallback: logic confirmed by peer review Peer-reviewed-by: eAthena, alisonrag Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
189 lines
8.8 KiB
C++
189 lines
8.8 KiB
C++
#include "Client/Application/ApplicationWindow.h"
|
|
#include "Client/Session.h"
|
|
#include "Client/Stove/StoveMgr.h"
|
|
#include "Client/Stove/StovePCSDK.h"
|
|
#include "Network/TextEncoding.h"
|
|
#include "Utility/Cipher/XorBytes.h"
|
|
#include "Utility/Text/FormatString.h"
|
|
|
|
#include <algorithm>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <string>
|
|
#include <windows.h>
|
|
|
|
// GLOBAL: gl_24904
|
|
bool g_stoveWaitingCallback;
|
|
|
|
template <std::size_t Length, std::uint64_t Key>
|
|
class EncryptedName {
|
|
public:
|
|
explicit EncryptedName(const std::uint8_t (&source)[Length]) : m_encrypted(true) {
|
|
for (std::uint64_t index = 0; index < Length; ++index) {
|
|
this->m_text[index] = source[index];
|
|
}
|
|
}
|
|
|
|
~EncryptedName() {
|
|
for (std::uint64_t index = 0; index < Length; ++index) {
|
|
this->m_text[index] = 0;
|
|
}
|
|
}
|
|
|
|
const char* Text() {
|
|
if (this->m_encrypted) {
|
|
utility::XorBytes(this->m_text, Length, Key);
|
|
this->m_encrypted = false;
|
|
}
|
|
|
|
return reinterpret_cast<const char*>(this->m_text);
|
|
}
|
|
|
|
private:
|
|
/* 0000 */ std::uint8_t m_text[Length];
|
|
bool m_encrypted;
|
|
};
|
|
|
|
struct AccessTokenFailureMessage {
|
|
EncryptedName<100, 0x3375B1C7DBB5FD55ULL>& operator()() const;
|
|
};
|
|
|
|
struct UserFailureMessage {
|
|
EncryptedName<100, 0x151F77EBEBBB2147ULL>& operator()() const;
|
|
};
|
|
|
|
struct TokenCallbackFailureMessage {
|
|
EncryptedName<100, 0x4F1791FB1503C713ULL>& operator()() const;
|
|
};
|
|
|
|
struct PurchaseCheckingMessage {
|
|
EncryptedName<129, 0x2D3B15774149D5DDULL>& operator()() const;
|
|
};
|
|
|
|
// OFFSET: 0x0063CF60
|
|
// FUNCTION: fn_04786
|
|
EncryptedName<100, 0x3375B1C7DBB5FD55ULL>& AccessTokenFailureMessage::operator()() const {
|
|
const std::uint8_t source[] = {0x95, 0x18, 0x0B, 0x0D, 0x77, 0x10, 0x55, 0x8A, 0x8A, 0x46, 0x48, 0xFB, 0x00, 0x7E, 0xCA, 0x87,
|
|
0xE8, 0x3D, 0x01, 0x14, 0x73, 0x68, 0x5B, 0x13, 0xE5, 0x29, 0x75, 0x08, 0x07, 0x0A, 0x55, 0xF3,
|
|
0xB2, 0x40, 0x72, 0x1C, 0x27, 0x91, 0xB2, 0xEB, 0x94, 0x2B, 0x09, 0x67, 0x78, 0x55, 0x5B, 0x13,
|
|
0xEC, 0x53, 0x74, 0x7D, 0x77, 0x10, 0x55, 0xF2, 0xA3, 0x41, 0x66, 0x6E, 0x0E, 0x91, 0xC5, 0xD5,
|
|
0xEA, 0x11, 0x99, 0xFB, 0x94, 0xE5, 0x3A, 0x65, 0x10, 0xDD, 0x05, 0x36, 0x77, 0x05, 0xC9, 0x8D,
|
|
0x90, 0x30, 0x02, 0x15, 0xE7, 0x08, 0xDB, 0xF3, 0x92, 0xDD, 0x0C, 0x02, 0x71, 0x49, 0xC1, 0xFC,
|
|
0xE1, 0x24, 0x9B, 0xDB};
|
|
thread_local EncryptedName<sizeof(source), 0x3375B1C7DBB5FD55ULL> name(source);
|
|
return name;
|
|
}
|
|
|
|
// OFFSET: 0x0063D060
|
|
// FUNCTION: fn_04787
|
|
EncryptedName<100, 0x151F77EBEBBB2147ULL>& UserFailureMessage::operator()() const {
|
|
const std::uint8_t source[] = {0x87, 0xC4, 0x05, 0x3D, 0x5B, 0xD6, 0x3F, 0xAC, 0x98, 0x9A, 0x46, 0xCB, 0x2C, 0xB8, 0xA0, 0xA1,
|
|
0xFA, 0xE1, 0x0F, 0x24, 0x5F, 0xAE, 0x31, 0x35, 0xF7, 0xF5, 0x7B, 0x38, 0x2B, 0xCC, 0x3F, 0xD5,
|
|
0xA0, 0x9C, 0x7C, 0x2C, 0x0B, 0x57, 0xD8, 0xCD, 0x86, 0xF7, 0x07, 0x57, 0x54, 0x93, 0x31, 0x35,
|
|
0xFE, 0x8F, 0x7A, 0x4D, 0x5B, 0xD6, 0x3F, 0xD4, 0xB1, 0x9D, 0x68, 0x5E, 0x22, 0x57, 0xAF, 0xF3,
|
|
0xF8, 0xCD, 0x97, 0xCB, 0xB8, 0x23, 0x50, 0x43, 0x02, 0x01, 0x0B, 0x06, 0x5B, 0xC3, 0xA3, 0xAB,
|
|
0x82, 0xEC, 0x0C, 0x25, 0xCB, 0xCE, 0xB1, 0xD5, 0x80, 0x01, 0x02, 0x32, 0x5D, 0x8F, 0xAB, 0xDA,
|
|
0xF3, 0xF8, 0x95, 0xEB};
|
|
thread_local EncryptedName<sizeof(source), 0x151F77EBEBBB2147ULL> name(source);
|
|
return name;
|
|
}
|
|
|
|
// OFFSET: 0x0063D160
|
|
// FUNCTION: fn_04788
|
|
EncryptedName<100, 0x4F1791FB1503C713ULL>& TokenCallbackFailureMessage::operator()() const {
|
|
const std::uint8_t source[] = {0xD3, 0x22, 0xBD, 0xC3, 0x4B, 0x30, 0x37, 0xF6, 0xCC, 0x7C, 0xFE, 0x35, 0x3C, 0x5E, 0xA8, 0xFB,
|
|
0xAE, 0x07, 0xB7, 0xDA, 0x4F, 0x48, 0x39, 0x6F, 0xA3, 0x13, 0xC3, 0xC6, 0x3B, 0x2A, 0x37, 0x8F,
|
|
0xF4, 0x7A, 0xC4, 0xD2, 0x1B, 0xB1, 0xD0, 0x97, 0xD2, 0x11, 0xBF, 0xA9, 0x44, 0x75, 0x39, 0x6F,
|
|
0xAA, 0x69, 0xC2, 0xB3, 0x4B, 0x30, 0x37, 0x8E, 0xE5, 0x7B, 0xD0, 0xA0, 0x32, 0xB1, 0xA7, 0xA9,
|
|
0xAC, 0x2B, 0x2F, 0x35, 0xA8, 0xC5, 0x58, 0x19, 0x56, 0xE7, 0xB3, 0xF8, 0x4B, 0x25, 0xAB, 0xF1,
|
|
0xD6, 0x0A, 0xB4, 0xDB, 0xDB, 0x28, 0xB9, 0x8F, 0xD4, 0xE7, 0xBA, 0xCC, 0x4D, 0x69, 0xA3, 0x80,
|
|
0xA7, 0x1E, 0x2D, 0x15};
|
|
thread_local EncryptedName<sizeof(source), 0x4F1791FB1503C713ULL> name(source);
|
|
return name;
|
|
}
|
|
|
|
// OFFSET: 0x0063D260
|
|
// FUNCTION: fn_04789
|
|
void CStoveMgr::OnInitializeCallback(Stove::PCSDK::CallbackResult callbackResult) {
|
|
g_stoveWaitingCallback = false;
|
|
if (!callbackResult.GetResult().IsSuccessful()) {
|
|
const std::uint8_t captionSource[] = {0xD5, 0x3D, 0xF8, 0x60, 0x2C, 0x37, 0xD7};
|
|
thread_local EncryptedName<sizeof(captionSource), 0x31D7C1EDA345E36DULL> caption(captionSource);
|
|
const std::uint8_t messageSource[] = {0xCE, 0x63, 0xFB, 0xA9, 0xF9, 0xE6, 0x92, 0x13, 0xF5, 0x89, 0x87, 0x84, 0x67, 0xAA, 0xB5, 0x1F,
|
|
0x29, 0x14, 0x80, 0x99, 0x09, 0x9A, 0xBA, 0x6C, 0xA0, 0x89, 0xF7, 0x8B, 0x19, 0x8E, 0xB5, 0x68,
|
|
0x29, 0x68, 0xF9, 0xE8, 0x38, 0x9A, 0xA0, 0x67, 0xC6, 0x1D, 0x9E, 0x71, 0xD9};
|
|
thread_local EncryptedName<sizeof(messageSource), 0xD3755DD95F47A909ULL> message(messageSource);
|
|
MessageBoxA(hWnd, FormatOwnedString(message.Text()).c_str(), caption.Text(), MB_OK);
|
|
PostQuitMessage(0);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0063D490
|
|
// FUNCTION: fn_04790
|
|
EncryptedName<129, 0x2D3B15774149D5DDULL>& PurchaseCheckingMessage::operator()() const {
|
|
const std::uint8_t source[] = {0x63, 0x13, 0x89, 0x8D, 0xB2, 0xCE, 0x1B, 0x9C, 0x65, 0x6D, 0x8C, 0x61, 0xBF, 0xBB, 0xFB, 0xE3,
|
|
0xFD, 0x14, 0x96, 0x81, 0xA3, 0xA1, 0xF4, 0x99, 0x04, 0xFB, 0x67, 0x6F, 0x59, 0x1F, 0x31, 0x27,
|
|
0x83, 0xB3, 0x2F, 0x71, 0x47, 0x25, 0x0B, 0xEC, 0x0B, 0x15, 0x8E, 0x60, 0x57, 0x46, 0x4F, 0x42,
|
|
0xAB, 0xB0, 0x69, 0x87, 0x93, 0xD5, 0xF7, 0xEC, 0x2B, 0x6A, 0xE8, 0xFD, 0xDA, 0x35, 0x8A, 0x95,
|
|
0x65, 0x10, 0x69, 0xFE, 0xB8, 0xA2, 0xDA, 0x0D, 0x15, 0x11, 0x69, 0x1A, 0xBF, 0xBB, 0xFB, 0xE3,
|
|
0x80, 0xF5, 0xF0, 0xB7, 0xB1, 0xA5, 0xFB, 0x96, 0xFD, 0x61, 0xE4, 0xF6, 0xD8, 0xAB, 0xE4, 0x0D,
|
|
0x63, 0x13, 0x89, 0x8D, 0xB2, 0xCE, 0xFB, 0xE1, 0xFD, 0x14, 0xED, 0xFA, 0x84, 0x35, 0xFA, 0xDB,
|
|
0x6C, 0x0B, 0xFC, 0x8A, 0xC3, 0xDA, 0x8F, 0xF4, 0xF3, 0x8B, 0x79, 0x71, 0x47, 0x25, 0x0B, 0x1D,
|
|
0xDD};
|
|
thread_local EncryptedName<sizeof(source), 0x2D3B15774149D5DDULL> name(source);
|
|
return name;
|
|
}
|
|
|
|
// OFFSET: 0x0063DB80
|
|
// FUNCTION: fn_04794
|
|
void CSession::AddItem1784(const ITEM_INFO& item, int list) {
|
|
if (static_cast<unsigned int>(list) < 11) {
|
|
this->unknown_1784[list].push_back(item);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0063E390
|
|
// FUNCTION: fn_04796
|
|
const char* CStoveMgr::GetAccessToken() {
|
|
wchar_t accessToken[600];
|
|
std::memset(accessToken, 0, sizeof(accessToken));
|
|
Stove::PCSDK::Result result = Base_GetAccessToken(accessToken, 600);
|
|
if (result.IsSuccessful()) {
|
|
std::string token = EncodeText(CP_ACP, std::wstring(accessToken));
|
|
memcpy_s(this->m_accessToken, sizeof(this->m_accessToken), token.c_str(), std::min(sizeof(this->m_accessToken), token.size() + 1));
|
|
return this->m_accessToken;
|
|
}
|
|
|
|
const std::uint8_t source[] = {0xA7, 0xEF, 0x70, 0x24, 0x2C, 0x83, 0x6D};
|
|
thread_local EncryptedName<sizeof(source), 0x1D6D75EDE7CD311FULL> caption(source);
|
|
MessageBoxA(hWnd, FormatOwnedString(AccessTokenFailureMessage()().Text()).c_str(), caption.Text(), MB_OK);
|
|
PostQuitMessage(0);
|
|
return nullptr;
|
|
}
|
|
|
|
// OFFSET: 0x0063E700
|
|
// FUNCTION: fn_04797
|
|
void CStoveMgr::FetchUser() {
|
|
Stove::PCSDK::Base::StovePCUser user;
|
|
Stove::PCSDK::Result result = Base_GetUser(&user);
|
|
if (result.IsSuccessful()) {
|
|
StringFormat(this->m_memberNumber, sizeof(this->m_memberNumber), _TRUNCATE, "%llu", user.GetMemberNumber());
|
|
StringFormat(this->m_gameUserId, sizeof(this->m_gameUserId), _TRUNCATE, "%llu", user.GetGameUserId());
|
|
} else {
|
|
const std::uint8_t source[] = {0xB9, 0x89, 0x2A, 0x1C, 0xD2, 0x73, 0x53};
|
|
thread_local EncryptedName<sizeof(source), 0xD1538513DF975701ULL> caption(source);
|
|
MessageBoxA(hWnd, FormatOwnedString(UserFailureMessage()().Text()).c_str(), caption.Text(), MB_OK);
|
|
PostQuitMessage(0);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x0063F090
|
|
// FUNCTION: fn_04802
|
|
void CStoveMgr::WaitForCallback() {
|
|
g_stoveWaitingCallback = true;
|
|
do {
|
|
Base_RunCallback();
|
|
Sleep(200);
|
|
} while (g_stoveWaitingCallback);
|
|
}
|