Skip to content

aowlspt_overlay.h

Source: abi/aowlspt_overlay.h — 12318 lines, 214 file-scope functions.

What this header owns

Reproduced verbatim from the header's own banner comment — these notes are frequently the only written record of why the subsystem is shaped the way it is.

text
 aowlspt_overlay.h — an in-game overlay for post-1.0 Tarkov, drawn by hand.

Pre-1.0, an in-game menu was `OnGUI` and Unity's IMGUI drew it for you. That
route is gone: IL2CPP has no managed assemblies, so there is no `MonoBehaviour`
to attach and no `GUI.Window` to call. Every BepInEx-era overlay — including
every "config manager" mod — is built on that and none of them can load.

The honest replacement is to draw the panel ourselves. The game renders
through D3D11, so a hook on `IDXGISwapChain::Present` gives a callback once
per frame with the device, the immediate context and the back buffer in hand
— after the game has finished its frame and before the flip. That is exactly
where an overlay belongs, and it is what Steam, Discord and RivaTuner all do.

------------------------------------------------------------------------
How the vtable is found, and why not by pattern scan
------------------------------------------------------------------------
A COM interface pointer is a pointer to a vtable, and every `IDXGISwapChain`
created by the same `dxgi.dll` shares one. So the address of the real
`Present` can be read out of *any* swap chain — including a 1x1 one we create
ourselves on a hidden window, use for nothing, and release immediately. That
is the whole trick: no signature scan, no version-specific offsets, nothing
that breaks when the game or the driver updates. `aowl_ov_capture_vtable`
below is ten lines and is correct by construction.

A pattern scan for the Present prologue would also work and is what a lot of
cheat-adjacent code does. It is strictly worse: it depends on the bytes of a
Microsoft DLL that Windows Update changes underneath you, and when it goes
wrong it detours the middle of an unrelated function.

The detour itself is `abi/aowlspt_detour.h` — the same engine `AowlHostApi.patch`
uses on IL2CPP methods, unmodified. It is used through `aowl_hook_install`
rather than `aowl_hook_attach`, because attach claims a slot in the fixed
thunk pool that mods' patches draw from; the overlay has its own detour
functions with the right signatures already, so it needs no thunk and takes
nothing from that pool.

------------------------------------------------------------------------
Render state: what is touched and what is put back
------------------------------------------------------------------------
Drawing inside Present means drawing on a context whose entire state belongs
to the game. Everything below is backed up before the overlay's draw and
restored after it, and every `*Get*` call is paired with a `Release` because
the D3D11 getters AddRef what they hand back — the classic version of this
bug leaks one device object per frame and takes the process down after a few
hours, which reads as "the game leaks memory in raid".

  IA: input layout, vertex buffer 0, index buffer, primitive topology
  VS: shader + class instances, constant buffer 0
  PS: shader + class instances, shader resource 0, sampler 0
  GS: shader + class instances;  HS/DS: shader only — see below
  RS: rasteriser state, viewports, scissor rects
  OM: blend state + factor + mask, depth-stencil state + ref,
      all 8 render targets + depth-stencil view

The GS/HS/DS entry is the one that is easy to skip and fatal to skip. We do
not *set* those stages, but the game's last draw may have left a geometry or
tessellation shader bound, and it would then run on our two triangles with an
input signature it was never written for. So they are explicitly nulled and
then restored.

Not covered, and said plainly rather than left to be discovered: stream
output targets (`SOSetTargets`), unordered access views bound through
`OMSetRenderTargetsAndUnorderedAccessViews`, and compute state. None of the
three affects our draw; a game that has stream output bound across Present
would see it survive, because we never touch it.

------------------------------------------------------------------------
Failure policy
------------------------------------------------------------------------
A crash in a Present hook takes the game down mid-raid, so every failure here
latches instead. `g_ov.broken` is set on any unrecoverable error and from
that point both detours are a straight tail call to the original — the hook
stays installed (removing it from inside itself is its own hazard) and the
game renders exactly as it would with no overlay at all. `aowl_ov_status`
reports why, so it shows up in the host log rather than as a black screen.

------------------------------------------------------------------------
Threads
------------------------------------------------------------------------
  render thread   the hooked Present. Draws. Reads the mod list under a lock.
                  Never blocks: no HTTP, no file IO, no allocation after the
                  first frame.
  window thread   the hooked WndProc. Records input into atomics.
  worker thread   polls the backend over HTTP and posts toggles. Owns every
                  blocking call on the steady-state path. The exception is
                  teardown: `aowl_ov_stop` runs on the host thread and both
                  waits on the worker and sleeps out the render thread.

Most of what is shared between them -- the `AowlOvMod` table, the lists,
entries, issues and results tables, the wrapper scalars and the mod-sync body
-- is under `g_ov.cs`, and the command queue with it. The key ring is the one
deliberate exception, single-producer/single-consumer between the window and
render threads and outside the lock; see the note above it for why.

Constants

  • AOWLSPT_OVERLAY_H
  • AOWL_CUR_PURE
  • AOWL_LOG_FACET_ALL
  • AOWL_LOG_FACET_SYSTEM
  • AOWL_OV_ACCENT
  • AOWL_OV_ATH
  • AOWL_OV_ATW
  • AOWL_OV_BG
  • AOWL_OV_BTN_W
  • AOWL_OV_CH
  • AOWL_OV_COST_SETTLE
  • AOWL_OV_CW
  • AOWL_OV_DETAIL_H
  • AOWL_OV_DIM
  • AOWL_OV_EDGE
  • AOWL_OV_ERR
  • AOWL_OV_FAINT
  • AOWL_OV_GHDR_H
  • AOWL_OV_GOOD
  • AOWL_OV_HEAD_H
  • AOWL_OV_HINT_FADE
  • AOWL_OV_HINT_HOLD
  • AOWL_OV_HINT_LATEST
  • AOWL_OV_HOT
  • AOWL_OV_HTTP_BUF
  • AOWL_OV_KEYS
  • AOWL_OV_LEGEND_H
  • AOWL_OV_LEGEND_MAX
  • AOWL_OV_LINE_H
  • AOWL_OV_LOG_CHUNK
  • AOWL_OV_LOG_FACETLEN
  • AOWL_OV_LOG_FACETS
  • AOWL_OV_LOG_MAX
  • AOWL_OV_LOG_MAXFAIL
  • AOWL_OV_LOG_POLL_MS
  • AOWL_OV_LOG_TAIL
  • AOWL_OV_LOG_TEXT
  • AOWL_OV_MAX_CMDS
  • AOWL_OV_MAX_DEPTH
  • AOWL_OV_MAX_ENTRIES
  • AOWL_OV_MAX_ISSUES
  • AOWL_OV_MAX_LISTS
  • AOWL_OV_MAX_MODS
  • AOWL_OV_MAX_NAV
  • AOWL_OV_MAX_RESULTS
  • AOWL_OV_MAX_SCATS
  • AOWL_OV_MAX_SITEMS
  • AOWL_OV_MAX_SPAGES
  • AOWL_OV_MAX_SPANS
  • AOWL_OV_MAX_THEMES
  • AOWL_OV_MAX_VERTS
  • AOWL_OV_OFF
  • AOWL_OV_ON
  • AOWL_OV_PAD
  • AOWL_OV_PANEBG
  • AOWL_OV_PANEL_H
  • AOWL_OV_PANEL_PAGE
  • AOWL_OV_PANEL_W
  • AOWL_OV_PANEL_X
  • AOWL_OV_PANEL_Y
  • AOWL_OV_PEND_MAX
  • AOWL_OV_POST_BODY
  • AOWL_OV_ROWALT
  • AOWL_OV_ROW_H
  • AOWL_OV_SDETAIL_H
  • AOWL_OV_SEARCH_BOX
  • AOWL_OV_SEARCH_H
  • AOWL_OV_SELBG
  • AOWL_OV_SLIDER_MAX_STEPS
  • AOWL_OV_SLOT_PRESENT
  • AOWL_OV_SLOT_RESIZE
  • AOWL_OV_SOPT_MAX
  • AOWL_OV_STAT_H
  • AOWL_OV_SYNC_MAX
  • AOWL_OV_TABS_H
  • AOWL_OV_TEXT
  • AOWL_OV_TEX_MAX
  • AOWL_OV_TITLEBG
  • AOWL_OV_TITLE_H
  • AOWL_OV_VERIFY_LOCAL_TRIES
  • AOWL_OV_VERIFY_PUSHES
  • AOWL_OV_VERIFY_SLICE
  • AOWL_OV_VERIFY_TRIES
  • AOWL_OV_VERIFY_WAIT
  • AOWL_OV_WARN
  • AOWL_OV_WHITE_U
  • AOWL_OV_WHITE_V
  • AOWL_OV_WRITE_QUIET_MS
  • AOWL_RGBA

