Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can't eject DLL in ctrlc handler #23

Open
steventrouble opened this issue Feb 25, 2024 · 0 comments
Open

Can't eject DLL in ctrlc handler #23

steventrouble opened this issue Feb 25, 2024 · 0 comments

Comments

@steventrouble
Copy link

steventrouble commented Feb 25, 2024

Thanks for publishing this library!

I want my injector to eject the DLL when I ctrl+c close the program. However, I cannot use the Syringe or ProcessModule in my ctrlc handler because it uses Rc.

How can I eject the DLL on ctrl c?

Errors:

error[E0277]: `Rc<dll_syringe::process::memory::remote_box::RemoteBoxAllocatorInner>` cannot be sent between threads safely
  --> src\main.rs:43:24
   |
43 |       ctrlc::set_handler(move || {
   |  _____------------------_^
   | |     |
   | |     required by a bound introduced by this call
44 | |         syringe.lock().unwrap().eject(*injected.lock().unwrap());
45 | |     });
   | |_____^ `Rc<dll_syringe::process::memory::remote_box::RemoteBoxAllocatorInner>` cannot be sent between threads safely    
   |
   = help: within `Syringe`, the trait `Send` is not implemented for `Rc<dll_syringe::process::memory::remote_box::RemoteBoxAllocatorInner>`, which is required by `{closure@src\main.rs:43:24: 43:31}: Send`
note: required because it appears within the type `dll_syringe::process::memory::remote_box::RemoteBoxAllocator`
  --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\dll-syringe-0.15.2\src\process\memory\remote_box.rs:9:12
   |
9  | pub struct RemoteBoxAllocator(pub(crate) Rc<RemoteBoxAllocatorInner>);
   |            ^^^^^^^^^^^^^^^^^^
note: required because it appears within the type `Syringe`
  --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\dll-syringe-0.15.2\src\syringe.rs:97:12
   |
