mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2024-11-12 01:10:49 +01:00
Add initial draft of architecture document.
Still has a bunch of TODOs where more information is required. This commit adds the first few sections and some information about iidxhook.
This commit is contained in:
parent
79495ea687
commit
0a499b38a7
@ -67,6 +67,10 @@ know if there is any information that you consider helpful or important to know
|
|||||||
Please refer to the [dedicated documentation](CONTRIBUTING.md).
|
Please refer to the [dedicated documentation](CONTRIBUTING.md).
|
||||||
|
|
||||||
# Development
|
# Development
|
||||||
|
## Architecture
|
||||||
|
A dedicate [architecture document](doc/architecture.md) outlines the architecture of Bemanitools and points out the most
|
||||||
|
important aspects you should know before you get started with development.
|
||||||
|
|
||||||
## API
|
## API
|
||||||
Please refer to the [API documentation](doc/api.md).
|
Please refer to the [API documentation](doc/api.md).
|
||||||
|
|
||||||
|
176
doc/architecture.md
Normal file
176
doc/architecture.md
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
# Bemanitools architecture
|
||||||
|
This document gives you an overview of the architecture of Bemanitools (5). Why do we need this? This helps document the
|
||||||
|
various design decisions and how everything comes together, in the end. At some point when things are evolving and other
|
||||||
|
developers want to pick up the project, this might give them answers to why some things were done well or not so well.
|
||||||
|
This allows them to iterate on the current design (document) to analyze if a change they want to apply might work out
|
||||||
|
or not.
|
||||||
|
|
||||||
|
Anway, enough preface...I guess you got the idea. This document will be split into several sections which address
|
||||||
|
different aspects of the architecture.
|
||||||
|
|
||||||
|
## The big picture
|
||||||
|
TODO create a graphic that presents the key modules and ideas.
|
||||||
|
|
||||||
|
## Detouring library functions, IAT hooking
|
||||||
|
One of Bemanitools's goals is to avoid patching of executables, libraries or any game data and instead rely on
|
||||||
|
intercepting calls to libraries to patch bugs or introduce new features. To support a game on a non native platform
|
||||||
|
transparently, e.g. your home desktop, this allows us to intercept I/O communication to emulate hardware or
|
||||||
|
files/filesystem features the game expects to be available.
|
||||||
|
|
||||||
|
We create a so called "hook library/hook.dll" which gets injected to the target process (the game) before the game
|
||||||
|
runs any of its application code. This is well known by the terms of dll injection and will not be further discussed
|
||||||
|
here (google it). The injected dll will replace the function addresses in the IATs to detour any calls to our own
|
||||||
|
handler functions before, eventually, calling the real function. This way, we can intercept the call and do cool things.
|
||||||
|
|
||||||
|
These features are covered by the modules in the following subfolders in src/main:
|
||||||
|
* hook: Essentially, this is capnhook: https://github.com/decafcode/capnhook. General tools for hooking Win32 API calls.
|
||||||
|
* hooklib: Some additional helper modules to take care of specific issues in Bemanitools, e.g. rs232 related stuff for
|
||||||
|
ACIO.
|
||||||
|
|
||||||
|
Check the modules for details.
|
||||||
|
|
||||||
|
## Hooking and IRP
|
||||||
|
IRP stands for "I/O request packet" and is a kernel mode structure used in Windows drivers for communication with the
|
||||||
|
OS. The data structure describes an I/O request with parameters for that request avoiding function calls with large
|
||||||
|
number of arguments to a driver.
|
||||||
|
|
||||||
|
We make use of that "IRP pattern" by creating a flexible and maintainable abstraction layer for the following hooking
|
||||||
|
modules:
|
||||||
|
* iohook: Hook I/O (e.g. file) related calls
|
||||||
|
* d3d9: Hook d3d9 graphics API calls
|
||||||
|
|
||||||
|
An IRP handler is implemented to handle selected IRP calls based on the specified operation type. IRP handlers can be
|
||||||
|
chained which allows splitting up different features/interceptors to different functions and modules allowing you to
|
||||||
|
create a clear structure. At the end of the forwarding chain, you the real API function that maps to the abstracted
|
||||||
|
operation is called. However, a handler can decide at any time to not forward calls which allows you to implement
|
||||||
|
emulation of access to selected files or I/O devices.
|
||||||
|
|
||||||
|
Modules that make use of this:
|
||||||
|
* iidxhook-util/d3d9
|
||||||
|
* ezusb-emu/device
|
||||||
|
* ezusb2-emu/device
|
||||||
|
* acioemu/emu
|
||||||
|
|
||||||
|
## Bemanitools's hook libraries, let's glue everything together
|
||||||
|
Bemanitools dlls to be injected into target game processes are refered to as "hook dlls" and come in different flavours
|
||||||
|
targetting different games and often different versions of the same game (series), for example:
|
||||||
|
* ddrhook: Hook dll for Dance Dance Revolution games
|
||||||
|
* iidxhook1-8: Hook dlls for Beatmania IIDX, we are currently at 8 different implementations due to the various
|
||||||
|
iterations the game went through, related to software and hardware.
|
||||||
|
* sdvxhook: Hook dll for SoundVoltex series
|
||||||
|
|
||||||
|
The following sub-sections will give you some brief insights on each hook implementation and what modules were used.
|
||||||
|
|
||||||
|
### bsthook
|
||||||
|
TODO
|
||||||
|
|
||||||
|
### ddrhook
|
||||||
|
TODO
|
||||||
|
|
||||||
|
### iidxhook
|
||||||
|
IIDX went through so many hard- and software iterations, it's actually amazing that the development team(s) refactored
|
||||||
|
and improved parts of the game and hardware with each iteration. However, when facing emulation and supporting
|
||||||
|
compatibility to legacy OS platforms, it can't get any worse. On the bright side, IIDX helped shaping Bemanitools a lot
|
||||||
|
and created a solid foundation other games can build on.
|
||||||
|
|
||||||
|
Because of that, we have 8 iidxhook implementations supporting sometimes different software features/fixes and
|
||||||
|
hardware. The following sub-sub-sections list the most relevant aspects and modules to point out common and different
|
||||||
|
higher level features.
|
||||||
|
|
||||||
|
#### iidxhook1 (9-12)
|
||||||
|
* Ezusb C02 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full security emulation with SRAM and round plugs
|
||||||
|
* Full serial emulation for magstripe card readers
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* d3d8 patching and extended features (superseded by d3d9 hook module + d3d8to9 wrapper)
|
||||||
|
* clock patching
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
* Network related patches to enable eamuse to custom servers
|
||||||
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
|
#### iidxhook2 (13)
|
||||||
|
* Ezusb C02 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full security emulation with SRAM and round plugs
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* ACIO ICCA card reader emulation, slotted readers
|
||||||
|
* d3d8 patching and extended features (superseded by d3d9 hook module + d3d8to9 wrapper)
|
||||||
|
* clock patching
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
* Network related patches to enable eamuse to custom servers
|
||||||
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
|
#### iidxhook3 (14-17)
|
||||||
|
* Ezusb IO2 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full security emulation with SRAM and round plugs
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* ACIO ICCA card reader emulation, slotted readers
|
||||||
|
* d3d9 patching and extended features
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
* Network related patches to enable eamuse to custom servers
|
||||||
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
|
#### iidxhook4 (18)
|
||||||
|
* Ezusb IO2 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* ACIO ICCA card reader emulation, slotted readers
|
||||||
|
* d3d9 patching and extended features
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
|
#### iidxhook5 (19)
|
||||||
|
* Ezusb IO2 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* ACIO ICCA card reader emulation, wave pass readers
|
||||||
|
* d3d9 patching and extended features
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
* Filesystem patches to detour E and F backup drives for settings
|
||||||
|
|
||||||
|
#### iidxhook6 (20)
|
||||||
|
* Ezusb IO2 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* ACIO ICCA card reader emulation, wave pass readers
|
||||||
|
* d3d9 patching and extended features
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
|
||||||
|
#### iidxhook7 (21-24)
|
||||||
|
* Ezusb IO2 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* ACIO ICCA card reader emulation, wave pass readers
|
||||||
|
* d3d9 patching and extended features
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
|
||||||
|
#### iidxhook8 (25-26)
|
||||||
|
* ACIO BIO2 I/O emulation
|
||||||
|
* Setupapi emulation
|
||||||
|
* Full game essential I/O emulation
|
||||||
|
* ACIO ICCA card reader emulation, wave pass readers
|
||||||
|
* d3d9 patching and extended features
|
||||||
|
* Font patching for Japanese chars
|
||||||
|
|
||||||
|
### jbhook
|
||||||
|
TODO
|
||||||
|
|
||||||
|
### sdvxhook
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## The ezusb (emulation) stack
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## The ACIO (emulation) stack
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## BT5 API
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## AVS and launcher
|
||||||
|
TODO
|
||||||
|
|
||||||
|
## Inject
|
||||||
|
TODO
|
Loading…
Reference in New Issue
Block a user