| /* ********************************************************** |
| * 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 "lib/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_ |