Types

  • struct AowlOvCmd
  • struct AowlOvEntry
  • struct AowlOvIssue
  • struct AowlOvList
  • struct AowlOvLogLine
  • struct AowlOvMod
  • struct AowlOvPend
  • struct AowlOvResult
  • struct AowlOvSCat
  • struct AowlOvSItem
  • struct AowlOvSPage
  • struct AowlOvSaved
  • struct AowlOvSpan
  • struct AowlOvState
  • struct AowlOvTexEntry
  • struct AowlOvTheme
  • struct AowlOvVert

Functions

SignatureLine
void aowl_ov_set_pre_present(void* fn)1631
void aowl_ov_set_pre_resize(void* fn)1632
void aowl_ov_fail(const char* why)1634
void aowl_ov_note(const char* what)1643
int32_t aowl_ov_running(void)1650
int32_t aowl_ov_visible(void)1651
void aowl_ov_set_visible(int32_t on)1652
int32_t aowl_ov_frames(void)1655
int32_t aowl_ov_frame_ns(void)1656
int32_t aowl_ov_scale(void)1657
int32_t aowl_ov_frame_ns_max(void)1658
int32_t aowl_ov_status(char* buf, int32_t cap)1659
void aowl_ov_on_toggle(AowlOvToggleFn fn, void* user)1667
void aowl_ov_fmt(char* out, int32_t cap, const char* fmt, ...)1689
void aowl_ov_copy(char* dst, int32_t cap, const char* src)1701
int32_t aowl_ov_hexnib(char c)1794
int32_t aowl_ov_parse_hex(const char* s, uint32_t* out)1804
void aowl_ov_theme_kv(AowlOvTheme* T, const char* k, const char* v)1822
void aowl_ov_theme_parse(AowlOvTheme* T, const char* body)1862
int32_t aowl_ov_theme_find(const char* name)1891
void aowl_ov_theme_apply(const char* name)1901
void aowl_ov_themes_load(void)1913
AowlOvMod aowl_ov_row(const char* guid)1981
void aowl_ov_set_mod(const char* guid, const char* name, const char* version, int32_t enabled)2005
void aowl_ov_clear_mods(void)2036
int32_t aowl_ov_http_init(void)2087
int32_t aowl_ov_http(const wchar_t* verb, const wchar_t* path, const char* body, char* out, int32_t cap)2127
char aowl_ov_jws(const char* p, const char* e)2284
char aowl_ov_jstr_end(const char* p, const char* e)2290
char aowl_ov_jval_end(const char* p, const char* e)2301
char aowl_ov_jmem(const char* o, const char* e, const char* key)2329
char aowl_ov_jarr(const char* p, const char* e)2352
char aowl_ov_jnext(const char* p, const char* e)2362
void aowl_ov_jtext(const char* v, const char* e, char* out, int32_t cap)2372
int32_t aowl_ov_jbool(const char* v, const char* end, int32_t dflt)2416
int32_t aowl_ov_jisnull(const char* v, const char* end)2425
int32_t aowl_ov_jint(const char* v, const char* end, int32_t dflt)2431
void aowl_ov_jjoin(const char* v, const char* end, char* out, int32_t cap)2442
int32_t aowl_ov_intoken(const char* joined, const char* id)2463
int32_t aowl_ov_jwhole(const char* body, int32_t len)2484
void aowl_ov_jput(const char* o, const char* e, const char* key, char* dst, int32_t cap)2504
void aowl_ov_read_row_live(const char* it, const char* end, AowlOvMod* m)2537
void aowl_ov_read_panel(const char* body, int32_t len)2573
void aowl_ov_read_list(const char* body, int32_t len)2654
void aowl_ov_read_lists(const char* body, int32_t len)2684
void aowl_ov_read_conflicts(const char* body, int32_t len)2730
void aowl_ov_read_apply(const char* o, const char* end, const char* what)2763
void aowl_ov_read_reply(const char* body, int32_t len, const char* what)2793
char aowl_ov_jraw(const char* v, const char* end, char* out, int32_t cap)2912
int32_t aowl_ov_finite(float f)2931
float aowl_ov_jfloat(const char* v, const char* end, float dflt)2940
int32_t aowl_ov_skind(const char* t)2953
void aowl_ov_sval_text(AowlOvSItem* si)2969
void aowl_ov_sval_display(AowlOvSItem* si)2982
void aowl_ov_pend_clear(void)2995
int32_t aowl_ov_pend_find(const char* page, const char* key)3007
int32_t aowl_ov_pend_begin(const char* page, const char* key, const char* raw)3028
void aowl_ov_pend_settle(const char* skey, int32_t state)3059
void aowl_ov_pend_apply(void)3118
int32_t aowl_ov_path_add(char* out, int32_t cap, int32_t depth, const char* seg)3144
void aowl_ov_path_prefix(const char* path, int32_t d, char* out, int32_t cap)3164
char aowl_ov_path_leaf(const char* path)3175
int32_t aowl_ov_path_under(const char* path, const char* pre)3182
int32_t aowl_ov_read_one_item(const char* it, const char* end, AowlOvSItem* si)3189
int32_t aowl_ov_scmp(const AowlOvSItem* a, const AowlOvSItem* b)3314
void aowl_ov_sort_items(void)3325
void aowl_ov_build_cats(void)3356
int32_t aowl_ov_cats_wellformed(char* why, int32_t cap)3419
void aowl_ov_read_items(const char* body, int32_t len)3457
void aowl_ov_read_spt_index(const char* body, int32_t len)3563
void aowl_ov_read_settings_index(const char* body, int32_t len)3589
int32_t aowl_ov_page_all_hidden(const AowlOvSPage* P)3639
void aowl_ov_rebuild_pages(void)3644
int32_t aowl_ov_fetch(const wchar_t* verb, const wchar_t* path, const char* body, char* out, int32_t cap)3669
void aowl_ov_jsafe(const char* s, char* out, int32_t cap)3732
void aowl_ov_panel_schema(char* out, int32_t cap)3739
int32_t aowl_ov_panel_set(const char* key, const char* val)3818
void aowl_ov_settings_load(const char* pageId, int32_t isMod, char* buf, int32_t cap)3915
int32_t aowl_ov_settings_stage(const char* guid, const char* key, char* buf, int32_t cap, int32_t* known, int32_t* pending, int32_t* pushes)4064
int32_t aowl_ov_verify_match(const char* key, const char* sent, int32_t* found, const char** last)4099
void aowl_ov_settings_verify(const char* guid, const char* key, const char* sent, int32_t isMod, char* buf, int32_t cap)4123
void aowl_ov_settings_set(const AowlOvCmd* cmd, char* buf, int32_t cap)4243
void aowl_ov_log_paths(void)4293
int32_t aowl_ov_log_lvl(const char* w, int32_t n)4330
char aowl_ov_log_lvl_name(int32_t l)4339
uint32_t aowl_ov_log_lvl_col(int32_t l)4347
int32_t aowl_ov_log_intern(const char* name, int32_t n)4358
int32_t aowl_ov_log_facet(const char* msg, int32_t n)4383
void aowl_ov_log_append(int32_t src, const char* line, int32_t n)4407
void aowl_ov_log_pull(int32_t src, char* scratch, int32_t cap)4457
DWORD WINAPI aowl_ov_worker(LPVOID unused)4565
void aowl_ov_sync_start(const char* path, int32_t intervalMs)5001
int32_t aowl_ov_sync_pending(void)5014
int32_t aowl_ov_sync_attempts(void)5023
int32_t aowl_ov_sync_take(char* out, int32_t cap)5037
void aowl_ov_post_start(const char* path, const char* body)5059
int32_t aowl_ov_take_edit_kick(void)5075
int32_t aowl_ov_post_pending(void)5079
int32_t aowl_ov_post_stage(void)5090
void aowl_ov_pump_post(void)5119
int32_t aowl_ov_post_take(char* out, int32_t cap, int32_t* ok)5170
void aowl_ov_queue_cmd(int32_t kind, const char* arg, int32_t enabled)5193
void aowl_ov_queue(const char* guid, int32_t enabled)5223
void aowl_ov_queue_spage(const char* pageId, int32_t isMod)5231
void aowl_ov_queue_sset(const char* pageId, const char* key, const char* val)5244
void aowl_ov_vert(float x, float y, float u, float v, uint32_t col)5299
void aowl_ov_quad_uv(float x, float y, float w, float h, float u0, float v0, float u1, float v1, uint32_t col)5317
void aowl_ov_rect(float x, float y, float w, float h, uint32_t col)5328
void aowl_ov_frame_rect(float x, float y, float w, float h, float t, uint32_t col)5333
float aowl_ov_text(float x, float y, const char* s, uint32_t col)5344
void aowl_ov_release_targets(void)5369
void aowl_ov_release_all(void)5373
int32_t aowl_ov_make_font(void)5411
int32_t aowl_ov_make_device_objects(void)5452
int32_t aowl_ov_make_rtv(IDXGISwapChain* sc)5553
void aowl_ov_save(ID3D11DeviceContext* c, AowlOvSaved* s)5607
void aowl_ov_restore(ID3D11DeviceContext* c, AowlOvSaved* s)5636
int32_t aowl_ov_hit(float x, float y, float w, float h)5738
void aowl_ov_prefs_path(void)5762
void aowl_ov_prefs_default(void)5792
void aowl_ov_prefs_kv(const char* k, const char* v)5822
void aowl_ov_prefs_load(void)5836
void aowl_ov_prefs_save(void)5898
void aowl_ov_textn(float x, float y, const char* s, uint32_t col, int32_t cols)5937
int32_t aowl_ov_wrap_ex(float x, float y, const char* s, uint32_t col, int32_t cols, int32_t maxLines, int32_t draw)5962
int32_t aowl_ov_wrap(float x, float y, const char* s, uint32_t col, int32_t cols, int32_t maxLines)6007
int32_t aowl_ov_wrap_lines(const char* s, int32_t cols, int32_t maxLines)6015
void aowl_ov_snapshot(void)6028
char aowl_ov_filter_name(int32_t f)6082
int32_t aowl_ov_passes(const AowlOvMod* m, int32_t f)6089
int32_t aowl_ov_visible_rows(int32_t* out)6099
int32_t aowl_ov_protected(const char* guid)6134
void aowl_ov_act_toggle(const char* guid)6141
void aowl_ov_act_clear(const char* guid)6201
void aowl_ov_push_key(LONG vk)6219
int32_t aowl_ov_pop_key(LONG* vk)6227
int32_t aowl_ov_row_count(int32_t view, const int32_t* vis, int32_t visN)6236
void aowl_ov_move(int32_t view, int32_t delta, int32_t count)6248
void aowl_ov_keys(int32_t page, const int32_t* vis, int32_t visN)6274
void aowl_ov_health(char* out, int32_t cap, uint32_t* col)6451
void aowl_ov_tabs(float x, float y, float w, int32_t counts[AOWL_VIEW_COUNT])6476
char aowl_ov_run_word(const AowlOvMod* m)6525
char aowl_ov_client_why(const char* code)6540
void aowl_ov_client_line(const AowlOvMod* m, char* buf, int32_t cap, uint32_t* col)6571
void aowl_ov_view_mods(float x, float y, float w, float bodyH, const int32_t* vis, int32_t visN, int32_t rows)6631
void aowl_ov_view_lists(float x, float y, float w, float bodyH, int32_t rows)6823
void aowl_ov_view_issues(float x, float y, float w, float bodyH, int32_t rows)6912
void aowl_ov_view_apply(float x, float y, float w, float bodyH, int32_t rows)6969
int32_t aowl_ov_num_decimals(const AowlOvSItem* si)7122
void aowl_ov_num_str(const AowlOvSItem* si, float v, int32_t cols, char* out, int32_t cap)7158
void aowl_ov_s_fmt_num(AowlOvSItem* si, float v)7193
void aowl_ov_s_flush_now(void)7210
void aowl_ov_s_commit(AowlOvSItem* si)7221
void aowl_ov_s_flush_tick(void)7235
void aowl_ov_s_num_box(AowlOvSItem* si, int32_t at, float bx, float by, float bw, int32_t canEdit)7261
void aowl_ov_s_toggle_bool(AowlOvSItem* si)7329
void aowl_ov_s_cycle_enum(AowlOvSItem* si, int32_t dir)7336
void aowl_ov_s_adjust(AowlOvSItem* si, int32_t dir)7347
void aowl_ov_vk_name(LONG vk, char* out, int32_t cap)7363
char aowl_ov_vk_char(LONG vk)7385
char aowl_ov_vk_numchar(LONG vk)7409
int32_t aowl_ov_settings_rows(float bodyH)7444
int32_t aowl_ov_settings_page(float bodyH, int32_t rows)7460
int32_t aowl_ov_ci_find(const char* hay, const char* needle)7508
int32_t aowl_ov_smatch(const AowlOvSItem* si, const char* term)7524
void aowl_ov_search_refresh(void)7532
int32_t aowl_ov_searching(void)7548
int32_t aowl_ov_filt_pos(int32_t item)7554
int32_t aowl_ov_nav_open(int32_t ci, const char* selFull)7565
void aowl_ov_nav_reset_if_page_changed(void)7576
void aowl_ov_group_title(const AowlOvSItem* si, const char* base, char* out, int32_t cap)7597
int32_t aowl_ov_same_group(const AowlOvSItem* a, const AowlOvSItem* b)7622
void aowl_ov_settings_key(LONG vk, int32_t page)7630
void aowl_ov_view_settings(float x, float y, float w, float bodyH)8045
char aowl_ov_log_src_name(int32_t f)9285
char aowl_ov_log_lvlf_name(int32_t f)9296
char aowl_ov_log_facet_name(int32_t f)9306
int32_t aowl_ov_log_hit(const AowlOvLogLine* L, const char* term)9316
int32_t aowl_ov_log_pass(const AowlOvLogLine* L)9325
uint32_t aowl_ov_log_stamp(void)9352
void aowl_ov_log_refilter(void)9363
int32_t aowl_ov_log_searching(void)9382
void aowl_ov_log_cycle_facet(int32_t dir)9386
int32_t aowl_ov_logs_key(LONG vk, int32_t page, int32_t count)9406
void aowl_ov_view_logs(float x, float y, float w, float bodyH, int32_t rows)9453
void aowl_ov_refresh_display(void)9676
void aowl_ov_sig_add(uint32_t* h, int32_t v)9687
uint32_t aowl_ov_signature(void)9703
void aowl_ov_build(void)9828
void aowl_ov_draw(IDXGISwapChain* sc)10488
LRESULT CALLBACK aowl_ov_wndproc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)10604
void aowl_ov_attach_window(HWND hwnd)10911
int32_t aowl_ov_bind(IDXGISwapChain* sc)10935
uint32_t aowl_ov_admin_side_col(int32_t side)11000
int32_t aowl_ov_admin_active(void)11013
void aowl_ov_publish_cursor_panels(void)11070
void aowl_ov_span_begin(ID3D11ShaderResourceView* srv)11125
void aowl_ov_span_close(void)11156
DXGI_FORMAT aowl_ov_tex_dxgi(int32_t fmt)11163
ID3D11ShaderResourceView aowl_ov_tex_srv(uint64_t key, int64_t frame)11181
void aowl_ov_tex_quad(float x, float y, float w, float h, float u0, float v0, float u1, float v1, uint32_t tint)11268
void aowl_ov_tex_quad_rot(float x, float y, float w, float h, float u0, float v0, float u1, float v1, float rcos, float rsin, float px, float py, float clipX, float clipY, float clipW, float clipH, uint32_t tint)11292
void aowl_ov_region_append(void)11355
void aowl_ov_admin_append(void)11470
int32_t aowl_ov_hint_alpha(void)11658
void aowl_ov_hint_append(int32_t a)11702
int32_t aowl_ov_hint_state(void)11727
void aowl_ov_panel_rect(float* px, float* py, float* pw, float* ph)11738
int32_t aowl_ov_hint_frames(void)11767
HRESULT STDMETHODCALLTYPE aowl_ov_present(IDXGISwapChain* sc, UINT sync, UINT flags)11769
HRESULT STDMETHODCALLTYPE aowl_ov_resize(IDXGISwapChain* sc, UINT count, UINT w, UINT h, DXGI_FORMAT fmt, UINT flags)11924
int32_t aowl_ov_capture_vtable(void** outPresent, void** outResize)11964
int32_t aowl_ov_start(int32_t toggleVk, int32_t backendPort)12049
void aowl_ov_stop(void)12280

aoughwl — self-hosted platform for things n stuff. Contact / Support on Discord for access to the private backends.