blob: dc4ab04176a3f05c9252f9770ee4bee2ee54f611 [file] [log] [blame]
/* **********************************************************
* Copyright (c) 2003-2008 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.
*/
/*
*
* processes.h
*
*/
#ifndef _DETERMINA_PROCESSES_H_
#define _DETERMINA_PROCESSES_H_
#include "config.h"
#ifdef __cplusplus
extern "C" {
#endif
#include "dr_stats.h" // from src tree
/* dup KPRIORITY and VM_COUNTERS from src/win32/ntdll.h, in order
* to have process_info_s self-contained.
* (so that, eg, src/ module is not necessary to build nodemgr.) */
#ifndef _NTDLL_H_
typedef LONG KPRIORITY;
/* format of data returned by QueryInformationProcess ProcessVmCounters */
typedef struct _VM_COUNTERS {
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
} VM_COUNTERS;
#endif
typedef struct process_info_s {
ULONG ThreadCount;
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
WCHAR *ProcessName;
KPRIORITY BasePriority;
ULONG ProcessID;
ULONG InheritedFromProcessID;
ULONG HandleCount;
VM_COUNTERS VmCounters;
} process_info_t;
typedef struct module_info_s {
PVOID BaseAddress;
PVOID EntryPoint;
ULONG SizeOfImage;
// strings are NULL terminated, non persistent and in this address space
WCHAR *FullDllName; // dll name with path (i.e. "c:\win\sys32\foo.dll")
WCHAR *BaseDllName; // just dll name (i.e. "foo.dll")
SHORT LoadCount;
SHORT TlsIndex;
ULONG TimeDateStamp;
process_id_t ProcessID; // ID of Process this module is loaded into
} module_info_t;
/* for process and dll callback routines; the callback should
* return FALSE to abort the walk */
typedef BOOL (*processwalk_callback)(process_info_t *pi, void **param);
typedef BOOL (*dllwalk_callback)(module_info_t *mi, void **param);
/*
* generic process information methods
*/
DWORD
dll_walk_proc(process_id_t ProcessID, dllwalk_callback dwcb, void **param);
DWORD
dll_walk_all(dllwalk_callback dwcb, void **param);
DWORD
process_walk(processwalk_callback pwcb, void **param);
DWORD
get_process_name_and_cmdline(process_id_t pid, WCHAR *name_buf, int name_len,
WCHAR *cmdline_buf, int cmdline_len);
DWORD
get_process_name(process_id_t pid, WCHAR *buf, int len);
DWORD
get_process_cmdline(process_id_t pid, WCHAR *buf, int len);
/*
* heavy-duty kill
*/
DWORD
terminate_process(process_id_t pid);
DWORD
terminate_process_by_exe(WCHAR *exename);
/*
* DR process status / drmarker functions
*/
int
under_dynamorio(process_id_t ProcessID);
int
under_dynamorio_ex(process_id_t ProcessID, DWORD *build_num);
/* pending_restart is required OUT parameter.
* status is optional OUT parameter -- if not NULL, will have the status
* of the process after successful return.
* process_cfg is optional OUT parameter -- if not NULL, will have a pointer
* to the config group in the config for this process, if available.
* for internal convenience, may pass NULL for config, in which case
* status is the only well-defined output parameter. */
DWORD
check_status_and_pending_restart(ConfigGroup *config, process_id_t pid,
BOOL *pending_restart, int *status,
ConfigGroup **process_cfg);
/* pending_restart is required OUT parameter */
DWORD
is_anything_pending_restart(ConfigGroup *c, BOOL *pending_restart);
/* hotpatch status: the returned pointer must be freed with
* free_hotp_status_table below. */
DWORD
get_hotp_status(process_id_t pid, hotp_policy_status_table_t **hotp_status);
/* if a hotp_status table was requested, it must be freed. */
void
free_hotp_status_table(hotp_policy_status_table_t *hotp_status);
dr_statistics_t *
get_dynamorio_stats(process_id_t pid);
void
free_dynamorio_stats(dr_statistics_t *stats);
/*
* Detach and nudge functions
*/
/* Loads the specified dll in process pid and waits on the loading thread, does
* not free the dll once the loading thread exits. Usual usage is for the
* loaded dll to do something in its DllMain. If you do not want the dll to
* stay loaded its DllMain should return false. To unload a dll from a process
* later, inject another dll whose dll main unloads that dll and then returns
* false. If loading_thread != NULL returns a handle to the loading thread (dll
* could call FreeLibraryAndExitThread on itself in its dll main to return a
* value out via the exit code). inject_dll provides no way to pass arguments
* in to the dll. */
DWORD
inject_dll(process_id_t pid, const WCHAR *dll_name, BOOL allow_upgraded_perms,
DWORD timeout_ms, PHANDLE loading_thread);
/* pending_restart is required OUT parameter */
DWORD
detach_all_not_in_config_group(ConfigGroup *c, DWORD timeout_ms);
/* generic nudge DR, action mask determines which actions will be executed */
DWORD
generic_nudge(process_id_t pid, BOOL allow_upgraded_perms, DWORD action_mask,
client_id_t id /* optional */, uint64 client_arg /* optional */,
DWORD timeout_ms);
/* generic nudge DR, action mask determines which actions will be executed,
* timeout_ms is the maximum time for a single process nudge
* delay_ms is pause between processing each process, 0 no pause
*/
DWORD
generic_nudge_all(DWORD action_mask, uint64 client_arg /* optional */, DWORD timeout_ms,
DWORD delay_ms);
#ifdef __cplusplus
}
#endif
#endif //_NM_PROCESSES_H_