hyperic-sigar 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +339 -0
- data/EXCEPTIONS +104 -0
- data/README +2 -0
- data/Rakefile +87 -0
- data/bindings/SigarWrapper.pm +2934 -0
- data/bindings/ruby/examples/cpu_info.rb +16 -0
- data/bindings/ruby/examples/df.rb +32 -0
- data/bindings/ruby/examples/free.rb +19 -0
- data/bindings/ruby/examples/ifconfig.rb +67 -0
- data/bindings/ruby/examples/netstat.rb +54 -0
- data/bindings/ruby/examples/pargs.rb +18 -0
- data/bindings/ruby/examples/penv.rb +14 -0
- data/bindings/ruby/examples/route.rb +31 -0
- data/bindings/ruby/examples/who.rb +13 -0
- data/bindings/ruby/extconf.rb +110 -0
- data/bindings/ruby/rbsigar.c +628 -0
- data/include/sigar.h +901 -0
- data/include/sigar_fileinfo.h +141 -0
- data/include/sigar_format.h +65 -0
- data/include/sigar_getline.h +18 -0
- data/include/sigar_log.h +82 -0
- data/include/sigar_private.h +365 -0
- data/include/sigar_ptql.h +55 -0
- data/include/sigar_util.h +192 -0
- data/src/os/aix/aix_sigar.c +1927 -0
- data/src/os/aix/sigar_os.h +71 -0
- data/src/os/darwin/darwin_sigar.c +3450 -0
- data/src/os/darwin/sigar_os.h +82 -0
- data/src/os/hpux/dlpi.c +284 -0
- data/src/os/hpux/hpux_sigar.c +1205 -0
- data/src/os/hpux/sigar_os.h +51 -0
- data/src/os/linux/linux_sigar.c +2595 -0
- data/src/os/linux/sigar_os.h +84 -0
- data/src/os/netware/netware_sigar.c +719 -0
- data/src/os/netware/sigar_os.h +26 -0
- data/src/os/osf1/osf1_sigar.c +593 -0
- data/src/os/osf1/sigar_os.h +42 -0
- data/src/os/solaris/get_mib2.c +321 -0
- data/src/os/solaris/get_mib2.h +127 -0
- data/src/os/solaris/hmekstat.h +77 -0
- data/src/os/solaris/kstats.c +182 -0
- data/src/os/solaris/procfs.c +99 -0
- data/src/os/solaris/sigar_os.h +225 -0
- data/src/os/solaris/solaris_sigar.c +2561 -0
- data/src/os/stub/sigar_os.h +8 -0
- data/src/os/stub/stub_sigar.c +303 -0
- data/src/os/win32/peb.c +213 -0
- data/src/os/win32/sigar_os.h +623 -0
- data/src/os/win32/sigar_pdh.h +49 -0
- data/src/os/win32/win32_sigar.c +3718 -0
- data/src/sigar.c +2292 -0
- data/src/sigar_cache.c +181 -0
- data/src/sigar_fileinfo.c +792 -0
- data/src/sigar_format.c +649 -0
- data/src/sigar_getline.c +1849 -0
- data/src/sigar_ptql.c +1966 -0
- data/src/sigar_signal.c +218 -0
- data/src/sigar_util.c +1061 -0
- data/version.properties +11 -0
- metadata +112 -0
@@ -0,0 +1,303 @@
|
|
1
|
+
#include "sigar.h"
|
2
|
+
#include "sigar_private.h"
|
3
|
+
#include "sigar_os.h"
|
4
|
+
#include "sigar_util.h"
|
5
|
+
|
6
|
+
int sigar_os_open(sigar_t **sigar)
|
7
|
+
{
|
8
|
+
*sigar = malloc(sizeof(**sigar));
|
9
|
+
|
10
|
+
return SIGAR_OK;
|
11
|
+
}
|
12
|
+
|
13
|
+
int sigar_os_close(sigar_t *sigar)
|
14
|
+
{
|
15
|
+
free(sigar);
|
16
|
+
return SIGAR_OK;
|
17
|
+
}
|
18
|
+
|
19
|
+
char *sigar_os_error_string(sigar_t *sigar, int err)
|
20
|
+
{
|
21
|
+
return NULL;
|
22
|
+
}
|
23
|
+
|
24
|
+
int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
|
25
|
+
{
|
26
|
+
mem->total = -1;
|
27
|
+
mem->ram = -1;
|
28
|
+
mem->used = -1;
|
29
|
+
mem->free = -1;
|
30
|
+
mem->actual_free = mem->free;
|
31
|
+
mem->actual_used = mem->used;
|
32
|
+
return SIGAR_OK;
|
33
|
+
}
|
34
|
+
|
35
|
+
int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
|
36
|
+
{
|
37
|
+
swap->total = -1;
|
38
|
+
swap->used = -1;
|
39
|
+
swap->free = -1;
|
40
|
+
swap->page_in = -1;
|
41
|
+
swap->page_out = -1;
|
42
|
+
|
43
|
+
return SIGAR_OK;
|
44
|
+
}
|
45
|
+
|
46
|
+
int sigar_cpu_get(sigar_t *sigar, sigar_cpu_t *cpu)
|
47
|
+
{
|
48
|
+
cpu->user = -1;
|
49
|
+
cpu->nice = -1;
|
50
|
+
cpu->sys = -1;
|
51
|
+
cpu->idle = -1;
|
52
|
+
cpu->wait = -1;
|
53
|
+
|
54
|
+
cpu->total = cpu->user + cpu->nice + cpu->sys + cpu->idle;
|
55
|
+
|
56
|
+
return SIGAR_OK;
|
57
|
+
}
|
58
|
+
|
59
|
+
int sigar_cpu_list_get(sigar_t *sigar, sigar_cpu_list_t *cpulist)
|
60
|
+
{
|
61
|
+
return SIGAR_ENOTIMPL;
|
62
|
+
}
|
63
|
+
|
64
|
+
int sigar_uptime_get(sigar_t *sigar,
|
65
|
+
sigar_uptime_t *uptime)
|
66
|
+
{
|
67
|
+
uptime->uptime = -1;
|
68
|
+
|
69
|
+
return SIGAR_OK;
|
70
|
+
}
|
71
|
+
|
72
|
+
int sigar_loadavg_get(sigar_t *sigar,
|
73
|
+
sigar_loadavg_t *loadavg)
|
74
|
+
{
|
75
|
+
loadavg->loadavg[0] = -1;
|
76
|
+
loadavg->loadavg[1] = -1;
|
77
|
+
loadavg->loadavg[2] = -1;
|
78
|
+
|
79
|
+
return SIGAR_OK;
|
80
|
+
}
|
81
|
+
|
82
|
+
int sigar_proc_list_get(sigar_t *sigar,
|
83
|
+
sigar_proc_list_t *proclist)
|
84
|
+
{
|
85
|
+
return SIGAR_ENOTIMPL;
|
86
|
+
}
|
87
|
+
|
88
|
+
int sigar_proc_mem_get(sigar_t *sigar, sigar_pid_t pid,
|
89
|
+
sigar_proc_mem_t *procmem)
|
90
|
+
{
|
91
|
+
procmem->size = -1;
|
92
|
+
procmem->share = -1;
|
93
|
+
procmem->resident = -1;
|
94
|
+
procmem->page_faults = -1;
|
95
|
+
procmem->minor_faults = -1;
|
96
|
+
procmem->major_faults = -1;
|
97
|
+
|
98
|
+
return SIGAR_OK;
|
99
|
+
}
|
100
|
+
|
101
|
+
int sigar_proc_cred_get(sigar_t *sigar, sigar_pid_t pid,
|
102
|
+
sigar_proc_cred_t *proccred)
|
103
|
+
{
|
104
|
+
proccred->uid = -1;
|
105
|
+
proccred->gid = -1;
|
106
|
+
proccred->euid = -1;
|
107
|
+
proccred->egid = -1;
|
108
|
+
|
109
|
+
return SIGAR_OK;
|
110
|
+
}
|
111
|
+
|
112
|
+
int sigar_proc_time_get(sigar_t *sigar, sigar_pid_t pid,
|
113
|
+
sigar_proc_time_t *proctime)
|
114
|
+
{
|
115
|
+
proctime->start_time = -1;
|
116
|
+
proctime->user = -1;
|
117
|
+
proctime->sys = -1;
|
118
|
+
proctime->total = proctime->user + proctime->sys;
|
119
|
+
|
120
|
+
return SIGAR_OK;
|
121
|
+
}
|
122
|
+
|
123
|
+
int sigar_proc_state_get(sigar_t *sigar, sigar_pid_t pid,
|
124
|
+
sigar_proc_state_t *procstate)
|
125
|
+
{
|
126
|
+
SIGAR_SSTRCPY(procstate->name, "java");
|
127
|
+
procstate->ppid = -1;
|
128
|
+
procstate->priority = -1;
|
129
|
+
procstate->nice = -1;
|
130
|
+
procstate->tty = -1;
|
131
|
+
procstate->state = 'R';
|
132
|
+
procstate->threads = -1;
|
133
|
+
procstate->processor = -1;
|
134
|
+
|
135
|
+
return SIGAR_OK;
|
136
|
+
}
|
137
|
+
|
138
|
+
int sigar_proc_args_get(sigar_t *sigar, sigar_pid_t pid,
|
139
|
+
sigar_proc_args_t *procargs)
|
140
|
+
{
|
141
|
+
return SIGAR_ENOTIMPL;
|
142
|
+
}
|
143
|
+
|
144
|
+
int sigar_proc_env_get(sigar_t *sigar, sigar_pid_t pid,
|
145
|
+
sigar_proc_env_t *procenv)
|
146
|
+
{
|
147
|
+
return SIGAR_ENOTIMPL;
|
148
|
+
}
|
149
|
+
|
150
|
+
int sigar_proc_fd_get(sigar_t *sigar, sigar_pid_t pid,
|
151
|
+
sigar_proc_fd_t *procfd)
|
152
|
+
{
|
153
|
+
procfd->total = -1;
|
154
|
+
return SIGAR_OK;
|
155
|
+
}
|
156
|
+
|
157
|
+
int sigar_proc_exe_get(sigar_t *sigar, sigar_pid_t pid,
|
158
|
+
sigar_proc_exe_t *procexe)
|
159
|
+
{
|
160
|
+
return SIGAR_ENOTIMPL;
|
161
|
+
}
|
162
|
+
|
163
|
+
int sigar_proc_modules_get(sigar_t *sigar, sigar_pid_t pid,
|
164
|
+
sigar_proc_modules_t *procmods)
|
165
|
+
{
|
166
|
+
return SIGAR_ENOTIMPL;
|
167
|
+
}
|
168
|
+
|
169
|
+
int sigar_thread_cpu_get(sigar_t *sigar,
|
170
|
+
sigar_uint64_t id,
|
171
|
+
sigar_thread_cpu_t *cpu)
|
172
|
+
{
|
173
|
+
return SIGAR_ENOTIMPL;
|
174
|
+
}
|
175
|
+
|
176
|
+
int sigar_os_fs_type_get(sigar_file_system_t *fsp)
|
177
|
+
{
|
178
|
+
fsp->type = SIGAR_FSTYPE_UNKNOWN;
|
179
|
+
|
180
|
+
return SIGAR_OK;
|
181
|
+
}
|
182
|
+
|
183
|
+
int sigar_file_system_list_get(sigar_t *sigar,
|
184
|
+
sigar_file_system_list_t *fslist)
|
185
|
+
{
|
186
|
+
sigar_file_system_list_create(fslist);
|
187
|
+
|
188
|
+
return SIGAR_OK;
|
189
|
+
}
|
190
|
+
|
191
|
+
int sigar_disk_usage_get(sigar_t *sigar, const char *name,
|
192
|
+
sigar_disk_usage_t *usage)
|
193
|
+
{
|
194
|
+
return SIGAR_ENOTIMPL;
|
195
|
+
}
|
196
|
+
|
197
|
+
int sigar_file_system_usage_get(sigar_t *sigar,
|
198
|
+
const char *dirname,
|
199
|
+
sigar_file_system_usage_t *fsusage)
|
200
|
+
{
|
201
|
+
fsusage->total = -1;
|
202
|
+
fsusage->free = -1;
|
203
|
+
fsusage->avail = -1;
|
204
|
+
fsusage->used = -1;
|
205
|
+
fsusage->files = -1;
|
206
|
+
fsusage->free_files = -1;
|
207
|
+
SIGAR_DISK_STATS_INIT(&fsusage->disk);
|
208
|
+
|
209
|
+
return SIGAR_OK;
|
210
|
+
}
|
211
|
+
|
212
|
+
int sigar_cpu_info_list_get(sigar_t *sigar,
|
213
|
+
sigar_cpu_info_list_t *cpu_infos)
|
214
|
+
{
|
215
|
+
sigar_cpu_info_t *info;
|
216
|
+
|
217
|
+
sigar_cpu_info_list_create(cpu_infos);
|
218
|
+
|
219
|
+
info = &cpu_infos->data[cpu_infos->number++];
|
220
|
+
|
221
|
+
SIGAR_SSTRCPY(info->vendor, "vendor");
|
222
|
+
SIGAR_SSTRCPY(info->model, "model");
|
223
|
+
info->mhz = -1;
|
224
|
+
info->cache_size = -1;
|
225
|
+
|
226
|
+
return SIGAR_OK;
|
227
|
+
}
|
228
|
+
|
229
|
+
int sigar_net_route_list_get(sigar_t *sigar,
|
230
|
+
sigar_net_route_list_t *routelist)
|
231
|
+
{
|
232
|
+
return SIGAR_ENOTIMPL;
|
233
|
+
}
|
234
|
+
|
235
|
+
int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
|
236
|
+
sigar_net_interface_stat_t *ifstat)
|
237
|
+
{
|
238
|
+
ifstat->rx_bytes = -1;
|
239
|
+
ifstat->rx_packets = -1;
|
240
|
+
ifstat->rx_errors = -1;
|
241
|
+
ifstat->rx_dropped = -1;
|
242
|
+
ifstat->rx_overruns = -1;
|
243
|
+
ifstat->rx_frame = -1;
|
244
|
+
|
245
|
+
ifstat->tx_bytes = -1;
|
246
|
+
ifstat->tx_packets = -1;
|
247
|
+
ifstat->tx_errors = -1;
|
248
|
+
ifstat->tx_dropped = -1;
|
249
|
+
ifstat->tx_overruns = -1;
|
250
|
+
ifstat->tx_collisions = -1;
|
251
|
+
ifstat->tx_carrier = -1;
|
252
|
+
ifstat->speed = -1;
|
253
|
+
|
254
|
+
return SIGAR_OK;
|
255
|
+
}
|
256
|
+
|
257
|
+
int sigar_net_connection_walk(sigar_net_connection_walker_t *walker)
|
258
|
+
{
|
259
|
+
return SIGAR_ENOTIMPL;
|
260
|
+
}
|
261
|
+
|
262
|
+
SIGAR_DECLARE(int)
|
263
|
+
sigar_tcp_get(sigar_t *sigar,
|
264
|
+
sigar_tcp_t *tcp)
|
265
|
+
{
|
266
|
+
return SIGAR_ENOTIMPL;
|
267
|
+
}
|
268
|
+
|
269
|
+
int sigar_nfs_client_v2_get(sigar_t *sigar,
|
270
|
+
sigar_nfs_client_v2_t *nfs)
|
271
|
+
{
|
272
|
+
return SIGAR_ENOTIMPL;
|
273
|
+
}
|
274
|
+
|
275
|
+
int sigar_nfs_server_v2_get(sigar_t *sigar,
|
276
|
+
sigar_nfs_server_v2_t *nfs)
|
277
|
+
{
|
278
|
+
return SIGAR_ENOTIMPL;
|
279
|
+
}
|
280
|
+
|
281
|
+
int sigar_nfs_client_v3_get(sigar_t *sigar,
|
282
|
+
sigar_nfs_client_v3_t *nfs)
|
283
|
+
{
|
284
|
+
return SIGAR_ENOTIMPL;
|
285
|
+
}
|
286
|
+
|
287
|
+
int sigar_nfs_server_v3_get(sigar_t *sigar,
|
288
|
+
sigar_nfs_server_v3_t *nfs)
|
289
|
+
{
|
290
|
+
return SIGAR_ENOTIMPL;
|
291
|
+
}
|
292
|
+
|
293
|
+
int sigar_proc_port_get(sigar_t *sigar, int protocol,
|
294
|
+
unsigned long port, sigar_pid_t *pid)
|
295
|
+
{
|
296
|
+
return SIGAR_ENOTIMPL;
|
297
|
+
}
|
298
|
+
|
299
|
+
int sigar_os_sys_info_get(sigar_t *sigar,
|
300
|
+
sigar_sys_info_t *sysinfo)
|
301
|
+
{
|
302
|
+
return SIGAR_OK;
|
303
|
+
}
|
data/src/os/win32/peb.c
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
|
3
|
+
* This file is part of SIGAR.
|
4
|
+
*
|
5
|
+
* SIGAR is free software; you can redistribute it and/or modify
|
6
|
+
* it under the terms version 2 of the GNU General Public License as
|
7
|
+
* published by the Free Software Foundation. This program is distributed
|
8
|
+
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
9
|
+
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
10
|
+
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
11
|
+
* details.
|
12
|
+
*
|
13
|
+
* You should have received a copy of the GNU General Public License
|
14
|
+
* along with this program; if not, write to the Free Software
|
15
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
16
|
+
* USA.
|
17
|
+
*/
|
18
|
+
|
19
|
+
/*
|
20
|
+
* functions for getting info from the Process Environment Block
|
21
|
+
*/
|
22
|
+
#define UNICODE
|
23
|
+
#define _UNICODE
|
24
|
+
|
25
|
+
#include "sigar.h"
|
26
|
+
#include "sigar_private.h"
|
27
|
+
#include "sigar_os.h"
|
28
|
+
#include <shellapi.h>
|
29
|
+
|
30
|
+
void dllmod_init_ntdll(sigar_t *sigar);
|
31
|
+
|
32
|
+
#define sigar_NtQueryInformationProcess \
|
33
|
+
sigar->ntdll.query_proc_info.func
|
34
|
+
|
35
|
+
static int sigar_pbi_get(sigar_t *sigar, HANDLE proc, PEB *peb)
|
36
|
+
{
|
37
|
+
int status;
|
38
|
+
PROCESS_BASIC_INFORMATION pbi;
|
39
|
+
DWORD size=sizeof(pbi);
|
40
|
+
|
41
|
+
dllmod_init_ntdll(sigar);
|
42
|
+
|
43
|
+
if (!sigar_NtQueryInformationProcess) {
|
44
|
+
return SIGAR_ENOTIMPL;
|
45
|
+
}
|
46
|
+
|
47
|
+
SIGAR_ZERO(&pbi);
|
48
|
+
status =
|
49
|
+
sigar_NtQueryInformationProcess(proc,
|
50
|
+
ProcessBasicInformation,
|
51
|
+
&pbi,
|
52
|
+
size, NULL);
|
53
|
+
if (status != ERROR_SUCCESS) {
|
54
|
+
return status;
|
55
|
+
}
|
56
|
+
|
57
|
+
if (!pbi.PebBaseAddress) {
|
58
|
+
return !SIGAR_OK;
|
59
|
+
}
|
60
|
+
|
61
|
+
size = sizeof(*peb);
|
62
|
+
|
63
|
+
if (ReadProcessMemory(proc, pbi.PebBaseAddress, peb, size, NULL)) {
|
64
|
+
return SIGAR_OK;
|
65
|
+
}
|
66
|
+
else {
|
67
|
+
return GetLastError();
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
static int sigar_rtl_get(sigar_t *sigar, HANDLE proc,
|
72
|
+
RTL_USER_PROCESS_PARAMETERS *rtl)
|
73
|
+
{
|
74
|
+
PEB peb;
|
75
|
+
int status = sigar_pbi_get(sigar, proc, &peb);
|
76
|
+
DWORD size=sizeof(*rtl);
|
77
|
+
|
78
|
+
if (status != SIGAR_OK) {
|
79
|
+
return status;
|
80
|
+
}
|
81
|
+
|
82
|
+
if (ReadProcessMemory(proc, peb.ProcessParameters, rtl, size, NULL)) {
|
83
|
+
return SIGAR_OK;
|
84
|
+
}
|
85
|
+
else {
|
86
|
+
return GetLastError();
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
#define rtl_bufsize(buf, uc) \
|
91
|
+
((sizeof(buf) < uc.Length) ? sizeof(buf) : uc.Length)
|
92
|
+
|
93
|
+
int sigar_proc_exe_peb_get(sigar_t *sigar, HANDLE proc,
|
94
|
+
sigar_proc_exe_t *procexe)
|
95
|
+
{
|
96
|
+
int status;
|
97
|
+
WCHAR buf[MAX_PATH+1];
|
98
|
+
RTL_USER_PROCESS_PARAMETERS rtl;
|
99
|
+
DWORD size;
|
100
|
+
|
101
|
+
if ((status = sigar_rtl_get(sigar, proc, &rtl)) != SIGAR_OK) {
|
102
|
+
return status;
|
103
|
+
}
|
104
|
+
|
105
|
+
size = rtl_bufsize(buf, rtl.ImagePathName);
|
106
|
+
memset(buf, '\0', sizeof(buf));
|
107
|
+
|
108
|
+
if ((size > 0) &&
|
109
|
+
ReadProcessMemory(proc, rtl.ImagePathName.Buffer, buf, size, NULL))
|
110
|
+
{
|
111
|
+
SIGAR_W2A(buf, procexe->name, sizeof(procexe->name));
|
112
|
+
}
|
113
|
+
else {
|
114
|
+
procexe->name[0] = '\0';
|
115
|
+
}
|
116
|
+
|
117
|
+
size = rtl_bufsize(buf, rtl.CurrentDirectoryName);
|
118
|
+
memset(buf, '\0', sizeof(buf));
|
119
|
+
|
120
|
+
if ((size > 0) &&
|
121
|
+
ReadProcessMemory(proc, rtl.CurrentDirectoryName.Buffer, buf, size, NULL))
|
122
|
+
{
|
123
|
+
SIGAR_W2A(buf, procexe->cwd, sizeof(procexe->cwd));
|
124
|
+
}
|
125
|
+
else {
|
126
|
+
procexe->cwd[0] = '\0';
|
127
|
+
}
|
128
|
+
|
129
|
+
return SIGAR_OK;
|
130
|
+
}
|
131
|
+
|
132
|
+
int sigar_parse_proc_args(sigar_t *sigar, WCHAR *buf,
|
133
|
+
sigar_proc_args_t *procargs)
|
134
|
+
{
|
135
|
+
char arg[SIGAR_CMDLINE_MAX];
|
136
|
+
LPWSTR *args;
|
137
|
+
int num, i;
|
138
|
+
|
139
|
+
if (!buf) {
|
140
|
+
buf = GetCommandLine();
|
141
|
+
}
|
142
|
+
|
143
|
+
args = CommandLineToArgvW(buf, &num);
|
144
|
+
|
145
|
+
if (args == NULL) {
|
146
|
+
return SIGAR_OK;
|
147
|
+
}
|
148
|
+
|
149
|
+
for (i=0; i<num; i++) {
|
150
|
+
SIGAR_W2A(args[i], arg, SIGAR_CMDLINE_MAX);
|
151
|
+
SIGAR_PROC_ARGS_GROW(procargs);
|
152
|
+
procargs->data[procargs->number++] = sigar_strdup(arg);
|
153
|
+
}
|
154
|
+
|
155
|
+
GlobalFree(args);
|
156
|
+
|
157
|
+
return SIGAR_OK;
|
158
|
+
}
|
159
|
+
|
160
|
+
int sigar_proc_args_peb_get(sigar_t *sigar, HANDLE proc,
|
161
|
+
sigar_proc_args_t *procargs)
|
162
|
+
{
|
163
|
+
int status;
|
164
|
+
WCHAR buf[SIGAR_CMDLINE_MAX];
|
165
|
+
RTL_USER_PROCESS_PARAMETERS rtl;
|
166
|
+
DWORD size;
|
167
|
+
|
168
|
+
if ((status = sigar_rtl_get(sigar, proc, &rtl)) != SIGAR_OK) {
|
169
|
+
return status;
|
170
|
+
}
|
171
|
+
|
172
|
+
size = rtl_bufsize(buf, rtl.CommandLine);
|
173
|
+
memset(buf, '\0', sizeof(buf));
|
174
|
+
|
175
|
+
if ((size > 0) &&
|
176
|
+
ReadProcessMemory(proc, rtl.CommandLine.Buffer, buf, size, NULL))
|
177
|
+
{
|
178
|
+
return sigar_parse_proc_args(sigar, buf, procargs);
|
179
|
+
}
|
180
|
+
else {
|
181
|
+
return SIGAR_OK;
|
182
|
+
}
|
183
|
+
}
|
184
|
+
|
185
|
+
int sigar_proc_env_peb_get(sigar_t *sigar, HANDLE proc,
|
186
|
+
WCHAR *buf, DWORD size)
|
187
|
+
{
|
188
|
+
int status;
|
189
|
+
RTL_USER_PROCESS_PARAMETERS rtl;
|
190
|
+
MEMORY_BASIC_INFORMATION info;
|
191
|
+
|
192
|
+
if ((status = sigar_rtl_get(sigar, proc, &rtl)) != SIGAR_OK) {
|
193
|
+
return status;
|
194
|
+
}
|
195
|
+
|
196
|
+
memset(buf, '\0', size);
|
197
|
+
/* -2 to ensure \0\0 terminator */
|
198
|
+
size -= 2;
|
199
|
+
|
200
|
+
if (VirtualQueryEx(proc, rtl.Environment, &info, sizeof(info))) {
|
201
|
+
if (size > info.RegionSize) {
|
202
|
+
/* ReadProcessMemory beyond region would fail */
|
203
|
+
size = info.RegionSize;
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
if (ReadProcessMemory(proc, rtl.Environment, buf, size, NULL)) {
|
208
|
+
return SIGAR_OK;
|
209
|
+
}
|
210
|
+
else {
|
211
|
+
return GetLastError();
|
212
|
+
}
|
213
|
+
}
|