blob: 14baec04250b34d18a0834e13754fda3bb22109d [file] [log] [blame]
/* **********************************************************
* Copyright (c) 2011-2014 Google, Inc. All rights reserved.
* Copyright (c) 2008-2010 VMware, Inc. All rights reserved.
* **********************************************************/
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of VMware, Inc. nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
#ifndef _DR_CONFIG_H_
#define _DR_CONFIG_H_ 1
/* Internally we mark routines with export linkage. */
#include "configure.h" /* for WINDOWS/UNIX */
#include "globals_shared.h" /* for DR_EXPORT */
/* DR_API EXPORT TOFILE dr_config.h */
/* DR_API EXPORT BEGIN */
/****************************************************************************
* Deployment API
*/
/**
* @file dr_config.h
* @brief Deployment API for DynamoRIO. Use these functions to register
* processes to run under DynamoRIO, unregister processes, obtain existing
* registration information, and nudge running processes.
* \note The dr_config library is currently not multi-thread safe. Users of
* the library should ensure that no more then one thread accesses the library
* at a time. This limitation will be addressed in future releases.
*/
/** Maximum length of a registered process's options string */
#define DR_MAX_OPTIONS_LENGTH 2048
/** Specifies DynamoRIO's operation mode. */
typedef enum {
/**
* No mode. Clients should not attempt to register a process in
* this mode.
*/
DR_MODE_NONE = 0,
/** Run DynamoRIO in Code Manipulation mode. */
#ifdef HOT_PATCHING_INTERFACE
/** Note that this mode also supports the Probe API. */
#endif
DR_MODE_CODE_MANIPULATION = 1,
#ifdef HOT_PATCHING_INTERFACE
/** Run DynamoRIO in Probe mode. This mode has no code cache. */
DR_MODE_PROBE = 2,
#endif
#ifdef PROGRAM_SHEPHERDING
/** Run DynamoRIO in Memory Firewall mode. */
DR_MODE_MEMORY_FIREWALL = 3,
#endif
/**
* Do not run this application under DynamoRIO control.
* Useful for following all child processes except a handful
* (blacklist).
*/
DR_MODE_DO_NOT_RUN = 4,
} dr_operation_mode_t;
/** Return status codes for process registration, unregistration and nudging. */
typedef enum {
/** Operation succeeded. */
DR_SUCCESS,
/** Process registration failed due to an existing registration. */
DR_PROC_REG_EXISTS,
/** Operation failed because the supplied process is not registered. */
DR_PROC_REG_INVALID,
/** Client registration failed due to an invalid priority value. */
DR_PRIORITY_INVALID,
/** Client registration failed due to a conflicting ID. */
DR_ID_CONFLICTING,
/** Client operation failed due to an invalid client ID. */
DR_ID_INVALID,
/** Unknown failure. Check that caller has adequate permissions for this operation. */
DR_FAILURE,
/** Nudge operation failed because the specified process id is not under DR. */
DR_NUDGE_PID_NOT_INJECTED,
/** Nudge operation timed out waiting for target process to finish handling a nudge.*/
DR_NUDGE_TIMEOUT,
/** Field length exceeded, probably due to a too-long option string */
DR_CONFIG_STRING_TOO_LONG,
/** Failed to write to the config file. */
DR_CONFIG_FILE_WRITE_FAILED,
/** Nudge operation failed because the specified process id does not exist. */
DR_NUDGE_PID_NOT_FOUND,
/** Client options contain invalid characters (';' or all 3 quotes). */
DR_CONFIG_OPTIONS_INVALID,
/**
* Failed to locate a valid config dir.
* Consider calling dr_get_config_dir(, true, ,).
*/
DR_CONFIG_DIR_NOT_FOUND,
} dr_config_status_t;
/** Allow targeting both 32-bit and native 64-bit processes separately. */
typedef enum {
DR_PLATFORM_DEFAULT, /**< The platform this tool is compiled for. */
DR_PLATFORM_32BIT, /**< 32-bit settings (for 32-bit processes). */
DR_PLATFORM_64BIT, /**< 64-bit settings (for native 64-bit processes). */
} dr_platform_t;
/* Note that we provide this as an inlined function for use by
* dr_nudge_client and dr_nudge_client_ex without requiring drconfiglib
* to be linked into a client.
*/
/**
* Translates dr_config_status_t code to its corresponding message string.
*
* \param[in] code dr_config_status_t code to be translated.
*
* \return The translated message string.
*/
static inline const char *
dr_config_status_code_to_string(dr_config_status_t code)
{
const char *msg;
/* XXX: should we have a string array for lookup instead?
* If so, we must make sure the consistency between the array and
* the status enum.
*/
switch (code) {
case DR_SUCCESS:
msg = "success";
break;
case DR_PROC_REG_EXISTS:
msg = "registration already exists";
break;
case DR_PROC_REG_INVALID:
msg = "target process is not registered";
break;
case DR_PRIORITY_INVALID:
msg = "invalid priority value";
break;
case DR_ID_CONFLICTING:
msg = "conflicting ID";
break;
case DR_ID_INVALID:
msg = "invalid client ID";
break;
case DR_NUDGE_PID_NOT_INJECTED:
msg = "target process is not under DynamoRIO";
break;
case DR_NUDGE_TIMEOUT:
msg = "timed out";
break;
case DR_CONFIG_STRING_TOO_LONG:
msg = "config option string too long";
break;
case DR_CONFIG_FILE_WRITE_FAILED:
msg = "failed to write to the config file";
break;
case DR_NUDGE_PID_NOT_FOUND:
msg = "target process id does not exist";
break;
case DR_CONFIG_DIR_NOT_FOUND:
msg = "failed to locate a valid config directory";
break;
case DR_FAILURE:
msg = "unknown failure";
break;
default:
msg = "invalid dr_config_status_t code";
break;
}
return msg;
}
DR_EXPORT
/**
* Register a process to run under DynamoRIO.
* Note that this routine only sets the base options to run a process
* under DynamoRIO. To register one or more clients, call
* dr_register_client() subsequently.
*
* In order to use local config files when the normal interactive user
* home directory environment variable (HOME on Linux or MacOS;
* USERPROFILE on Windows) is not set and when using one-step
* configure-and-run (i.e., when \p pid != 0), call
* dr_get_config_dir() prior to creating the child process (and prior
* to calling this routine) and pass true for \p alternative_local.
* For multi-step, the caller must set the DYNAMORIO_CONFIGDIR
* environment variable before calling this routine.
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable (e.g., calc.exe).
*
* \param[in] pid A process id of a target process, typically just
* created and suspended via dr_inject_process_exit().
* If \p pid != 0, a one-time configuration is created
* just for it. If \p pid == 0, a general configuration
* is created for all future instances of process_name.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] dr_root_dir A NULL-terminated string specifying the full
* path to a valid DynamoRIO root directory.
* The string length cannot exceed MAX_PATH.
*
* \param[in] dr_mode Specifies the mode under which DynamoRIO should
* operate. See dr_operation_mode_t.
*
* \param[in] debug If true, a DynamoRIO debug build will be used;
* otherwise, a release build will be used.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to set.
*
* \param[in] dr_options A NULL-terminated string controlling
* DynamoRIO's behavior. Most users should
* not need to specify options. The total
* string length cannot exceed #DR_MAX_OPTIONS_LENGTH.
*
* \return A dr_config_status_t code indicating the result of
* registration. Note that registration fails if the requested
* process is already registered. To modify a process's
* registration, first call dr_unregister_process() to remove an
* existing registration.
*
* \remarks
* After registration, a process will run under DynamoRIO when launched by the
* drinject tool or using drinjectlib. Note that some processes may require a
* system reboot to restart. Process registration that is not specific to one
* pid (i.e., if \p pid == 0) persists across reboots until explicitly
* unregistered.
*/
dr_config_status_t
dr_register_process(const char *process_name,
process_id_t pid,
bool global,
const char *dr_root_dir,
dr_operation_mode_t dr_mode,
bool debug,
dr_platform_t dr_platform,
const char *dr_options);
DR_EXPORT
/**
* Unregister a process from running under DynamoRIO.
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable (e.g., calc.exe).
*
* \param[in] pid A process id of a target process, typically just
* created and suspended via dr_inject_process_exit().
* If pid != 0, the existing one-time configuration is
* removed. If pid == 0, the general configuration
* for process_name is removed.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to set.
*
* \return A dr_config_status_t code indicating the result of
* unregistration. Note that unregistration fails if the process
* is not currently registered to run under DynamoRIO.
*/
dr_config_status_t
dr_unregister_process(const char *process_name,
process_id_t pid,
bool global,
dr_platform_t dr_platform);
#ifdef WINDOWS
DR_EXPORT
/**
* Sets up systemwide injection so that registered applications will run under
* DynamoRIO however they are launched (i.e., they do not need to be explicitly
* invoked with the drrun or drinject tools). This requires administrative
* privileges and affects all users (though configurations remain private to
* each user). On Windows NT, a reboot is required for this to take effect.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* to use.
*
* \param[in] dr_root_dir The root DynamoRIO directory.
*
* \return A dr_config_status_t code indicating the result of
* the operation. The operation will fail if the caller does
* not have sufficient privileges.
*
* \note On Windows, an application that does not link with user32.dll will not be
* run under control of DynamoRIO via systemwide injection. Such applications
* will only be under DynamoRIO control if launched by the drrun or drinject
* tools or if the parent process (typically explorer.exe, for manually launched
* applications) is already under DynamoRIO control (the parent can be in any
* mode, but a 32-bit parent cannot inject into a 64-bit child). Only some small
* non-graphical applications do not link with user32.dll.
*
* \note Not yet available on Linux or MacOS.
*/
dr_config_status_t
dr_register_syswide(dr_platform_t dr_platform,
const char *dr_root_dir);
DR_EXPORT
/**
* Disables systemwide injection. Registered applications will not run
* under DynamoRIO unless explicitly launched with the drrun or drinject
* tools (or a custom tool that uses the drinjectlib library).
* On Windows NT, a reboot is required for this to take effect.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* to use.
*
* \param[in] dr_root_dir The root DynamoRIO directory.
*
* \return A dr_config_status_t code indicating the result of
* the operation. The operation will fail if the caller does
* not have sufficient privileges.
*
* \note Not yet available on Linux or MacOS.
*/
dr_config_status_t
dr_unregister_syswide(dr_platform_t dr_platform,
const char *dr_root_dir);
DR_EXPORT
/**
* Returns whether systemwide injection is enabled.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* to use.
*
* \param[in] dr_root_dir The root DynamoRIO directory.
*
* \return Whether systemwide injection is enabled.
*
* \note Not yet available on Linux or MacOS.
*/
bool
dr_syswide_is_on(dr_platform_t dr_platform,
const char *dr_root_dir);
#endif /* WINDOWS */
DR_EXPORT
/**
* Check if a process is registered to run under DynamoRIO. To obtain client
* information, use dr_get_client_info().
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable (e.g., calc.exe).
*
* \param[in] pid A process id of a target process, typically just
* created and suspended via dr_inject_process_exit().
* If pid != 0, the one-time configuration for that pid
* will be queried. If pid == 0, the general
* configuration for process_name will be queried.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to check.
*
* \param[out] dr_root_dir If the process is registered, the root DynamoRIO
* directory provided at registration. Callers can
* pass NULL if this value is not needed. Otherwise,
* the parameter must be a caller-allocated array of
* length MAX_PATH.
*
* \param[out] dr_mode If the process is registered, the mode provided
* at registration. Callers can pass NULL if this
* value is not needed.
*
* \param[out] debug If the process is registered, the debug flag
* provided at registration. Callers can pass NULL
* if this value is not needed.
*
* \param[out] dr_options If the process is registered, the extra DynamoRIO
* parameters provided at registration. Callers can
* pass NULL if this value is not needed. Otherwise,
* the parameter must be a caller-allocated array of
* length #DR_MAX_OPTIONS_LENGTH.
*
* \return true if the process is registered for the given platform.
*/
bool
dr_process_is_registered(const char *process_name,
process_id_t pid,
bool global,
dr_platform_t dr_platform,
char *dr_root_dir /* OUT */,
dr_operation_mode_t *dr_mode /* OUT */,
bool *debug /* OUT */,
char *dr_options /* OUT */);
#ifdef WINDOWS
typedef struct _dr_registered_process_iterator_t dr_registered_process_iterator_t;
DR_EXPORT
/**
* Creates and starts an iterator for iterating over all processes registered for
* the given platform and given global or local parameter.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to check.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \return iterator for use with dr_registered_process_iterator_hasnext()and
* dr_registered_process_iterator_next(). Must be freed
* with dr_registered_process_iterator_stop()
*
* \note Not yet available on Linux or MacOS.
*/
dr_registered_process_iterator_t *
dr_registered_process_iterator_start(dr_platform_t dr_platform,
bool global);
DR_EXPORT
/**
* \param[in] iter A registered process iterator created with
* dr_registered_process_iterator_start()
*
* \return true if there are more registered processes to iterate over
*
* \note Not yet available on Linux or MacOS.
*/
bool
dr_registered_process_iterator_hasnext(dr_registered_process_iterator_t *iter);
DR_EXPORT
/**
* Return information about a registered process
*
* \param[in] iter A registered process iterator created with
* dr_registered_process_iterator_start().
*
* \param[out] process_name The name of the registered process. Callers can
* pass NULL if this value is not needed. Otherwise
* the parameter must be a caller-allocated array
* of length MAX_PATH.
*
* \param[out] dr_root_dir The root DynamoRIO directory provided at registration.
* Callers can pass NULL if this value is not needed.
* Otherwise, the parameter must be a caller-allocated
* array of length MAX_PATH.
*
* \param[out] dr_mode If the process is registered, the mode provided
* at registration. Callers can pass NULL if this
* value is not needed.
*
* \param[out] debug If the process is registered, the debug flag
* provided at registration. Callers can pass NULL
* if this value is not needed.
*
* \param[out] dr_options If the process is registered, the extra DynamoRIO
* parameters provided at registration. Callers can
* pass NULL if this value is not needed. Otherwise,
* the parameter must be a caller-allocated array of
* length #DR_MAX_OPTIONS_LENGTH.
*
* \return true if the information was successfully retrieved.
*
* \note Not yet available on Linux or MacOS.
*/
bool
dr_registered_process_iterator_next(dr_registered_process_iterator_t *iter,
char *process_name /* OUT */,
char *dr_root_dir /* OUT */,
dr_operation_mode_t *dr_mode /* OUT */,
bool *debug /* OUT */,
char *dr_options /* OUT */);
DR_EXPORT
/**
* Stops and frees a registered process iterator.
*
* \param[in] iter A registered process iterator created with
* dr_registered_process_iterator_start()
*
* \note Not yet available on Linux or MacOS.
*/
void
dr_registered_process_iterator_stop(dr_registered_process_iterator_t *iter);
#endif /* WINDOWS */
DR_EXPORT
/**
* Register a client for a particular process. Note that the process must first
* be registered via dr_register_process() before calling this routine.
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable (e.g., calc.exe).
*
* \param[in] pid A process id of a target process, typically just
* created and suspended via dr_inject_process_exit().
* If pid != 0, the one-time configuration for that pid
* will be modified. If pid == 0, the general
* configuration for process_name will be modified.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to unset.
*
* \param[in] client_id A client_id_t uniquely identifying the client.
* DynamoRIO provides the client ID as a parameter
* to dr_init(). Clients use this ID to retrieve
* client-specific path and option information.
* Outside entities also identify the target of
* a nudge via this ID.
*
* \param[in] client_pri The client number, or priority. Client registration
* includes a value indicating the priority of a client
* relative to other clients. In multi-client settings,
* a client's priority influences event callback
* ordering. That is, higher priority clients can
* register their callbacks first; DynamoRIO then calls
* these routines last. Client priorities range
* consecutively from 0 to N-1, where N is the number
* of registered clients. Specify priority
* 0 to register a client with highest priority.
*
* \param[in] client_path A NULL-terminated string specifying the full path
* to a valid client library. The string length
* cannot exceed MAX_PATH. The client path may not
* include any semicolons and when combined with
* \p client_options may not include all
* three quote characters (', ", `) simultaneously.
*
* \param[in] client_options A NULL-terminated string specifying options that
* are available to the client via dr_get_options().
* The string length cannot exceed #DR_MAX_OPTIONS_LENGTH.
* The client options may not include any semicolons
* and when combined with \p client_path may not include
* all three quote characters (', ", `) simultaneously.
*
* \return A dr_config_status_t code indicating the result of registration.
*/
dr_config_status_t
dr_register_client(const char *process_name,
process_id_t pid,
bool global,
dr_platform_t dr_platform,
client_id_t client_id,
size_t client_pri,
const char *client_path,
const char *client_options);
DR_EXPORT
/**
* Unregister a client for a particular process.
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable (e.g., calc.exe).
*
* \param[in] pid A process id of a target process, typically just
* created and suspended via dr_inject_process_exit().
* If pid != 0, the one-time configuration for that pid
* will be modified. If pid == 0, the general
* configuration for process_name will be modified.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to unset.
*
* \param[in] client_id The unique client ID provided at client
* registration.
*
* \return A dr_config_status_t code indicating the result of unregistration.
*/
dr_config_status_t
dr_unregister_client(const char *process_name,
process_id_t pid,
bool global,
dr_platform_t dr_platform,
client_id_t client_id);
DR_EXPORT
/**
* Retrieve the number of clients registered for a particular process for
* the current user.
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable (e.g., calc.exe).
*
* \param[in] pid A process id of a target process, typically just
* created and suspended via dr_inject_process_exit().
* If pid != 0, the one-time configuration for that pid
* will be queried. If pid == 0, the general
* configuration for process_name will be queried.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to unset.
*
* \return The number of clients registered for the given process and platform.
*/
size_t
dr_num_registered_clients(const char *process_name,
process_id_t pid,
bool global,
dr_platform_t dr_platform);
DR_EXPORT
/**
* Retrieve client registration information for a particular process for
* the current user.
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable (e.g., calc.exe).
*
* \param[in] pid A process id of a target process, typically just
* created and suspended via dr_inject_process_exit().
* If pid != 0, the one-time configuration for that pid
* will be queried. If pid == 0, the general
* configuration for process_name will be queried.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to unset.
*
* \param[in] client_id The unique client ID provided at client
* registration.
*
* \param[out] client_pri The client's priority.
*
* \param[out] client_path The client's path provided at registration.
* Callers can pass NULL if this value is not needed.
* Otherwise, the parameter must be a caller-allocated
* array of length MAX_PATH.
*
* \param[out] client_options The client options provided at registration.
* Callers can pass NULL if this value is not needed.
* Otherwise, the parameter must be a caller-allocated
* array of length #DR_MAX_OPTIONS_LENGTH.
*
* \return A dr_config_status_t code indicating the result of the call.
*/
dr_config_status_t
dr_get_client_info(const char *process_name,
process_id_t pid,
bool global,
dr_platform_t dr_platform,
client_id_t client_id,
size_t *client_pri, /* OUT */
char *client_path, /* OUT */
char *client_options /* OUT */);
typedef struct _dr_client_iterator_t dr_client_iterator_t;
DR_EXPORT
/**
* Creates and starts an iterator for iterating over all clients registered for
* the given process.
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable (e.g., calc.exe).
*
* \param[in] pid A process id of a target process, typically just
* created and suspended via dr_inject_process_exit().
* If pid != 0, the one-time configuration for that pid
* will be queried. If pid == 0, the general
* configuration for process_name will be queried.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] dr_platform Configurations are kept separate
* for 32-bit processes and 64-bit processes.
* This parameter allows selecting which of those
* configurations to check.
*
* \return iterator for use with dr_client_iterator_hasnext() and
* dr_client_iterator_next(). Must be freed with
* dr_client_iterator_stop()
*/
dr_client_iterator_t *
dr_client_iterator_start(const char *process_name,
process_id_t pid,
bool global,
dr_platform_t dr_platform);
DR_EXPORT
/**
* \param[in] iter A client iterator created with dr_client_iterator_start()
*
* \return true if there are more clients to iterate over
*/
bool
dr_client_iterator_hasnext(dr_client_iterator_t *iter);
DR_EXPORT
/**
* Return information about a client.
*
* \param[in] iter A client iterator created with dr_client_iterator_start()
*
* \param[out] client_id The unique client ID provided at client registration.
*
* \param[out] client_pri The client's priority.
*
* \param[out] client_path The client's path provided at registration.
* Callers can pass NULL if this value is not needed.
* Otherwise, the parameter must be a caller-allocated
* array of length MAX_PATH.
*
* \param[out] client_options The client options provided at registration.
* Callers can pass NULL if this value is not needed.
* Otherwise, the parameter must be a caller-allocated
* array of length #DR_MAX_OPTIONS_LENGTH.
*/
void
dr_client_iterator_next(dr_client_iterator_t *iter,
client_id_t *client_id, /* OUT */
size_t *client_pri, /* OUT */
char *client_path, /* OUT */
char *client_options /* OUT */);
DR_EXPORT
/**
* Stops and frees a client iterator.
*
* \param[in] iter A client iterator created with dr_client_iterator_start()
*/
void
dr_client_iterator_stop(dr_client_iterator_t *iter);
#ifdef WINDOWS
DR_EXPORT
/**
* Provides a mechanism for an external entity on the guest OS to
* communicate with a client. Requires administrative privileges. A
* process 'nudge' causes a client event handler to be invoked (use
* dr_register_nudge_event() to register the handler function). A
* nudge is ignored if the process is not running under DynamoRIO,
* the specified client is not loaded, or if the client does not
* provide a handler.
*
* \param[in] process_name A NULL-terminated string specifying the name
* of the target process. The string should
* identify the base name of the process, not the
* full path of the executable.
*
* \param[in] client_id The unique client ID provided at client
* registration.
*
* \param[in] arg An argument passed to the client's nudge
* handler.
*
* \param[in] timeout_ms The number of milliseconds to wait for each
* nudge to complete before continuing. If INFINITE
* is supplied then the wait is unbounded. If 0
* is supplied the no wait is performed. If a
* wait times out DR_NUDGE_TIMEOUT will be returned.
*
* \param[out] nudge_count Returns the number of processes nudged.
* Client can supply NULL if this value is
* not needed.
*
* \return A dr_config_status_t code indicating the result of the nudge.
*
* \remarks
* If there are multiple processes executing with the same name, all
* of them are nudged.
*
* \remarks
* A process nudge is a one way asynchronous communication from an
* external entity to a client. It does not allow a client to
* return information back to the nudge originator. To communicate
* from a client to another process, use the channels specified
* in \ref sec_comm.
*
* \note Not yet available on Linux or MacOS.
*/
dr_config_status_t
dr_nudge_process(const char *process_name,
client_id_t client_id,
uint64 arg,
uint timeout_ms,
int *nudge_count /*OUT */);
#endif
DR_EXPORT
/**
* Provides a mechanism for an external entity on the guest OS to
* communicate with a client. Requires administrative privileges. A
* process 'nudge' causes a client event handler to be invoked (use
* dr_register_nudge_event() to register the handler function). A
* nudge is ignored if the process is not running under DynamoRIO,
* the specified client is not loaded, or if the client does not
* provide a handler.
*
* \param[in] process_id The system id of the process to nudge
* (see dr_get_process_id())
*
* \param[in] client_id The unique client ID provided at client
* registration.
*
* \param[in] arg An argument passed to the client's nudge
* handler.
*
* \param[in] timeout_ms The number of milliseconds to wait for the
* nudge to complete before returning. If INFINITE
* is supplied then the wait is unbounded. If 0
* is supplied the no wait is performed. If the
* wait times out DR_NUDGE_TIMEOUT will be returned.
*
* \return A dr_config_status_t code indicating the result of the nudge.
*
* \remarks
* A process nudge is a one way asynchronous communication from an
* external entity to a client. It does not allow a client to
* return information back to the nudge originator. To communicate
* from a client to another process, use the channels specified
* in \ref sec_comm.
*
* \note Not yet available on MacOS.
*/
dr_config_status_t
dr_nudge_pid(process_id_t process_id,
client_id_t client_id,
uint64 arg,
uint timeout_ms);
#ifdef WINDOWS
DR_EXPORT
/**
* Provides a mechanism for an external entity on the guest OS to
* communicate with a client. Requires administrative privileges. A
* process 'nudge' causes a client event handler to be invoked (use
* dr_register_nudge_event() to register the handler function). A
* nudge is ignored if the process is not running under DynamoRIO,
* the specified client is not loaded, or if the client does not
* provide a handler. Nudges are attempted to all processes running
* on the system.
*
* \param[in] client_id The unique client ID provided at client
* registration.
*
* \param[in] arg An argument passed to the client's nudge
* handler.
*
* \param[in] timeout_ms The number of milliseconds to wait for each
* nudge to complete before continuing. If INFINITE
* is supplied then the wait is unbounded. If 0
* is supplied the no wait is performed. If a
* wait times out DR_NUDGE_TIMEOUT will be returned.
*
* \param[out] nudge_count Returns the number of processes nudged.
* Client can supply NULL if this value is
* not needed.
*
* \return A dr_config_status_t code indicating the result of the nudge.
*
* \remarks
* A process nudge is a one way asynchronous communication from an
* external entity to a client. It does not allow a client to
* return information back to the nudge originator. To communicate
* from a client to another process, use the channels specified
* in \ref sec_comm.
*
* \note Not yet available on Linux or MacOS.
*/
dr_config_status_t
dr_nudge_all(client_id_t client_id,
uint64 arg,
uint timeout_ms,
int *nudge_count /*OUT */);
#endif /* WINDOWS */
DR_EXPORT
/**
* Returns in \p config_dir the configuration directory used to store config
* files. In order to use local config files when the normal interactive user
* home directory environment variable (HOME on Linux or MacOS; USERPROFILE on Windows)
* is not set and when using one-step configure-and-run, call this routine prior
* to creating the child process and pass true for \p alternative_local. For
* multi-step, the caller must set the DYNAMORIO_CONFIGDIR environment variable
* (in the child process) to point at the resulting \p config_dir.
*
* \param[in] global Whether to use global or user-local config
* files. On Windows, global config files are
* stored in a dir pointed at by the DYNAMORIO_HOME
* registry key. On Linux, they are in
* /etc/dynamorio. Administrative privileges may
* be needed if global is true. Note that
* DynamoRIO gives local config files precedence
* when both exist. The caller must separately
* create the global directory.
*
* \param[in] alternative_local Whether to locate a temporary directory to
* use for user-local config files and to set
* the DYNAMORIO_CONFIGDIR environment variable
* to point at it, if the regular local
* config dir is not found.
*
* \param[out] config_dir Receives the full path to the config dir.
*
* \param[in] config_dir_sz The capacity, in characters, of \p config_dir.
*
* \return A dr_config_status_t code indicating the result of the request.
*/
dr_config_status_t
dr_get_config_dir(bool global,
bool alternative_local,
char *config_dir /* OUT */,
size_t config_dir_sz);
/* DR_API EXPORT END */
#endif /* _DR_CONFIG_H_ */