1
0
Fork 0

egg (or chicken)

Signed-off-by: Arthur Khachaturov <me@wzray.ru>
This commit is contained in:
Arthur Khachaturov 2024-11-26 00:20:24 +03:00
commit 8ed52d1c79
No known key found for this signature in database
GPG key ID: CAC2B7EB6DF45D55
20 changed files with 11719 additions and 0 deletions

18
puppy/src/COMWrapper.cpp Normal file
View file

@ -0,0 +1,18 @@
#include "COMWrapper.hpp"
#include <cstdio>
#include <stdexcept>
#include <windows.h>
void COMWrapper::Raise(const HRESULT hr, const char *const ctx) const {
if (hr != 0) {
char msg[128];
snprintf(msg, 128, "[%s] Non-zero HRESULT value: 0x%x at: %s\n", classname(), hr, ctx);
printf(msg);
throw std::runtime_error(msg);
}
}
void COMWrapper::Release(const void *const cls) const {
if (cls) (void) (*(int(__thiscall **)(const void *, const void *))(*(DWORD *) cls + 8))(cls, cls);
}

View file

@ -0,0 +1,28 @@
#include "PromtCtlDirection.hpp"
#include <string>
#include <utility>
#include <windows.h>
const char *PromtCtlDirection::classname() const {
return m_classname;
}
std::wstring PromtCtlDirection::Translate(const std::wstring_view src) const {
BSTR src_b = SysAllocString(std::wstring(src).c_str());
BSTR dest = nullptr;
auto hr = (*(HRESULT(__stdcall **)(const void *, BSTR, VARIANTARG, BSTR *))(*(DWORD *) m_instance + 112))(m_instance, src_b, {}, &dest);
Raise(hr, "Translate");
// I want none of that callee managed memory crap
std::wstring result(dest);
SysFreeString(src_b);
SysFreeString(dest);
return result;
}
PromtCtlDirection::~PromtCtlDirection() {
Release(m_instance);
}

View file

@ -0,0 +1,71 @@
#include "PromtCtlDocument.hpp"
#include "PromtCtlDirection.hpp"
#include <windows.h>
PromtCtlDocument::PromtCtlDocument() {
void *p_unknown = nullptr;
void *p_svr_directions = nullptr;
void *p_svr_directions_ip = nullptr;
HRESULT hr = 0;
hr = CoGetClassObject(CLSID_PromtSvrDirectionsIP, CLSCTX_INPROC_SERVER, nullptr, IID_IPromtSvrDirectionsIP, &p_svr_directions_ip);
Raise(hr, "CoGetClassObject");
hr = (*(HRESULT(__stdcall **)(void *, unsigned int, const char *))(*(DWORD *) p_svr_directions_ip + 20))(p_svr_directions_ip,
0x80000002, k_registry_key);
Raise(hr, "SetRegistryKey");
hr = (*(HRESULT(__thiscall **)(void *, void *, DWORD, const GUID *, void *))(*(DWORD *) p_svr_directions_ip + 12))(
p_svr_directions_ip, p_svr_directions_ip, 0, &IID_IPromtSvrDirections, &p_svr_directions);
Raise(hr, "spCF->CreateInstance");
hr = (*(HRESULT(__stdcall **)(void *, const wchar_t *, const wchar_t *, VARIANTARG))(*(DWORD *) p_svr_directions + 28))(
p_svr_directions, k_client, k_common, {});
Raise(hr, "svr_directions->Initialize");
hr = CoCreateInstance(CLSID_PromtCtlDocument, nullptr, 0x17u, IID_IUnknown, &p_unknown);
Raise(hr, "CoCreateInstance");
hr = OleRun((LPUNKNOWN) p_unknown);
Raise(hr, "OleRun");
hr = (**(HRESULT(__stdcall ***)(void *, const GUID *, void *)) p_unknown)(p_unknown, &IID_IPromtCtlDocument, &m_instance);
Raise(hr, "CreatePromtCtlDocument");
Release(p_unknown);
VARIANTARG vararg{};
vararg.vt = 9;
*((DWORD *) &vararg + 2) = (DWORD) p_svr_directions;
hr = (*(HRESULT(__stdcall **)(void *, const wchar_t *, int, int, int, int, VARIANTARG))(*(DWORD *) m_instance + 28))(
m_instance, k_client, 0xa, 0, 0x80020004, 0, vararg);
Raise(hr, "ctl_document->Initialize");
Release(p_svr_directions_ip);
Release(p_svr_directions);
direction(Direction::kEngRus);
};
PromtCtlDocument::~PromtCtlDocument() {
Release(m_instance);
SysFreeString(k_client);
SysFreeString(k_common);
}
void PromtCtlDocument::direction(const Direction direction) {
if (m_direction != direction) {
auto hr = (*(HRESULT(__stdcall **)(const void *, Direction))(*(DWORD *) m_instance + 52))(m_instance, direction);
Raise(hr, "set_direction");
m_direction = direction;
}
}
PromtCtlDirection PromtCtlDocument::direction() const {
void *ctldir = nullptr;
auto hr = (*(HRESULT(__stdcall **)(const void *, const void *))(*(DWORD *) m_instance + 44))(m_instance, &ctldir);
Raise(hr, "get_direction");
return PromtCtlDirection(ctldir);
}
const char *PromtCtlDocument::classname() const {
return k_classname;
};

View file

@ -0,0 +1,30 @@
#include "PromtFTManager.hpp"
#include "PromtCtlDirection.hpp"
#include "PromtFileTranslator.hpp"
#include <windows.h>
PromtFTManager::PromtFTManager() {
void *p_unknown = nullptr;
auto hr = CoCreateInstance(CLSID_PromtFTManager, nullptr, 0x17u, IID_Inknown2, &p_unknown);
Raise(hr, "CoCreateInstance");
hr = (**(HRESULT(__stdcall ***)(LPVOID, const GUID *, LPVOID *)) p_unknown)(p_unknown, &IID_IPromtFTManager, &mInstance);
Raise(hr, "Create PromtFTManager instance");
Release(p_unknown);
}
PromtFileTranslator PromtFTManager::Translator(PromtFTManager::FileType ft, PromtCtlDirection &dir) const {
void *p_translator = nullptr;
VARIANTARG varg{.vt=2, .iVal=(short)ft};
HRESULT hr = (*(HRESULT(__thiscall **)(void *, void *, VARIANTARG, VARIANTARG, void *))(*(DWORD *) mInstance + 48))(
mInstance, mInstance, varg, varg, &p_translator);
Raise(hr, "Create file translator");
return PromtFileTranslator(p_translator, dir.m_instance);
};
PromtFTManager::~PromtFTManager() {
Release(mInstance);
}

View file

@ -0,0 +1,18 @@
#include "PromtFileTranslator.hpp"
#include <string>
void PromtFileTranslator::Translate(const std::string_view source_path, const std::string_view dest_path) const {
HRESULT hr;
BSTR src = SysAllocString(std::wstring(source_path.begin(), source_path.end()).c_str());
BSTR dest = SysAllocString(std::wstring(dest_path.begin(), dest_path.end()).c_str());
hr = (*(HRESULT(__stdcall **)(const void *, const void *, BSTR, BSTR, VARIANTARG))(*(DWORD *) mInstance + 80))(
mInstance, mDirection, src, dest, {});
Raise(hr, "yk");
SysFreeString(src);
SysFreeString(dest);
}
PromtFileTranslator::~PromtFileTranslator() {
Release(mInstance);
}