kolynet Posted October 10, 2014 Posted October 10, 2014 hey! i have my 'detour drawtext hook' dll injected to a process with my custom injector. i would like to achieve IPC or WM_COPYDATA style data passing between them. i can send messages from my application to the dll, but cannot communicate back. im also not sure which should be the client or server. What would be the easiest and best way to get this task done? thanks very much in advance:)
Aguila Posted October 10, 2014 Posted October 10, 2014 Mailslots are very easy to use http://msdn.microsoft.com/en-us/library/windows/desktop/aa365802%28v=vs.85%29.aspx
simple Posted October 10, 2014 Posted October 10, 2014 If u need a lightning fast 2 way ipc w/many reads/writes p/second, then I think semaphores w/shared memory is the best way, but this isn't the most straightforward. For something more normal, plain old files work well if u can spawn a proc as a child, then pipes are easy to work w/also. sockets are an option, it doesnt matter which is the client/server for WM_COPYDATA i think both processes need to be windows apps. u can also use registry keys, probably many more options too 1
atom0s Posted October 13, 2014 Posted October 13, 2014 My personal favorites and suggestions would be: - MMF's (Memory Mapped Files): http://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspx - Sockets: For this I use zmq: http://zeromq.org/ From personal experience in a very heavy work load, I would not recommend mail slots or named pipes. They are very very poor performance wise and did not handle high-load situations well. Named pipes were the worst I personally tested under heavy 10k-100k+ packet testing loads where the pipe would corrupt and just ultimately die. I wrote a custom protocol with MMFs that worked flawlessly and had no issues at all in high-load situations. So I tend to stick to them most of the time. I was recently in the last year introduced to zmq which does great as well and will more than likely be what I use for now on with IPC. 1
TiLT Posted October 15, 2014 Posted October 15, 2014 (edited) zmq looks pretty awesome, thanks for the info. I personally use MMFs as well. How I do mine is I have 2 MMFs: one for incoming messages, and another for outgoing. I use semaphores for signaling, and I use a lock-free system with InterlockedCompareExchange to solve buffer contention. Because mine is threaded I need to consider thread safety. So I have a Uint pointer to the beginning of my MMFs. This value tells whether it's safe to use. 0 = free for write access, 1 = in use, 2 = free for read access. Use atomic operation (the interlocked operation i mentioned before) for accessing it and you don't need any other kind of lock. My protocol is like this: Byte (message type), Uint (message length), followed by the message. It's bi-directional, incredibly high bandwidth, and basically zero latency....it has to be measured in microseconds. I've used this technique for a C++ self injecting DLL and a C# client app that processes a lot of data. Edited October 16, 2014 by electroglyph
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now