I do not know an equivalent of VirtualQuery
on Linux. But some other ways to do it which may or may not work are:
-
you setup a signal handler trapping SIGBUS/SIGSEGV and go ahead with your read or write. If the memory is protected, your signal trapping code will be called. If not your signal trapping code is not called. Either way you win.
-
you could track each time you call
mprotect
and build a corresponding data structure which helps you in knowing if a region is read or write protected. This is good if you have access to all the code which usesmprotect
. -
you can monitor all the
mprotect
calls in your process by linking your code with a library redefining the functionmprotect
. You can then build the necessary data structure for knowing if a region is read or write protected and then call the systemmprotect
for really setting the protection. -
you may try to use
/dev/inotify
and monitor the file/proc/self/maps
for any change. I guess this one does not work, but should be worth the try.