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