blob: 32ec99b51cb884233ca116a15ad1f561e1e553bd [file] [log] [blame]
/* **********************************************************
* Copyright (c) 2005-2006 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.
*/
/*
*
* implementations of API wrappers
*
*/
#include "share.h"
#include "config.h"
#include "processes.h"
#include "elm.h"
#ifndef UNIT_TEST
DWORD
disable_protection()
{
return unset_autoinjection();
}
DWORD
enable_protection()
{
return set_autoinjection();
}
BOOL
is_protection_enabled()
{
return is_autoinjection_set();
}
DWORD
enable_protection_ex(BOOL inject, DWORD flags,
const WCHAR *blacklist,
const WCHAR *whitelist, DWORD *list_error,
const WCHAR *custom_preinject_name,
WCHAR *current_list, SIZE_T maxchars)
{
return set_autoinjection_ex(inject, flags, blacklist, whitelist,
list_error, custom_preinject_name,
current_list, maxchars);
}
DWORD
inject_status(process_id_t pid, DWORD *status, DWORD *build)
{
DWORD dll_stat, res = ERROR_SUCCESS;
dll_stat = under_dynamorio_ex(pid, build);
switch (dll_stat) {
case DLL_NONE:
*status = INJECT_STATUS_NATIVE;
break;
case DLL_UNKNOWN:
*status = INJECT_STATUS_UNKNOWN;
break;
case DLL_RELEASE:
case DLL_DEBUG:
case DLL_PROFILE:
case DLL_CUSTOM:
*status = INJECT_STATUS_PROTECTED;
break;
case DLL_PATHHAS:
default:
*status = INJECT_STATUS_UNKNOWN;
res = ERROR_INVALID_PARAMETER;
break;
}
return res;
}
DWORD
consistency_detach(DWORD timeout)
{
DWORD res;
ConfigGroup *policy;
if (is_protection_enabled()) {
res = read_config_group(&policy, L_PRODUCT_NAME, TRUE);
if (res != ERROR_SUCCESS)
return res;
res = detach_all_not_in_config_group(policy, timeout);
free_config_group(policy);
}
else {
res = detach_all(timeout);
}
return res;
}
BOOL
is_process_pending_restart(process_id_t pid)
{
DWORD res;
ConfigGroup *policy;
BOOL pending_restart;
res = read_config_group(&policy, L_PRODUCT_NAME, TRUE);
if (res != ERROR_SUCCESS)
return FALSE;
res = check_status_and_pending_restart(policy, pid,
&pending_restart,
NULL, NULL);
if (res != ERROR_SUCCESS)
return FALSE;
free_config_group(policy);
return pending_restart;
}
BOOL
is_any_process_pending_restart()
{
DWORD res;
ConfigGroup *policy;
BOOL pending_restart;
res = read_config_group(&policy, L_PRODUCT_NAME, TRUE);
if (res != ERROR_SUCCESS)
return FALSE;
res = is_anything_pending_restart(policy, &pending_restart);
if (res != ERROR_SUCCESS)
return FALSE;
free_config_group(policy);
return pending_restart;
}
HANDLE
get_eventlog_monitor_thread_handle()
{
return get_elm_thread_handle();
}
const WCHAR *
get_installation_path()
{
return get_dynamorio_home();
}
const WCHAR *
get_product_name()
{
return L_PRODUCT_NAME;
}
#else // ifdef UNIT_TEST
int
main()
{
set_debuglevel(DL_INFO);
set_abortlevel(DL_WARN);
/* FIXME: wrapper testing (but may not be necessary...) */
DO_ASSERT(get_eventlog_monitor_thread_handle() == NULL);
CHECKED_OPERATION(clear_policy());
DO_ASSERT(!is_any_process_pending_restart());
printf("All Test Passed\n");
return 0;
}
#endif