egg (or chicken)
Signed-off-by: Arthur Khachaturov <me@wzray.ru>
This commit is contained in:
commit
8ed52d1c79
20 changed files with 11719 additions and 0 deletions
18
puppy/src/COMWrapper.cpp
Normal file
18
puppy/src/COMWrapper.cpp
Normal 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);
|
||||
}
|
28
puppy/src/PromtCtlDirection.cpp
Normal file
28
puppy/src/PromtCtlDirection.cpp
Normal 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);
|
||||
}
|
71
puppy/src/PromtCtlDocument.cpp
Normal file
71
puppy/src/PromtCtlDocument.cpp
Normal 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;
|
||||
};
|
30
puppy/src/PromtFTManager.cpp
Normal file
30
puppy/src/PromtFTManager.cpp
Normal 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);
|
||||
}
|
18
puppy/src/PromtFileTranslator.cpp
Normal file
18
puppy/src/PromtFileTranslator.cpp
Normal 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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue