text: /* **********************************************************
   * Copyright (c) 2003-2009 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.
   */
  
  /* Copyright (c) 2003-2007 Determina Corp. */
  
  /*
   * inject_shared.h
   * 
   * Prototypes of facilities shared between the core library, the preinject library 
   * and the drinject executable.
   */
  
  #ifndef INJECT_SHARED_H
  #define INJECT_SHARED_H
  
  /* return codes for systemwide_should_inject, see notes there for more info */
  typedef enum {
      INJECT_FALSE    = 0,
      INJECT_TRUE     = 1,
      INJECT_EXCLUDED = 2,
      INJECT_EXPLICIT = 4
  } inject_setting_mask_t;
  
  /***************************************************************************/
  #ifdef PARAMS_IN_REGISTRY
  /* We've replaced the registry w/ config files (i#265/PR 486139, i#85/PR 212034)
   * but when PARAMS_IN_REGISTRY is defined we support the old registry scheme
   */
  
  /* value is a buffer allocated by the caller to hold the resulting value.
   *
   * The same parameter is looked up first in the application specific registry 
   * subtree and then in the global registry tree.  
   */
  int
  get_process_parameter(HANDLE phandle, 
                        const wchar_t *name, char *value, int maxlen);
  
  /* Only the process specific registry value is set.  */
  int 
  set_process_parameter(HANDLE phandle, const wchar_t *name, const char *value);
  
  /* Get parameter for current process, using registry view matching the
   * build of DR (so 64-bit DR looks at 64-bit registry, even for WO64 process).
   * If return value is not GET_PARAMETER_SUCCESS leaves original buffer contents 
   * intact (may not be true if GET_PARAMETER_BUF_TOO_SMALL is returned).
   */
  int
  get_parameter(const wchar_t *name, char *value, int maxlen);
  
  /* Identical to get_parameter: for compatibility w/ non-PARAMS_IN_REGISTRY */
  int
  get_parameter_ex(const wchar_t *name, char *value, int maxlen, bool ignore_cache);
  
  #ifdef X64
  /* Get parameter for current process name from 32-bit registry view.
   * If return value is not GET_PARAMETER_SUCCESS leaves original buffer contents 
   * intact (may not be true if GET_PARAMETER_BUF_TOO_SMALL is returned).
   */
  int
  get_parameter_32(const wchar_t *name, char *value, int maxlen);
  #else
  /* Get parameter for current process name from 64-bit registry view.
   * If return value is not GET_PARAMETER_SUCCESS leaves original buffer contents 
   * intact (may not be true if GET_PARAMETER_BUF_TOO_SMALL is returned).
   */
  int
  get_parameter_64(const wchar_t *name, char *value, int maxlen);
  #endif
  
  /* Get parameter for current processes root app key (not qualified app key).
   * For ex. would get parameter from svchost.exe instead of svchost.exe-netsvc. 
   * If return value is not GET_PARAMETER_SUCCESS leaves original buffer contents
   * intact (may not be true if GET_PARAMETER_BUF_TOO_SMALL is returned).
   */
  int
  get_unqualified_parameter(const wchar_t *name, char *value, int maxlen);
  
  /***************************************************************************/
  #else
  int
  get_parameter_from_registry(const wchar_t *name, char *value, /* OUT */
                              int maxlen /* up to MAX_REGISTRY_PARAMETER */) ;
  
  # ifndef NOT_DYNAMORIO_CORE
  int
  get_process_parameter(HANDLE phandle, const char *name, char *value, int maxlen);
  # endif
  
  # ifndef X64
  int
  get_parameter_64(const char *name, char *value, int maxlen);
  # endif
  #endif /* PARAMS_IN_REGISTRY */
  /***************************************************************************/
  
  /* get_own_*_name routines cache their values and are primed by os_init() */
  const wchar_t*
  get_own_qualified_name(void);
  
  const wchar_t*
  get_own_unqualified_name(void);
  
  const wchar_t*
  get_own_short_qualified_name(void);
  
  const wchar_t*
  get_own_short_unqualified_name(void);
  
  bool
  is_safe_mode(void);
  
  bool
  systemwide_inject_enabled(void);
  
  void 
  check_for_run_once(HANDLE process, int rununder_mask);
  
  #ifndef X64
  inject_setting_mask_t
  systemwide_should_inject_64(HANDLE process, int *mask);
  #endif
  
  inject_setting_mask_t
  systemwide_should_inject(HANDLE process, int *mask);
  
  int
  get_remote_process_ldr_status(HANDLE process_handle);
  
  
  /* utility functions */
  const char *
  double_strrchr(const char *string, char c1, char c2);
  
  const wchar_t *
  double_wcsrchr(const wchar_t *string, wchar_t c1, wchar_t c2);
  
  const wchar_t*
  w_get_short_name(const wchar_t *exename);
  
  /* in case we ever want to build as unicode app, normally set by the compiler,
   * if we want to build unicode we will have to set, however, since we 
   * preprocess with gcc, this is the define used in the windows headers */
  #ifdef _UNICODE
  # define double_tcsrchr double_wcsrchr
  #else
  # define double_tcsrchr double_strrchr
  #endif
  
  int
  wchar_to_char(char *cdst, size_t buflen, 
                PCWSTR wide_src, size_t bytelen);
  
  void
  display_message(char *msg, int wait_for_user);
  
  #endif
  