duran 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +20 -0
- data/README.rdoc +11 -0
- data/Rakefile +29 -0
- data/VERSION +1 -0
- data/client_src/dr_include/dr_api.h +102 -0
- data/client_src/dr_include/dr_app.h +92 -0
- data/client_src/dr_include/dr_config.h +650 -0
- data/client_src/dr_include/dr_defines.h +391 -0
- data/client_src/dr_include/dr_events.h +1057 -0
- data/client_src/dr_include/dr_ir_instr.h +1214 -0
- data/client_src/dr_include/dr_ir_instrlist.h +149 -0
- data/client_src/dr_include/dr_ir_macros.h +2426 -0
- data/client_src/dr_include/dr_ir_opcodes.h +768 -0
- data/client_src/dr_include/dr_ir_opnd.h +1170 -0
- data/client_src/dr_include/dr_ir_utils.h +708 -0
- data/client_src/dr_include/dr_proc.h +327 -0
- data/client_src/dr_include/dr_tools.h +1304 -0
- data/client_src/duran.c +57 -0
- data/client_src/extconf.rb +28 -0
- data/lib/duran.rb +18 -0
- data/lib/duran/app.rb +8 -0
- data/lib/duran/defines.rb +39 -0
- data/lib/duran/events.rb +156 -0
- data/lib/duran/ir_opcodes.rb +616 -0
- data/lib/duran/ir_opnd.rb +329 -0
- data/lib/duran/ir_utils.rb +133 -0
- data/lib/duran/proc.rb +49 -0
- data/lib/duran/structs.rb +20 -0
- data/lib/duran/structs/exception.rb +23 -0
- data/lib/duran/structs/fault_fragment_info.rb +34 -0
- data/lib/duran/structs/instruction.rb +15 -0
- data/lib/duran/structs/machine_context.rb +80 -0
- data/lib/duran/structs/memory_info.rb +12 -0
- data/lib/duran/structs/module_data.rb +61 -0
- data/lib/duran/structs/module_names.rb +24 -0
- data/lib/duran/structs/operand.rb +15 -0
- data/lib/duran/structs/restore_state_info.rb +30 -0
- data/lib/duran/structs/signal_info.rb +41 -0
- data/lib/duran/structs/tracedump.rb +50 -0
- data/lib/duran/tools.rb +214 -0
- metadata +104 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Eric Monti
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
= duran
|
2
|
+
|
3
|
+
Duran is an attempt to embed ruby in the DynamoRIO dynamic binary translation
|
4
|
+
framework. Duran also provides FFI bindings for the DynamoRIO C library which
|
5
|
+
can be used similarly to the C tool API.
|
6
|
+
|
7
|
+
For DynamoRIO documentation and downloads, please see http://www.dynamorio.org
|
8
|
+
|
9
|
+
== Copyright
|
10
|
+
|
11
|
+
Copyright (c) 2010 Eric Monti. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/clean'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = "duran"
|
9
|
+
gem.summary = %Q{Embedded Ruby client and FFI bindings for the DyanoRIO library.}
|
10
|
+
gem.description = %Q{Embedded Ruby client and FFI bindings for the DyanoRIO dynamic binary translation library.}
|
11
|
+
gem.email = "esmonti@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/emonti/duran"
|
13
|
+
gem.authors = ["Eric Monti"]
|
14
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
15
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
|
+
end
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/rdoctask'
|
22
|
+
Rake::RDocTask.new do |rdoc|
|
23
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
24
|
+
|
25
|
+
rdoc.rdoc_dir = 'rdoc'
|
26
|
+
rdoc.title = "duran #{version}"
|
27
|
+
rdoc.rdoc_files.include('README*')
|
28
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
29
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,102 @@
|
|
1
|
+
/* **********************************************************
|
2
|
+
* Copyright (c) 2002-2008 VMware, Inc. All rights reserved.
|
3
|
+
* **********************************************************/
|
4
|
+
|
5
|
+
/*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are met:
|
8
|
+
*
|
9
|
+
* * Redistributions of source code must retain the above copyright notice,
|
10
|
+
* this list of conditions and the following disclaimer.
|
11
|
+
*
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
14
|
+
* and/or other materials provided with the distribution.
|
15
|
+
*
|
16
|
+
* * Neither the name of VMware, Inc. nor the names of its contributors may be
|
17
|
+
* used to endorse or promote products derived from this software without
|
18
|
+
* specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
23
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
|
24
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
25
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
26
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
27
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
28
|
+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
29
|
+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
30
|
+
* DAMAGE.
|
31
|
+
*/
|
32
|
+
|
33
|
+
#ifndef _DR_API_H_
|
34
|
+
#define _DR_API_H_ 1
|
35
|
+
|
36
|
+
/**
|
37
|
+
* @file dr_api.h
|
38
|
+
* @brief Top-level include file for DynamoRIO API.
|
39
|
+
*/
|
40
|
+
|
41
|
+
#ifdef __cplusplus
|
42
|
+
extern "C" {
|
43
|
+
#endif
|
44
|
+
|
45
|
+
/* Defines and type definitions */
|
46
|
+
#include "dr_defines.h"
|
47
|
+
|
48
|
+
/* Event registration routines */
|
49
|
+
#include "dr_events.h"
|
50
|
+
|
51
|
+
/* Application start/stop interface */
|
52
|
+
#include "dr_app.h"
|
53
|
+
|
54
|
+
/* opnd_t (instruction operand) routines */
|
55
|
+
#include "dr_ir_opnd.h"
|
56
|
+
|
57
|
+
/* High-level routines: memory allocation, mutex support, file
|
58
|
+
* support, printing, thread support, adaptive optimization,
|
59
|
+
* custom traces, processor-specific utilities, trace dumping,
|
60
|
+
* and module information.
|
61
|
+
*/
|
62
|
+
#include "dr_tools.h"
|
63
|
+
|
64
|
+
/* Utility routines for identifying features of the processor. */
|
65
|
+
#include "dr_proc.h"
|
66
|
+
|
67
|
+
/* Instruction convenience & decode/disassemble routines */
|
68
|
+
#include "dr_ir_utils.h"
|
69
|
+
|
70
|
+
/* instrlist_t routines */
|
71
|
+
#include "dr_ir_instrlist.h"
|
72
|
+
|
73
|
+
/* instr_t routines */
|
74
|
+
#include "dr_ir_instr.h"
|
75
|
+
|
76
|
+
/* opcode OP_ constants and opcode-only routines */
|
77
|
+
#include "dr_ir_opcodes.h"
|
78
|
+
|
79
|
+
/* CREATE_INSTR_ macros */
|
80
|
+
#include "dr_ir_macros.h"
|
81
|
+
|
82
|
+
/**
|
83
|
+
* When registering a process, users must provide a list of paths to
|
84
|
+
* client libraries and their associated client-specific options. DR
|
85
|
+
* looks up "dr_init" in each client library and calls that function
|
86
|
+
* when the process starts. Clients can register to receive callbacks
|
87
|
+
* for the various events within dr_init. Note that client paths and
|
88
|
+
* options cannot include semicolons. \p client_id is the ID supplied
|
89
|
+
* at registration and is used to identify the client for
|
90
|
+
* dr_get_options(), dr_get_client_path(), and external nudges.
|
91
|
+
*/
|
92
|
+
DR_EXPORT void dr_init(client_id_t client_id);
|
93
|
+
|
94
|
+
/* Version checking */
|
95
|
+
/* This equals major*100 + minor */
|
96
|
+
DR_EXPORT LINK_ONCE int _USES_DR_VERSION_ = 105;
|
97
|
+
|
98
|
+
#ifdef __cplusplus
|
99
|
+
}
|
100
|
+
#endif
|
101
|
+
|
102
|
+
#endif /* _DR_API_H_ */
|
@@ -0,0 +1,92 @@
|
|
1
|
+
/* **********************************************************
|
2
|
+
* Copyright (c) 2002-2008 VMware, Inc. All rights reserved.
|
3
|
+
* **********************************************************/
|
4
|
+
|
5
|
+
/*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are met:
|
8
|
+
*
|
9
|
+
* * Redistributions of source code must retain the above copyright notice,
|
10
|
+
* this list of conditions and the following disclaimer.
|
11
|
+
*
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
14
|
+
* and/or other materials provided with the distribution.
|
15
|
+
*
|
16
|
+
* * Neither the name of VMware, Inc. nor the names of its contributors may be
|
17
|
+
* used to endorse or promote products derived from this software without
|
18
|
+
* specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
23
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
|
24
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
25
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
26
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
27
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
28
|
+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
29
|
+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
30
|
+
* DAMAGE.
|
31
|
+
*/
|
32
|
+
|
33
|
+
/**
|
34
|
+
* @file dr_app.h
|
35
|
+
* @brief DR's application interface for running portions
|
36
|
+
* of a program under its control.
|
37
|
+
*/
|
38
|
+
|
39
|
+
#ifndef _DR_APP_H_
|
40
|
+
#define _DR_APP_H_ 1
|
41
|
+
|
42
|
+
#ifdef WINDOWS
|
43
|
+
# ifdef DR_APP_EXPORTS
|
44
|
+
# define DR_APP_API __declspec(dllexport)
|
45
|
+
# else
|
46
|
+
# define DR_APP_API __declspec(dllimport)
|
47
|
+
# endif
|
48
|
+
#else /* LINUX */
|
49
|
+
# if defined(DR_APP_EXPORTS) && defined(USE_VISIBILITY_ATTRIBUTES)
|
50
|
+
# define DR_APP_API __attribute__ ((visibility ("default")))
|
51
|
+
# else
|
52
|
+
# define DR_APP_API
|
53
|
+
# endif
|
54
|
+
#endif
|
55
|
+
|
56
|
+
/****************************************************************************
|
57
|
+
* DR Application Interface
|
58
|
+
*/
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Application-wide initialization. Must be called before any other
|
62
|
+
* API function, and before the application creates any threads. Returns
|
63
|
+
* zero on success.
|
64
|
+
*/
|
65
|
+
DR_APP_API int dr_app_setup(void);
|
66
|
+
|
67
|
+
/**
|
68
|
+
* Application-wide cleanup. Prints statistics. Returns zero on success.
|
69
|
+
*/
|
70
|
+
DR_APP_API int dr_app_cleanup(void);
|
71
|
+
|
72
|
+
/**
|
73
|
+
* Causes application to run under DR control upon return
|
74
|
+
* from this call.
|
75
|
+
*/
|
76
|
+
DR_APP_API void dr_app_start(void);
|
77
|
+
|
78
|
+
/**
|
79
|
+
* Causes application to run directly on the machine upon return
|
80
|
+
* from this call; no effect if application is not currently
|
81
|
+
* running under DR control.
|
82
|
+
*/
|
83
|
+
DR_APP_API void dr_app_stop(void);
|
84
|
+
|
85
|
+
/**
|
86
|
+
* Causes application to run under DR control upon return from
|
87
|
+
* this call. DR never releases control. Useful for overriding
|
88
|
+
* dr_app_start/dr_app_stop calls in the rest of a program.
|
89
|
+
*/
|
90
|
+
DR_APP_API void dr_app_take_over(void);
|
91
|
+
|
92
|
+
#endif /* _DR_APP_H_ */
|
@@ -0,0 +1,650 @@
|
|
1
|
+
/* **********************************************************
|
2
|
+
* Copyright (c) 2002-2009 VMware, Inc. All rights reserved.
|
3
|
+
* **********************************************************/
|
4
|
+
|
5
|
+
/*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are met:
|
8
|
+
*
|
9
|
+
* * Redistributions of source code must retain the above copyright notice,
|
10
|
+
* this list of conditions and the following disclaimer.
|
11
|
+
*
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
14
|
+
* and/or other materials provided with the distribution.
|
15
|
+
*
|
16
|
+
* * Neither the name of VMware, Inc. nor the names of its contributors may be
|
17
|
+
* used to endorse or promote products derived from this software without
|
18
|
+
* specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
23
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
|
24
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
25
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
26
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
27
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
28
|
+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
29
|
+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
30
|
+
* DAMAGE.
|
31
|
+
*/
|
32
|
+
|
33
|
+
#ifndef _DR_CONFIG_H_
|
34
|
+
#define _DR_CONFIG_H_ 1
|
35
|
+
|
36
|
+
#ifdef WINDOWS
|
37
|
+
/****************************************************************************
|
38
|
+
* Deployment API
|
39
|
+
*/
|
40
|
+
/**
|
41
|
+
* @file dr_config.h
|
42
|
+
* @brief Deployment API for Windows. Use these functions to register
|
43
|
+
* processes to run under DynamoRIO, unregister processes, obtain existing
|
44
|
+
* registration information, and nudge running processes.
|
45
|
+
* \note The dr_config library is currently not multi-thread safe. Users of
|
46
|
+
* the library should ensure that no more then one thread accesses the library
|
47
|
+
* at a time. This limitation will be addressed in future releases.
|
48
|
+
*/
|
49
|
+
|
50
|
+
/** Maximum length of a registered process's options string */
|
51
|
+
#define DR_MAX_OPTIONS_LENGTH 512
|
52
|
+
|
53
|
+
/** Specifies DynamoRIO's operation mode. */
|
54
|
+
typedef enum {
|
55
|
+
|
56
|
+
/**
|
57
|
+
* No mode. Clients should not attempt to register a process in
|
58
|
+
* this mode.
|
59
|
+
*/
|
60
|
+
DR_MODE_NONE = 0,
|
61
|
+
|
62
|
+
/** Run DynamoRIO in Code Manipulation mode. */
|
63
|
+
DR_MODE_CODE_MANIPULATION = 1,
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
} dr_operation_mode_t;
|
68
|
+
|
69
|
+
/** Return status codes for process registration, unregistration and nudging. */
|
70
|
+
typedef enum {
|
71
|
+
/** Operation succeeded. */
|
72
|
+
DR_SUCCESS,
|
73
|
+
|
74
|
+
/** Process registration failed due to an existing registration. */
|
75
|
+
DR_PROC_REG_EXISTS,
|
76
|
+
|
77
|
+
/** Operation failed because the supplied process is not registered. */
|
78
|
+
DR_PROC_REG_INVALID,
|
79
|
+
|
80
|
+
/** Client registration failed due to an invalid priority value. */
|
81
|
+
DR_PRIORITY_INVALID,
|
82
|
+
|
83
|
+
/** Client registration failed due to a conflicting ID. */
|
84
|
+
DR_ID_CONFLICTING,
|
85
|
+
|
86
|
+
/** Client operation failed due to an invalid client ID. */
|
87
|
+
DR_ID_INVALID,
|
88
|
+
|
89
|
+
/** Unknown failure. Check that caller has adequate permissions for this operation. */
|
90
|
+
DR_FAILURE,
|
91
|
+
|
92
|
+
/** Nudge operation failed because the specified process id is not under DR. */
|
93
|
+
DR_NUDGE_PID_NOT_INJECTED,
|
94
|
+
|
95
|
+
/** Nudge operation timed out waiting for target process to finish handling a nudge.*/
|
96
|
+
DR_NUDGE_TIMEOUT,
|
97
|
+
|
98
|
+
} dr_config_status_t;
|
99
|
+
|
100
|
+
/** Allow targeting both WOW64 and native 64-bit processes separately. */
|
101
|
+
typedef enum {
|
102
|
+
DR_PLATFORM_DEFAULT, /**< The platform this tool is compiled for. */
|
103
|
+
DR_PLATFORM_32BIT, /**< 32-bit settings (for 32-bit or WOW64 processes). */
|
104
|
+
DR_PLATFORM_64BIT, /**< 64-bit settings (for native 64-bit processes). */
|
105
|
+
} dr_platform_t;
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Register a process to run under DynamoRIO. This requires administrative
|
109
|
+
* privileges. Note that this routine only sets the base options to run
|
110
|
+
* a process under DynamoRIO. To register one or more clients, call
|
111
|
+
* dr_register_client() subsequently.
|
112
|
+
*
|
113
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
114
|
+
* of the target process. The string should
|
115
|
+
* identify the base name of the process, not the
|
116
|
+
* full path of the executable (e.g., calc.exe).
|
117
|
+
*
|
118
|
+
* \param[in] dr_root_dir A NULL-terminated string specifying the full
|
119
|
+
* path to a valid DynamoRIO root directory.
|
120
|
+
* The string length cannot exceed MAX_PATH.
|
121
|
+
*
|
122
|
+
* \param[in] dr_mode Specifies the mode under which DynamoRIO should
|
123
|
+
* operate. See dr_operation_mode_t.
|
124
|
+
*
|
125
|
+
* \param[in] debug If true, a DynamoRIO debug build will be used;
|
126
|
+
* otherwise, a release build will be used.
|
127
|
+
*
|
128
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
129
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
130
|
+
* This parameter allows selecting which of those
|
131
|
+
* configurations to set.
|
132
|
+
*
|
133
|
+
* \param[in] dr_options A NULL-terminated string controlling
|
134
|
+
* DynamoRIO's behavior. Most users should
|
135
|
+
* not need to specify options. The total
|
136
|
+
* string length cannot exceed #DR_MAX_OPTIONS_LENGTH.
|
137
|
+
*
|
138
|
+
* \return A dr_config_status_t code indicating the result of
|
139
|
+
* registration. Note that registration fails if the requested
|
140
|
+
* process is already registered. To modify a process's
|
141
|
+
* registration, first call dr_unregister_process() to remove an
|
142
|
+
* existing registration.
|
143
|
+
*
|
144
|
+
* \remarks
|
145
|
+
* After registration, a process will run under DynamoRIO the next time
|
146
|
+
* it launches. Note that some processes may require a system reboot to
|
147
|
+
* restart. Process registration persists across reboots until explicitly
|
148
|
+
* unregistered.
|
149
|
+
*
|
150
|
+
* \note On Windows NT, a reboot is required after the initial
|
151
|
+
* dr_register_process() in order for DynamoRIO to take control of any
|
152
|
+
* application.
|
153
|
+
*
|
154
|
+
* \note An application that does not link with user32.dll will not be
|
155
|
+
* run under control of DynamoRIO unless it's launched by the \c drinject.exe
|
156
|
+
* tool (in bin/bin32 or bin/bin64) or the parent process (typically
|
157
|
+
* explorer.exe, for manually launched applications) is already under
|
158
|
+
* DynamoRIO control (the parent can be in any mode, but 32-bit parent
|
159
|
+
* cannot inject into a 64-bit child). Only some small non-graphical
|
160
|
+
* applications do not link with user32.dll.
|
161
|
+
*/
|
162
|
+
dr_config_status_t
|
163
|
+
dr_register_process(const char *process_name,
|
164
|
+
const char *dr_root_dir,
|
165
|
+
dr_operation_mode_t dr_mode,
|
166
|
+
bool debug,
|
167
|
+
dr_platform_t dr_platform,
|
168
|
+
const char *dr_options);
|
169
|
+
|
170
|
+
/**
|
171
|
+
* Unregister a process from running under DynamoRIO. This requires administrative
|
172
|
+
* privileges.
|
173
|
+
*
|
174
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
175
|
+
* of the target process. The string should
|
176
|
+
* identify the base name of the process, not the
|
177
|
+
* full path of the executable (e.g., calc.exe).
|
178
|
+
*
|
179
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
180
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
181
|
+
* This parameter allows selecting which of those
|
182
|
+
* configurations to unset.
|
183
|
+
*
|
184
|
+
* \return A dr_config_status_t code indicating the result of
|
185
|
+
* unregistration. Note that unregistration fails if the process
|
186
|
+
* is not currently registered to run under DynamoRIO.
|
187
|
+
*/
|
188
|
+
dr_config_status_t
|
189
|
+
dr_unregister_process(const char *process_name,
|
190
|
+
dr_platform_t dr_platform);
|
191
|
+
|
192
|
+
/**
|
193
|
+
* Check if a process is registered to run under DynamoRIO. To obtain client
|
194
|
+
* information, use dr_get_client_info().
|
195
|
+
*
|
196
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
197
|
+
* of the target process. The string should
|
198
|
+
* identify the base name of the process, not the
|
199
|
+
* full path of the executable (e.g., calc.exe).
|
200
|
+
*
|
201
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
202
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
203
|
+
* This parameter allows selecting which of those
|
204
|
+
* configurations to check.
|
205
|
+
*
|
206
|
+
* \param[out] dr_root_dir If the process is registered, the root DynamoRIO
|
207
|
+
* directory provided at registration. Callers can
|
208
|
+
* pass NULL if this value is not needed. Otherwise,
|
209
|
+
* the parameter must be a caller-allocated array of
|
210
|
+
* length MAX_PATH.
|
211
|
+
*
|
212
|
+
* \param[out] dr_mode If the process is registered, the mode provided
|
213
|
+
* at registration. Callers can pass NULL if this
|
214
|
+
* value is not needed.
|
215
|
+
*
|
216
|
+
* \param[out] debug If the process is registered, the debug flag
|
217
|
+
* provided at registration. Callers can pass NULL
|
218
|
+
* if this value is not needed.
|
219
|
+
*
|
220
|
+
* \param[out] dr_options If the process is registered, the extra DynamoRIO
|
221
|
+
* parameters provided at registration. Callers can
|
222
|
+
* pass NULL if this value is not needed. Otherwise,
|
223
|
+
* the parameter must be a caller-allocated array of
|
224
|
+
* length #DR_MAX_OPTIONS_LENGTH.
|
225
|
+
*
|
226
|
+
* \return true if the process is registered for the given platform.
|
227
|
+
*/
|
228
|
+
bool
|
229
|
+
dr_process_is_registered(const char *process_name,
|
230
|
+
dr_platform_t dr_platform,
|
231
|
+
char *dr_root_dir /* OUT */,
|
232
|
+
dr_operation_mode_t *dr_mode /* OUT */,
|
233
|
+
bool *debug /* OUT */,
|
234
|
+
char *dr_options /* OUT */);
|
235
|
+
|
236
|
+
typedef struct _dr_registered_process_iterator_t dr_registered_process_iterator_t;
|
237
|
+
|
238
|
+
/**
|
239
|
+
* Creates and starts an iterator for iterating over all processes registered for
|
240
|
+
* the given platform.
|
241
|
+
*
|
242
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
243
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
244
|
+
* This parameter allows selecting which of those
|
245
|
+
* configurations to check.
|
246
|
+
*
|
247
|
+
* \return iterator for use with dr_registered_process_iterator_hasnext()and
|
248
|
+
* dr_registered_process_iterator_next(). Must be freed
|
249
|
+
* with dr_registered_process_iterator_stop()
|
250
|
+
*/
|
251
|
+
dr_registered_process_iterator_t *
|
252
|
+
dr_registered_process_iterator_start(dr_platform_t dr_platform);
|
253
|
+
|
254
|
+
/**
|
255
|
+
* \param[in] iter A registered process iterator created with
|
256
|
+
* dr_registered_process_iterator_start()
|
257
|
+
*
|
258
|
+
* \return true if there are more registered processes to iterate over
|
259
|
+
*/
|
260
|
+
bool
|
261
|
+
dr_registered_process_iterator_hasnext(dr_registered_process_iterator_t *iter);
|
262
|
+
|
263
|
+
/**
|
264
|
+
* Return information about a registered process
|
265
|
+
*
|
266
|
+
* \param[in] iter A registered process iterator created with
|
267
|
+
* dr_registered_process_iterator_start().
|
268
|
+
*
|
269
|
+
* \param[out] process_name The name of the registered process. Callers can
|
270
|
+
* pass NULL if this value is not needed. Otherwise
|
271
|
+
* the parameter must be a caller-allocated array
|
272
|
+
* of length MAX_PATH.
|
273
|
+
*
|
274
|
+
* \param[out] dr_root_dir The root DynamoRIO directory provided at registration.
|
275
|
+
* Callers can pass NULL if this value is not needed.
|
276
|
+
* Otherwise, the parameter must be a caller-allocated
|
277
|
+
* array of length MAX_PATH.
|
278
|
+
*
|
279
|
+
* \param[out] dr_mode If the process is registered, the mode provided
|
280
|
+
* at registration. Callers can pass NULL if this
|
281
|
+
* value is not needed.
|
282
|
+
*
|
283
|
+
* \param[out] debug If the process is registered, the debug flag
|
284
|
+
* provided at registration. Callers can pass NULL
|
285
|
+
* if this value is not needed.
|
286
|
+
*
|
287
|
+
* \param[out] dr_options If the process is registered, the extra DynamoRIO
|
288
|
+
* parameters provided at registration. Callers can
|
289
|
+
* pass NULL if this value is not needed. Otherwise,
|
290
|
+
* the parameter must be a caller-allocated array of
|
291
|
+
* length #DR_MAX_OPTIONS_LENGTH.
|
292
|
+
*
|
293
|
+
* \return true if the process is registered for the given platform.
|
294
|
+
*/
|
295
|
+
void
|
296
|
+
dr_registered_process_iterator_next(dr_registered_process_iterator_t *iter,
|
297
|
+
char *process_name /* OUT */,
|
298
|
+
char *dr_root_dir /* OUT */,
|
299
|
+
dr_operation_mode_t *dr_mode /* OUT */,
|
300
|
+
bool *debug /* OUT */,
|
301
|
+
char *dr_options /* OUT */);
|
302
|
+
|
303
|
+
/**
|
304
|
+
* Stops and frees a registered process iterator.
|
305
|
+
*
|
306
|
+
* \param[in] iter A registered process iterator created with
|
307
|
+
* dr_registered_process_iterator_start()
|
308
|
+
*/
|
309
|
+
void
|
310
|
+
dr_registered_process_iterator_stop(dr_registered_process_iterator_t *iter);
|
311
|
+
|
312
|
+
/**
|
313
|
+
* Register a client for a particular process. Note that the process must
|
314
|
+
* first be registered via dr_register_process() before calling this routine.
|
315
|
+
*
|
316
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
317
|
+
* of the target process. The string should
|
318
|
+
* identify the base name of the process, not the
|
319
|
+
* full path of the executable (e.g., calc.exe).
|
320
|
+
*
|
321
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
322
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
323
|
+
* This parameter allows selecting which of those
|
324
|
+
* configurations to unset.
|
325
|
+
*
|
326
|
+
* \param[in] client_id A client_id_t uniquely identifying the client.
|
327
|
+
* DynamoRIO provides the client ID as a parameter
|
328
|
+
* to dr_init(). Clients use this ID to retrieve
|
329
|
+
* client-specific path and option information.
|
330
|
+
* Outside entities also identify the target of
|
331
|
+
* a nudge via this ID.
|
332
|
+
*
|
333
|
+
* \param[in] client_pri The client number, or priority. Client registration
|
334
|
+
* includes a value indicating the priority of a client
|
335
|
+
* relative to other clients. In multi-client settings,
|
336
|
+
* a client's priority influences event callback
|
337
|
+
* ordering. That is, higher priority clients can
|
338
|
+
* register their callbacks first; DynamoRIO then calls
|
339
|
+
* these routines last. Client priorities range
|
340
|
+
* consecutively from 0 to N-1, where N is the number
|
341
|
+
* of registered clients. Specify priority
|
342
|
+
* 0 to register a client with highest priority.
|
343
|
+
*
|
344
|
+
* \param[in] client_path A NULL-terminated string specifying the full path
|
345
|
+
* to a valid client library. The string length
|
346
|
+
* cannot exceed MAX_PATH. The client path may not
|
347
|
+
* include any semicolons.
|
348
|
+
*
|
349
|
+
* \param[in] client_options A NULL-terminated string specifying options that
|
350
|
+
* are available to the client via dr_get_options().
|
351
|
+
* The string length cannot exceed #DR_MAX_OPTIONS_LENGTH.
|
352
|
+
* The client options may not include any semicolons.
|
353
|
+
*
|
354
|
+
* \return A dr_config_status_t code indicating the result of registration.
|
355
|
+
*/
|
356
|
+
dr_config_status_t
|
357
|
+
dr_register_client(const char *process_name,
|
358
|
+
dr_platform_t dr_platform,
|
359
|
+
client_id_t client_id,
|
360
|
+
size_t client_pri,
|
361
|
+
const char *client_path,
|
362
|
+
const char *client_options);
|
363
|
+
|
364
|
+
/**
|
365
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
366
|
+
* of the target process. The string should
|
367
|
+
* identify the base name of the process, not the
|
368
|
+
* full path of the executable (e.g., calc.exe).
|
369
|
+
*
|
370
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
371
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
372
|
+
* This parameter allows selecting which of those
|
373
|
+
* configurations to unset.
|
374
|
+
*
|
375
|
+
* \param[in] client_id The unique client ID provided at client
|
376
|
+
* registration.
|
377
|
+
*
|
378
|
+
* \return A dr_config_status_t code indicating the result of unregistration.
|
379
|
+
*/
|
380
|
+
dr_config_status_t
|
381
|
+
dr_unregister_client(const char *process_name,
|
382
|
+
dr_platform_t dr_platform,
|
383
|
+
client_id_t client_id);
|
384
|
+
|
385
|
+
/**
|
386
|
+
* Retrieve the number of clients registered for a particular process.
|
387
|
+
*
|
388
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
389
|
+
* of the target process. The string should
|
390
|
+
* identify the base name of the process, not the
|
391
|
+
* full path of the executable (e.g., calc.exe).
|
392
|
+
*
|
393
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
394
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
395
|
+
* This parameter allows selecting which of those
|
396
|
+
* configurations to unset.
|
397
|
+
*
|
398
|
+
* \return The number of clients registered for the given process and platform.
|
399
|
+
*/
|
400
|
+
size_t
|
401
|
+
dr_num_registered_clients(const char *process_name,
|
402
|
+
dr_platform_t dr_platform);
|
403
|
+
|
404
|
+
/**
|
405
|
+
* Retrieve client registration information for a particular process.
|
406
|
+
*
|
407
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
408
|
+
* of the target process. The string should
|
409
|
+
* identify the base name of the process, not the
|
410
|
+
* full path of the executable (e.g., calc.exe).
|
411
|
+
*
|
412
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
413
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
414
|
+
* This parameter allows selecting which of those
|
415
|
+
* configurations to unset.
|
416
|
+
*
|
417
|
+
* \param[in] client_id The unique client ID provided at client
|
418
|
+
* registration.
|
419
|
+
*
|
420
|
+
* \param[out] client_pri The client's priority.
|
421
|
+
*
|
422
|
+
* \param[out] client_path The client's path provided at registration.
|
423
|
+
* Callers can pass NULL if this value is not needed.
|
424
|
+
* Otherwise, the parameter must be a caller-allocated
|
425
|
+
* array of length MAX_PATH.
|
426
|
+
*
|
427
|
+
* \param[out] client_options The client options provided at registration.
|
428
|
+
* Callers can pass NULL if this value is not needed.
|
429
|
+
* Otherwise, the parameter must be a caller-allocated
|
430
|
+
* array of length #DR_MAX_OPTIONS_LENGTH.
|
431
|
+
*
|
432
|
+
* \return A dr_config_status_t code indicating the result of the call.
|
433
|
+
*/
|
434
|
+
dr_config_status_t
|
435
|
+
dr_get_client_info(const char *process_name,
|
436
|
+
dr_platform_t dr_platform,
|
437
|
+
client_id_t client_id,
|
438
|
+
size_t *client_pri, /* OUT */
|
439
|
+
char *client_path, /* OUT */
|
440
|
+
char *client_options /* OUT */);
|
441
|
+
|
442
|
+
typedef struct _dr_client_iterator_t dr_client_iterator_t;
|
443
|
+
|
444
|
+
/**
|
445
|
+
* Creates and starts an iterator for iterating over all clients registered for
|
446
|
+
* the given process.
|
447
|
+
*
|
448
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
449
|
+
* of the target process. The string should
|
450
|
+
* identify the base name of the process, not the
|
451
|
+
* full path of the executable (e.g., calc.exe).
|
452
|
+
*
|
453
|
+
* \param[in] dr_platform Configurations are kept separate on 64-bit Windows
|
454
|
+
* for 32-bit (WOW64) processes and 64-bit processes.
|
455
|
+
* This parameter allows selecting which of those
|
456
|
+
* configurations to check.
|
457
|
+
*
|
458
|
+
* \return iterator for use with dr_client_iterator_hasnext() and
|
459
|
+
* dr_client_iterator_next(). Must be freed with
|
460
|
+
* dr_client_iterator_stop()
|
461
|
+
*/
|
462
|
+
dr_client_iterator_t *
|
463
|
+
dr_client_iterator_start(const char *process_name,
|
464
|
+
dr_platform_t dr_platform);
|
465
|
+
|
466
|
+
/**
|
467
|
+
* \param[in] iter A client iterator created with dr_client_iterator_start()
|
468
|
+
*
|
469
|
+
* \return true if there are more clients to iterate over
|
470
|
+
*/
|
471
|
+
bool
|
472
|
+
dr_client_iterator_hasnext(dr_client_iterator_t *iter);
|
473
|
+
|
474
|
+
/**
|
475
|
+
* Return information about a client.
|
476
|
+
*
|
477
|
+
* \param[in] iter A client iterator created with dr_client_iterator_start()
|
478
|
+
*
|
479
|
+
* \param[out] client_id The unique client ID provided at client registration.
|
480
|
+
*
|
481
|
+
* \param[out] client_pri The client's priority.
|
482
|
+
*
|
483
|
+
* \param[out] client_path The client's path provided at registration.
|
484
|
+
* Callers can pass NULL if this value is not needed.
|
485
|
+
* Otherwise, the parameter must be a caller-allocated
|
486
|
+
* array of length MAX_PATH.
|
487
|
+
*
|
488
|
+
* \param[out] client_options The client options provided at registration.
|
489
|
+
* Callers can pass NULL if this value is not needed.
|
490
|
+
* Otherwise, the parameter must be a caller-allocated
|
491
|
+
* array of length #DR_MAX_OPTIONS_LENGTH.
|
492
|
+
*/
|
493
|
+
void
|
494
|
+
dr_client_iterator_next(dr_client_iterator_t *iter,
|
495
|
+
client_id_t *client_id, /* OUT */
|
496
|
+
size_t *client_pri, /* OUT */
|
497
|
+
char *client_path, /* OUT */
|
498
|
+
char *client_options /* OUT */);
|
499
|
+
|
500
|
+
/**
|
501
|
+
* Stops and frees a client iterator.
|
502
|
+
*
|
503
|
+
* \param[in] iter A client iterator created with dr_client_iterator_start()
|
504
|
+
*/
|
505
|
+
void
|
506
|
+
dr_client_iterator_stop(dr_client_iterator_t *iter);
|
507
|
+
|
508
|
+
|
509
|
+
/**
|
510
|
+
* Provides a mechanism for an external entity on the guest OS to
|
511
|
+
* communicate with a client. Requires administrative privileges. A
|
512
|
+
* process 'nudge' causes a client event handler to be invoked (use
|
513
|
+
* dr_register_nudge_event() to register the handler function). A
|
514
|
+
* nudge is ignored if the process is not running under DynamoRIO,
|
515
|
+
* the specified client is not loaded, or if the client does not
|
516
|
+
* provide a handler.
|
517
|
+
*
|
518
|
+
* \param[in] process_name A NULL-terminated string specifying the name
|
519
|
+
* of the target process. The string should
|
520
|
+
* identify the base name of the process, not the
|
521
|
+
* full path of the executable.
|
522
|
+
*
|
523
|
+
* \param[in] client_id The unique client ID provided at client
|
524
|
+
* registration.
|
525
|
+
*
|
526
|
+
* \param[in] arg An argument passed to the client's nudge
|
527
|
+
* handler.
|
528
|
+
*
|
529
|
+
* \param[in] timeout_ms The number of milliseconds to wait for each
|
530
|
+
* nudge to complete before continuing. If INFINITE
|
531
|
+
* is supplied then the wait is unbounded. If 0
|
532
|
+
* is supplied the no wait is performed. If a
|
533
|
+
* wait times out DR_NUDGE_TIMEOUT will be returned.
|
534
|
+
*
|
535
|
+
* \param[out] nudge_count Returns the number of processes nudged.
|
536
|
+
* Client can supply NULL if this value is
|
537
|
+
* not needed.
|
538
|
+
*
|
539
|
+
* \return A dr_config_status_t code indicating the result of the nudge.
|
540
|
+
*
|
541
|
+
* \remarks
|
542
|
+
* If there are multiple processes executing with the same name, all
|
543
|
+
* of them are nudged.
|
544
|
+
*
|
545
|
+
* \remarks
|
546
|
+
* A process nudge is a one way asynchronous communication from an
|
547
|
+
* external entity to a client. It does not allow a client to
|
548
|
+
* return information back to the nudge originator. To communicate
|
549
|
+
* from a client to another process, use the channels specified
|
550
|
+
* in \ref sec_comm.
|
551
|
+
*
|
552
|
+
* \note Nudging 64-bit processes is not yet supported.
|
553
|
+
*/
|
554
|
+
dr_config_status_t
|
555
|
+
dr_nudge_process(const char *process_name,
|
556
|
+
client_id_t client_id,
|
557
|
+
uint64 arg,
|
558
|
+
uint timeout_ms,
|
559
|
+
int *nudge_count /*OUT */);
|
560
|
+
|
561
|
+
/**
|
562
|
+
* Provides a mechanism for an external entity on the guest OS to
|
563
|
+
* communicate with a client. Requires administrative privileges. A
|
564
|
+
* process 'nudge' causes a client event handler to be invoked (use
|
565
|
+
* dr_register_nudge_event() to register the handler function). A
|
566
|
+
* nudge is ignored if the process is not running under DynamoRIO,
|
567
|
+
* the specified client is not loaded, or if the client does not
|
568
|
+
* provide a handler.
|
569
|
+
*
|
570
|
+
* \param[in] process_id The system id of the process to nudge
|
571
|
+
* (see dr_get_process_id())
|
572
|
+
*
|
573
|
+
* \param[in] client_id The unique client ID provided at client
|
574
|
+
* registration.
|
575
|
+
*
|
576
|
+
* \param[in] arg An argument passed to the client's nudge
|
577
|
+
* handler.
|
578
|
+
*
|
579
|
+
* \param[in] timeout_ms The number of milliseconds to wait for the
|
580
|
+
* nudge to complete before returning. If INFINITE
|
581
|
+
* is supplied then the wait is unbounded. If 0
|
582
|
+
* is supplied the no wait is performed. If the
|
583
|
+
* wait times out DR_NUDGE_TIMEOUT will be returned.
|
584
|
+
*
|
585
|
+
* \return A dr_config_status_t code indicating the result of the nudge.
|
586
|
+
*
|
587
|
+
* \remarks
|
588
|
+
* A process nudge is a one way asynchronous communication from an
|
589
|
+
* external entity to a client. It does not allow a client to
|
590
|
+
* return information back to the nudge originator. To communicate
|
591
|
+
* from a client to another process, use the channels specified
|
592
|
+
* in \ref sec_comm.
|
593
|
+
*
|
594
|
+
* \note Nudging 64-bit processes is not yet supported.
|
595
|
+
*/
|
596
|
+
dr_config_status_t
|
597
|
+
dr_nudge_pid(process_id_t process_id,
|
598
|
+
client_id_t client_id,
|
599
|
+
uint64 arg,
|
600
|
+
uint timeout_ms);
|
601
|
+
|
602
|
+
/**
|
603
|
+
* Provides a mechanism for an external entity on the guest OS to
|
604
|
+
* communicate with a client. Requires administrative privileges. A
|
605
|
+
* process 'nudge' causes a client event handler to be invoked (use
|
606
|
+
* dr_register_nudge_event() to register the handler function). A
|
607
|
+
* nudge is ignored if the process is not running under DynamoRIO,
|
608
|
+
* the specified client is not loaded, or if the client does not
|
609
|
+
* provide a handler. Nudges are attempted to all processes running
|
610
|
+
* on the system.
|
611
|
+
*
|
612
|
+
* \param[in] client_id The unique client ID provided at client
|
613
|
+
* registration.
|
614
|
+
*
|
615
|
+
* \param[in] arg An argument passed to the client's nudge
|
616
|
+
* handler.
|
617
|
+
*
|
618
|
+
* \param[in] timeout_ms The number of milliseconds to wait for each
|
619
|
+
* nudge to complete before continuing. If INFINITE
|
620
|
+
* is supplied then the wait is unbounded. If 0
|
621
|
+
* is supplied the no wait is performed. If a
|
622
|
+
* wait times out DR_NUDGE_TIMEOUT will be returned.
|
623
|
+
*
|
624
|
+
* \param[out] nudge_count Returns the number of processes nudged.
|
625
|
+
* Client can supply NULL if this value is
|
626
|
+
* not needed.
|
627
|
+
*
|
628
|
+
* \return A dr_config_status_t code indicating the result of the nudge.
|
629
|
+
*
|
630
|
+
* \remarks
|
631
|
+
* A process nudge is a one way asynchronous communication from an
|
632
|
+
* external entity to a client. It does not allow a client to
|
633
|
+
* return information back to the nudge originator. To communicate
|
634
|
+
* from a client to another process, use the channels specified
|
635
|
+
* in \ref sec_comm.
|
636
|
+
*
|
637
|
+
* \note Nudging 64-bit processes is not yet supported.
|
638
|
+
*/
|
639
|
+
dr_config_status_t
|
640
|
+
dr_nudge_all(client_id_t client_id,
|
641
|
+
uint64 arg,
|
642
|
+
uint timeout_ms,
|
643
|
+
int *nudge_count /*OUT */);
|
644
|
+
|
645
|
+
#endif /* WINDOWS */
|
646
|
+
|
647
|
+
|
648
|
+
|
649
|
+
|
650
|
+
#endif /* _DR_CONFIG_H_ */
|