97 | pub struct Syringe {
   |            ^^^^^^^
   = note: required for `Mutex<Syringe>` to implement `Sync`
   = note: required for `Arc<Mutex<Syringe>>` to implement `Send`
note: required because it's used within this closure
  --> src\main.rs:43:24
   |
43 |     ctrlc::set_handler(move || {
   |                        ^^^^^^^
note: required by a bound in `set_handler`
  --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\ctrlc-3.4.2\src\lib.rs:95:28
   |
93 | pub fn set_handler<F>(user_handler: F) -> Result<(), Error>
   |        ----------- required by a bound in this function
94 | where
95 |     F: FnMut() + 'static + Send,
   |                            ^^^^ required by this bound in `set_handler`

error[E0277]: `*mut winapi::shared::minwindef::HINSTANCE__` cannot be sent between threads safely
    --> src\main.rs:43:24
     |
43   |       ctrlc::set_handler(move || {
     |  _____------------------_^
     | |     |
     | |     required by a bound introduced by this call
44   | |         syringe.lock().unwrap().eject(*injected.lock().unwrap());
45   | |     });
     | |_____^ `*mut winapi::shared::minwindef::HINSTANCE__` cannot be sent between threads safely
     |
     = help: within `Syringe`, the trait `Send` is not implemented for `*mut winapi::shared::minwindef::HINSTANCE__`, which is required by `{closure@src\main.rs:43:24: 43:31}: Send`
note: required because it appears within the type `PhantomData<*mut winapi::shared::minwindef::HINSTANCE__>`
    --> C:\Users\me\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\marker.rs:740:12
     |
740  | pub struct PhantomData<T: ?Sized>;
     |            ^^^^^^^^^^^
note: required because it appears within the type `dll_syringe::process::memory::remote_box::RemoteBox<*mut winapi::shared::minwindef::HINSTANCE__>`
    --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\dll-syringe-0.15.2\src\process\memory\remote_box.rs:123:12
     |
123  | pub struct RemoteBox<T: ?Sized> {
     |            ^^^^^^^^^
note: required because it appears within the type `dll_syringe::syringe::LoadLibraryWStub`
    --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\dll-syringe-0.15.2\src\syringe.rs:380:8
     |
380  | struct LoadLibraryWStub {
     |        ^^^^^^^^^^^^^^^^
note: required because it appears within the type `Option<dll_syringe::syringe::LoadLibraryWStub>`
    --> C:\Users\me\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:572:10
     |
572  | pub enum Option<T> {
     |          ^^^^^^
note: required because it appears within the type `UnsafeCell<Option<dll_syringe::syringe::LoadLibraryWStub>>`
    --> C:\Users\me\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\cell.rs:2030:12     |
2030 | pub struct UnsafeCell<T: ?Sized> {
     |            ^^^^^^^^^^
note: required because it appears within the type `OnceCell<dll_syringe::syringe::LoadLibraryWStub>`
    --> C:\Users\me\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\cell\once.rs:33:12
     |
33   | pub struct OnceCell<T> {
     |            ^^^^^^^^
note: required because it appears within the type `Syringe`
    --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\dll-syringe-0.15.2\src\syringe.rs:97:12
     |
97   | pub struct Syringe {
     |            ^^^^^^^
     = note: required for `Mutex<Syringe>` to implement `Sync`
     = note: required for `Arc<Mutex<Syringe>>` to implement `Send`
note: required because it's used within this closure
    --> src\main.rs:43:24
     |
43   |     ctrlc::set_handler(move || {
     |                        ^^^^^^^
note: required by a bound in `set_handler`
    --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\ctrlc-3.4.2\src\lib.rs:95:28
     |
93   | pub fn set_handler<F>(user_handler: F) -> Result<(), Error>
     |        ----------- required by a bound in this function
94   | where
95   |     F: FnMut() + 'static + Send,
     |                            ^^^^ required by this bound in `set_handler`

error[E0277]: `*mut winapi::shared::minwindef::__some_function` cannot be sent between threads safely
    --> src\main.rs:43:24
     |
43   |       ctrlc::set_handler(move || {
     |  _____------------------_^
     | |     |
     | |     required by a bound introduced by this call
44   | |         syringe.lock().unwrap().eject(*injected.lock().unwrap());
45   | |     });
     | |_____^ `*mut winapi::shared::minwindef::__some_function` cannot be sent between threads safely
     |
     = help: within `Syringe`, the trait `Send` is not implemented for `*mut winapi::shared::minwindef::__some_function`, which is required by `{closure@src\main.rs:43:24: 43:31}: Send`
note: required because it appears within the type `PhantomData<*mut winapi::shared::minwindef::__some_function>`
    --> C:\Users\me\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\marker.rs:740:12
     |
740  | pub struct PhantomData<T: ?Sized>;
     |            ^^^^^^^^^^^
note: required because it appears within the type `dll_syringe::process::memory::remote_box::RemoteBox<*mut winapi::shared::minwindef::__some_function>`
    --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\dll-syringe-0.15.2\src\process\memory\remote_box.rs:123:12
     |
123  | pub struct RemoteBox<T: ?Sized> {
     |            ^^^^^^^^^
note: required because it appears within the type `rpc::rpc_core::RemoteProcedureStub<rpc::rpc_core::GetProcAddressParams, *mut winapi::shared::minwindef::__some_function>`
    --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\dll-syringe-0.15.2\src\rpc\rpc_core.rs:180:19     
     |
180  | pub(crate) struct RemoteProcedureStub<A: ?Sized + Copy, R: Copy> {
     |                   ^^^^^^^^^^^^^^^^^^^
note: required because it appears within the type `Option<RemoteProcedureStub<GetProcAddressParams, *mut __some_function>>`   
    --> C:\Users\me\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:572:10
     |
572  | pub enum Option<T> {
     |          ^^^^^^
note: required because it appears within the type `UnsafeCell<Option<RemoteProcedureStub<GetProcAddressParams, *mut __some_function>>>`
    --> C:\Users\me\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\cell.rs:2030:12     |
2030 | pub struct UnsafeCell<T: ?Sized> {
     |            ^^^^^^^^^^
note: required because it appears within the type `OnceCell<RemoteProcedureStub<GetProcAddressParams, *mut __some_function>>` 
    --> C:\Users\me\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\cell\once.rs:33:12
     |
33   | pub struct OnceCell<T> {
     |            ^^^^^^^^
note: required because it appears within the type `Syringe`
    --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\dll-syringe-0.15.2\src\syringe.rs:97:12
     |
97   | pub struct Syringe {
     |            ^^^^^^^
     = note: required for `Mutex<Syringe>` to implement `Sync`
     = note: required for `Arc<Mutex<Syringe>>` to implement `Send`
note: required because it's used within this closure
    --> src\main.rs:43:24
     |
43   |     ctrlc::set_handler(move || {
     |                        ^^^^^^^
note: required by a bound in `set_handler`
    --> C:\Users\me\.cargo\registry\src\index.crates.io-6f17d22bba15001f\ctrlc-3.4.2\src\lib.rs:95:28
     |
93   | pub fn set_handler<F>(user_handler: F) -> Result<(), Error>
     |        ----------- required by a bound in this function
94   | where
95   |     F: FnMut() + 'static + Send,
     |                            ^^^^ required by this bound in `set_handler`

For more information about this error, try `rustc --explain E0277`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant