mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2026-09-15 03:45:09 -05:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4b3f92935 | ||
|
|
6a98ce1f59 | ||
|
|
5833197b03 |
21
Dockerfile.dev
Normal file
21
Dockerfile.dev
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
FROM --platform=amd64 debian:11.6-slim@sha256:f7d141c1ec6af549958a7a2543365a7829c2cdc4476308ec2e182f8a7c59b519
|
||||||
|
|
||||||
|
LABEL description="Development environment for bemanitools"
|
||||||
|
|
||||||
|
# mingw-w64-gcc has 32-bit and 64-bit toolchains
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
mingw-w64 \
|
||||||
|
mingw-w64-common \
|
||||||
|
make \
|
||||||
|
zip \
|
||||||
|
git \
|
||||||
|
clang-format \
|
||||||
|
python3-pip \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN pip3 install mdformat
|
||||||
|
|
||||||
|
RUN mkdir /bemanitools
|
||||||
|
WORKDIR /bemanitools
|
||||||
|
|
||||||
|
ENV SHELL /bin/bash
|
||||||
38
GNUmakefile
38
GNUmakefile
@@ -13,8 +13,10 @@ BUILDDIR ?= build
|
|||||||
|
|
||||||
builddir_docker := $(BUILDDIR)/docker
|
builddir_docker := $(BUILDDIR)/docker
|
||||||
|
|
||||||
docker_container_name := "bemanitools-build"
|
docker_build_container_name := "bemanitools-build"
|
||||||
docker_image_name := "bemanitools-build:latest"
|
docker_build_image_name := "bemanitools-build:latest"
|
||||||
|
docker_dev_container_name := "bemanitools-dev"
|
||||||
|
docker_dev_image_name := "bemanitools-dev:latest"
|
||||||
|
|
||||||
depdir := $(BUILDDIR)/dep
|
depdir := $(BUILDDIR)/dep
|
||||||
objdir := $(BUILDDIR)/obj
|
objdir := $(BUILDDIR)/obj
|
||||||
@@ -41,6 +43,7 @@ FORCE:
|
|||||||
|
|
||||||
.PHONY: \
|
.PHONY: \
|
||||||
build-docker \
|
build-docker \
|
||||||
|
dev-docker \
|
||||||
clean \
|
clean \
|
||||||
code-format \
|
code-format \
|
||||||
doc-format \
|
doc-format \
|
||||||
@@ -89,21 +92,38 @@ version:
|
|||||||
$(V)echo "$(gitrev)" > version
|
$(V)echo "$(gitrev)" > version
|
||||||
|
|
||||||
build-docker:
|
build-docker:
|
||||||
$(V)docker rm -f $(docker_container_name) 2> /dev/null || true
|
$(V)docker rm -f $(docker_build_container_name) 2> /dev/null || true
|
||||||
$(V)docker \
|
$(V)docker \
|
||||||
build \
|
build \
|
||||||
-t $(docker_image_name) \
|
-t $(docker_build_image_name) \
|
||||||
-f Dockerfile \
|
-f Dockerfile.build \
|
||||||
.
|
.
|
||||||
$(V)docker \
|
$(V)docker \
|
||||||
run \
|
run \
|
||||||
--volume $(shell pwd):/bemanitools \
|
--volume $(shell pwd):/bemanitools \
|
||||||
--name $(docker_container_name) \
|
--name $(docker_build_container_name) \
|
||||||
$(docker_image_name)
|
$(docker_build_image_name)
|
||||||
|
|
||||||
|
dev-docker:
|
||||||
|
$(V)docker rm -f $(docker_dev_container_name) 2> /dev/null || true
|
||||||
|
$(V)docker \
|
||||||
|
build \
|
||||||
|
-t $(docker_dev_image_name) \
|
||||||
|
-f Dockerfile.dev \
|
||||||
|
.
|
||||||
|
$(V)docker \
|
||||||
|
run \
|
||||||
|
--interactive \
|
||||||
|
--tty \
|
||||||
|
--volume $(shell pwd):/bemanitools \
|
||||||
|
--name $(docker_dev_container_name) \
|
||||||
|
$(docker_dev_image_name)
|
||||||
|
|
||||||
clean-docker:
|
clean-docker:
|
||||||
$(V)docker rm -f $(docker_container_name) || true
|
$(V)docker rm -f $(docker_dev_container_name) || true
|
||||||
$(V)docker image rm -f $(docker_image_name) || true
|
$(V)docker image rm -f $(docker_dev_image_name) || true
|
||||||
|
$(V)docker rm -f $(docker_build_container_name) || true
|
||||||
|
$(V)docker image rm -f $(docker_build_image_name) || true
|
||||||
$(V)rm -rf $(BUILDDIR)
|
$(V)rm -rf $(BUILDDIR)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -220,6 +220,9 @@ void property_file_write(struct property *prop, const char *path);
|
|||||||
int property_set_flag(struct property *prop, int flags, int mask);
|
int property_set_flag(struct property *prop, int flags, int mask);
|
||||||
void property_destroy(struct property *prop);
|
void property_destroy(struct property *prop);
|
||||||
|
|
||||||
|
avs_error property_get_error(struct property *prop);
|
||||||
|
struct property *property_clear_error(struct property *prop);
|
||||||
|
|
||||||
int property_psmap_import(
|
int property_psmap_import(
|
||||||
struct property *prop,
|
struct property *prop,
|
||||||
struct property_node *root,
|
struct property_node *root,
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ EXPORTS
|
|||||||
property_destroy
|
property_destroy
|
||||||
property_file_write
|
property_file_write
|
||||||
property_insert_read
|
property_insert_read
|
||||||
|
property_clear_error
|
||||||
|
property_get_error
|
||||||
property_mem_write
|
property_mem_write
|
||||||
property_read_query_memsize
|
property_read_query_memsize
|
||||||
property_search
|
property_search
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ EXPORTS
|
|||||||
property_destroy
|
property_destroy
|
||||||
property_file_write
|
property_file_write
|
||||||
property_insert_read
|
property_insert_read
|
||||||
|
property_clear_error
|
||||||
|
property_get_error
|
||||||
property_mem_write
|
property_mem_write
|
||||||
property_read_query_memsize
|
property_read_query_memsize
|
||||||
property_search
|
property_search
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ EXPORTS
|
|||||||
property_desc_to_buffer @246 NONAME
|
property_desc_to_buffer @246 NONAME
|
||||||
property_destroy @247 NONAME
|
property_destroy @247 NONAME
|
||||||
property_insert_read @255 NONAME
|
property_insert_read @255 NONAME
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_node_create @266 NONAME
|
property_node_create @266 NONAME
|
||||||
property_node_datasize @267 NONAME
|
property_node_datasize @267 NONAME
|
||||||
property_node_name @274 NONAME
|
property_node_name @274 NONAME
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ EXPORTS
|
|||||||
property_desc_to_buffer @201 NONAME
|
property_desc_to_buffer @201 NONAME
|
||||||
property_destroy @264 NONAME
|
property_destroy @264 NONAME
|
||||||
property_insert_read @23 NONAME
|
property_insert_read @23 NONAME
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_node_create @316 NONAME
|
property_node_create @316 NONAME
|
||||||
property_node_datasize @249 NONAME
|
property_node_datasize @249 NONAME
|
||||||
property_node_name @255 NONAME
|
property_node_name @255 NONAME
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ EXPORTS
|
|||||||
property_desc_to_buffer @201 NONAME == XC058ba50000cd
|
property_desc_to_buffer @201 NONAME == XC058ba50000cd
|
||||||
property_destroy @264 NONAME == XC058ba500010f
|
property_destroy @264 NONAME == XC058ba500010f
|
||||||
property_insert_read @23 NONAME == XC058ba5000016
|
property_insert_read @23 NONAME == XC058ba5000016
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_node_create @316 NONAME == XC058ba5000143
|
property_node_create @316 NONAME == XC058ba5000143
|
||||||
property_node_datasize @249 NONAME == XC058ba5000100
|
property_node_datasize @249 NONAME == XC058ba5000100
|
||||||
property_node_name @255 NONAME == XC058ba5000106
|
property_node_name @255 NONAME == XC058ba5000106
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ EXPORTS
|
|||||||
property_desc_to_buffer @131 NONAME
|
property_desc_to_buffer @131 NONAME
|
||||||
property_destroy @130 NONAME
|
property_destroy @130 NONAME
|
||||||
property_insert_read @133 NONAME
|
property_insert_read @133 NONAME
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_node_name @573 NONAME ==
|
property_node_name @573 NONAME ==
|
||||||
property_node_read @573 NONAME ==
|
property_node_read @573 NONAME ==
|
||||||
property_node_remove @148 NONAME
|
property_node_remove @148 NONAME
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ EXPORTS
|
|||||||
property_desc_to_buffer @129 NONAME
|
property_desc_to_buffer @129 NONAME
|
||||||
property_destroy @128 NONAME
|
property_destroy @128 NONAME
|
||||||
property_insert_read @131 NONAME
|
property_insert_read @131 NONAME
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_node_create @145 NONAME
|
property_node_create @145 NONAME
|
||||||
property_node_name @150 NONAME
|
property_node_name @150 NONAME
|
||||||
property_node_read @154 NONAME == XCd229cc0000f3
|
property_node_read @154 NONAME == XCd229cc0000f3
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ EXPORTS
|
|||||||
property_destroy @125 NONAME
|
property_destroy @125 NONAME
|
||||||
property_desc_to_buffer @126 NONAME
|
property_desc_to_buffer @126 NONAME
|
||||||
property_insert_read @128 NONAME
|
property_insert_read @128 NONAME
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_search @141 NONAME
|
property_search @141 NONAME
|
||||||
property_node_create @142 NONAME
|
property_node_create @142 NONAME
|
||||||
property_node_name @147 NONAME == XCnbrep7000092
|
property_node_name @147 NONAME == XCnbrep7000092
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ EXPORTS
|
|||||||
property_destroy @146 NONAME
|
property_destroy @146 NONAME
|
||||||
property_desc_to_buffer @147 NONAME
|
property_desc_to_buffer @147 NONAME
|
||||||
property_insert_read @149 NONAME
|
property_insert_read @149 NONAME
|
||||||
|
property_clear_error @158 NONAME == XCnbrep700009d
|
||||||
|
property_get_error @159 NONAME == XCnbrep700009e
|
||||||
property_search @162 NONAME
|
property_search @162 NONAME
|
||||||
property_node_create @163 NONAME
|
property_node_create @163 NONAME
|
||||||
property_node_name @168 NONAME == XCnbrep70000a7
|
property_node_name @168 NONAME == XCnbrep70000a7
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ EXPORTS
|
|||||||
property_destroy @146 NONAME
|
property_destroy @146 NONAME
|
||||||
property_desc_to_buffer @147 NONAME
|
property_desc_to_buffer @147 NONAME
|
||||||
property_insert_read @149 NONAME
|
property_insert_read @149 NONAME
|
||||||
|
property_clear_error @158 NONAME == XCgsqzn000009d
|
||||||
|
property_get_error @159 NONAME == XCgsqzn000009e
|
||||||
property_search @162 NONAME
|
property_search @162 NONAME
|
||||||
property_node_create @163 NONAME
|
property_node_create @163 NONAME
|
||||||
property_node_name @168 NONAME == XCgsqzn00000a7
|
property_node_name @168 NONAME == XCgsqzn00000a7
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ EXPORTS
|
|||||||
property_destroy
|
property_destroy
|
||||||
property_file_write
|
property_file_write
|
||||||
property_insert_read
|
property_insert_read
|
||||||
|
property_clear_error
|
||||||
|
property_get_error
|
||||||
property_mem_write
|
property_mem_write
|
||||||
property_read_query_memsize
|
property_read_query_memsize
|
||||||
property_search
|
property_search
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ EXPORTS
|
|||||||
property_desc_to_buffer @129 NONAME
|
property_desc_to_buffer @129 NONAME
|
||||||
property_destroy @128 NONAME
|
property_destroy @128 NONAME
|
||||||
property_insert_read @131 NONAME
|
property_insert_read @131 NONAME
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_node_create @145 NONAME
|
property_node_create @145 NONAME
|
||||||
property_node_name @150 NONAME
|
property_node_name @150 NONAME
|
||||||
property_node_read @154 NONAME == XCd229cc0000f3
|
property_node_read @154 NONAME == XCd229cc0000f3
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ EXPORTS
|
|||||||
property_desc_to_buffer @129 NONAME
|
property_desc_to_buffer @129 NONAME
|
||||||
property_destroy @128 NONAME
|
property_destroy @128 NONAME
|
||||||
property_insert_read @131 NONAME
|
property_insert_read @131 NONAME
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_node_create @145 NONAME
|
property_node_create @145 NONAME
|
||||||
property_node_name @573 NONAME ==
|
property_node_name @573 NONAME ==
|
||||||
property_node_read @573 NONAME ==
|
property_node_read @573 NONAME ==
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ EXPORTS
|
|||||||
property_destroy @125 NONAME
|
property_destroy @125 NONAME
|
||||||
property_desc_to_buffer @126 NONAME
|
property_desc_to_buffer @126 NONAME
|
||||||
property_insert_read @128 NONAME
|
property_insert_read @128 NONAME
|
||||||
|
property_clear_error @573 NONAME
|
||||||
|
property_get_error @573 NONAME
|
||||||
property_search @141 NONAME
|
property_search @141 NONAME
|
||||||
property_node_create @142 NONAME
|
property_node_create @142 NONAME
|
||||||
property_node_name @147 NONAME == XCnbrep7000092
|
property_node_name @147 NONAME == XCnbrep7000092
|
||||||
|
|||||||
@@ -19,12 +19,14 @@ EXPORTS
|
|||||||
property_destroy @146 NONAME
|
property_destroy @146 NONAME
|
||||||
property_desc_to_buffer @147 NONAME
|
property_desc_to_buffer @147 NONAME
|
||||||
property_insert_read @149 NONAME
|
property_insert_read @149 NONAME
|
||||||
|
property_clear_error @158 NONAME == XCnbrep700009d
|
||||||
|
property_get_error @159 NONAME == XCnbrep700009e
|
||||||
property_search @162 NONAME
|
property_search @162 NONAME
|
||||||
property_node_create @163 NONAME
|
property_node_create @163 NONAME
|
||||||
property_node_name @168 NONAME == XCnbrep70000a7
|
property_node_name @168 NONAME == XCnbrep70000a7
|
||||||
property_node_remove @164 NONAME
|
property_node_remove @164 NONAME
|
||||||
property_node_type @169 NONAME == XCnbrep70000a8
|
property_node_type @169 NONAME == XCnbrep70000a8
|
||||||
property_node_clone @165 NONAME
|
property_node_clone @165 NONAME == XCnbrep70000a4
|
||||||
property_node_traversal @167 NONAME
|
property_node_traversal @167 NONAME
|
||||||
property_node_refdata @166 NONAME == XCnbrep70000a5
|
property_node_refdata @166 NONAME == XCnbrep70000a5
|
||||||
property_node_datasize @171 NONAME == XCnbrep70000aa
|
property_node_datasize @171 NONAME == XCnbrep70000aa
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ EXPORTS
|
|||||||
property_destroy @146 NONAME
|
property_destroy @146 NONAME
|
||||||
property_desc_to_buffer @147 NONAME
|
property_desc_to_buffer @147 NONAME
|
||||||
property_insert_read @149 NONAME
|
property_insert_read @149 NONAME
|
||||||
|
property_clear_error @158 NONAME == XCgsqzn000009d
|
||||||
|
property_get_error @159 NONAME == XCgsqzn000009e
|
||||||
property_search @162 NONAME
|
property_search @162 NONAME
|
||||||
property_node_create @163 NONAME
|
property_node_create @163 NONAME
|
||||||
property_node_name @168 NONAME == XCgsqzn00000a7
|
property_node_name @168 NONAME == XCgsqzn00000a7
|
||||||
|
|||||||
@@ -15,12 +15,21 @@ static const size_t apiset_prefix_len = sizeof(apiset_prefix) - 1;
|
|||||||
static void hook_table_apply_to_all(
|
static void hook_table_apply_to_all(
|
||||||
const char *depname, const struct hook_symbol *syms, size_t nsyms);
|
const char *depname, const struct hook_symbol *syms, size_t nsyms);
|
||||||
|
|
||||||
|
static void hook_table_revert_to_all(
|
||||||
|
const char *depname, const struct hook_symbol *syms, size_t nsyms);
|
||||||
|
|
||||||
static void hook_table_apply_to_iid(
|
static void hook_table_apply_to_iid(
|
||||||
HMODULE target,
|
HMODULE target,
|
||||||
const pe_iid_t *iid,
|
const pe_iid_t *iid,
|
||||||
const struct hook_symbol *syms,
|
const struct hook_symbol *syms,
|
||||||
size_t nsyms);
|
size_t nsyms);
|
||||||
|
|
||||||
|
static void hook_table_revert_to_iid(
|
||||||
|
HMODULE target,
|
||||||
|
const pe_iid_t *iid,
|
||||||
|
const struct hook_symbol *syms,
|
||||||
|
size_t nsyms);
|
||||||
|
|
||||||
static bool hook_table_match_module(
|
static bool hook_table_match_module(
|
||||||
HMODULE target, const char *iid_name, const char *depname);
|
HMODULE target, const char *iid_name, const char *depname);
|
||||||
|
|
||||||
@@ -44,6 +53,23 @@ static void hook_table_apply_to_all(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hook_table_revert_to_all(
|
||||||
|
const char *depname, const struct hook_symbol *syms, size_t nsyms)
|
||||||
|
{
|
||||||
|
const peb_dll_t *dll;
|
||||||
|
HMODULE pe;
|
||||||
|
|
||||||
|
for (dll = peb_dll_get_first(); dll != NULL; dll = peb_dll_get_next(dll)) {
|
||||||
|
pe = peb_dll_get_base(dll);
|
||||||
|
|
||||||
|
if (pe == NULL) {
|
||||||
|
continue; /* ?? Happens sometimes. */
|
||||||
|
}
|
||||||
|
|
||||||
|
hook_table_revert(pe, depname, syms, nsyms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void hook_table_apply(
|
void hook_table_apply(
|
||||||
HMODULE target,
|
HMODULE target,
|
||||||
const char *depname,
|
const char *depname,
|
||||||
@@ -73,6 +99,35 @@ void hook_table_apply(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hook_table_revert(
|
||||||
|
HMODULE target,
|
||||||
|
const char *depname,
|
||||||
|
const struct hook_symbol *syms,
|
||||||
|
size_t nsyms)
|
||||||
|
{
|
||||||
|
const pe_iid_t *iid;
|
||||||
|
const char *iid_name;
|
||||||
|
|
||||||
|
assert(depname != NULL);
|
||||||
|
assert(syms != NULL || nsyms == 0);
|
||||||
|
|
||||||
|
if (target == NULL) {
|
||||||
|
/* Call out, which will then call us back repeatedly. Awkward, but
|
||||||
|
viewed from the outside it's good for usability. */
|
||||||
|
|
||||||
|
hook_table_revert_to_all(depname, syms, nsyms);
|
||||||
|
} else {
|
||||||
|
for (iid = pe_iid_get_first(target); iid != NULL;
|
||||||
|
iid = pe_iid_get_next(target, iid)) {
|
||||||
|
iid_name = pe_iid_get_name(target, iid);
|
||||||
|
|
||||||
|
if (hook_table_match_module(target, iid_name, depname)) {
|
||||||
|
hook_table_revert_to_iid(target, iid, syms, nsyms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void hook_table_apply_to_iid(
|
static void hook_table_apply_to_iid(
|
||||||
HMODULE target,
|
HMODULE target,
|
||||||
const pe_iid_t *iid,
|
const pe_iid_t *iid,
|
||||||
@@ -101,6 +156,33 @@ static void hook_table_apply_to_iid(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hook_table_revert_to_iid(
|
||||||
|
HMODULE target,
|
||||||
|
const pe_iid_t *iid,
|
||||||
|
const struct hook_symbol *syms,
|
||||||
|
size_t nsyms)
|
||||||
|
{
|
||||||
|
struct pe_iat_entry iate;
|
||||||
|
size_t i;
|
||||||
|
size_t j;
|
||||||
|
const struct hook_symbol *sym;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
while (pe_iid_get_iat_entry(target, iid, i++, &iate) == S_OK) {
|
||||||
|
for (j = 0; j < nsyms; j++) {
|
||||||
|
sym = &syms[j];
|
||||||
|
|
||||||
|
if (hook_table_match_proc(&iate, sym)) {
|
||||||
|
// Only revert-able if the original pointer was stored previously
|
||||||
|
if (sym->link != NULL && *sym->link != NULL) {
|
||||||
|
pe_patch(iate.ppointer, sym->link, sizeof(*sym->link));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool hook_table_match_module(
|
static bool hook_table_match_module(
|
||||||
HMODULE target, const char *iid_name, const char *depname)
|
HMODULE target, const char *iid_name, const char *depname)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user