1
0
mirror of https://github.com/valinet/ExplorerPatcher.git synced 2024-11-13 18:50:46 +01:00
ExplorerPatcher/ep_extra
Valentin Radu 1f4b586f03 ep_extra: Implemented an ep_extra-based loader
ExplorerPatcher includes a mechanism which allows the user to load
a single DLL, named `ep_extra.dll` and placed in `C:\Windows` when
`explorer.exe` loads. This was long requested by some users who wanted
to perform their own code/initializations/hooks when `explorer` started.

In the mean time, I thought `ep_extra.dll` would work nicely as a
loader for any number of modules. I could've included this functionality
in the main ExplorerPatcher code, but I decided to take it up as a
challenge instead and offer a robust implementation without changing
ExplorerPatcher's main code.

Thus, when using this as `ep_extra.dll`, it will also load DLLs that
match the `ep_extra_*.dll` pattern. These DLLs must export a function
called `setup` which the loader will execute on the thread that is
loading the DLLs. Although not currently checked, return 0 from this
function if your initialization succeeded, or some error code when it
fails.

What's up with the assembly and shell codes and weird threads that I
create? Well, I realized I kind of did a mistake when coding
ExplorerPatcher, in that I should have loaded and executed `ep_extra`
on a seprate thread, not in `explorer`'s main thread. But since I said
I'd do this challenge without changing EP, this was my solution
towards having this `ep_extra` loader do its work, load the other DLLs,
if any, and then unload itself from memory safely and (almost) cleanly
without disturbing the main application right after it does its job.
This way, you can update it seamlessly when `explorer` is running,
which is much more convenient than having to kill `explorer`, replace
the DLL, and then manually reload `explorer`. I don't know if this is
the best way, but it is the way I thought about when realizing that I
cannot call `FreeLibrary` simply, since the "next line" (which would
have been a "return") is well outside of valid memory at that point.
`FreeLibraryAndExitThread` also can't be used since I do not want to
exit `explorer`'s main thread which the loader's function is called on.
2023-03-01 20:27:44 +02:00
..
ep_extra.rc ep_extra: Implemented an ep_extra-based loader 2023-03-01 20:27:44 +02:00
ep_extra.vcxproj ep_extra: Implemented an ep_extra-based loader 2023-03-01 20:27:44 +02:00
ep_extra.vcxproj.filters ep_extra: Implemented an ep_extra-based loader 2023-03-01 20:27:44 +02:00
main.asm ep_extra: Implemented an ep_extra-based loader 2023-03-01 20:27:44 +02:00
README.md ep_extra: Implemented an ep_extra-based loader 2023-03-01 20:27:44 +02:00
resource.h ep_extra: Implemented an ep_extra-based loader 2023-03-01 20:27:44 +02:00
worker.c ep_extra: Implemented an ep_extra-based loader 2023-03-01 20:27:44 +02:00

ExplorerPatcher Custom Libraries Chainloader

ExplorerPatcher has a simple, built-in mechanism that allows users to load their own DLL into explorer.exe right after ExplorerPatcher finishes initializing its hooks. Interested users hould place a DLL called ep_extra.dll in C:\Windows. When ExplorerPatcher finishes its setup, it loads the ep_extra.dll library and calls the ep_extra_EntryPoint function. Although this is very useful so that users can load their custom code, it is quite limited at the moment, as it loads just one DLL.

This project is a solution to this issue. A chainloader is implemented here, that looks for other modules matching the ep_extra_*.dll pattern in C:\Windows as well, and loads them one after the other.