Merge branch 'sigar-1.6'
This commit is contained in:
commit
1676d54123
|
@ -99,6 +99,9 @@ int sigar_proc_exe_peb_get(sigar_t *sigar, HANDLE proc,
|
||||||
RTL_USER_PROCESS_PARAMETERS rtl;
|
RTL_USER_PROCESS_PARAMETERS rtl;
|
||||||
DWORD size;
|
DWORD size;
|
||||||
|
|
||||||
|
procexe->name[0] = '\0';
|
||||||
|
procexe->cwd[0] = '\0';
|
||||||
|
|
||||||
if ((status = sigar_rtl_get(sigar, proc, &rtl)) != SIGAR_OK) {
|
if ((status = sigar_rtl_get(sigar, proc, &rtl)) != SIGAR_OK) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -111,9 +114,6 @@ int sigar_proc_exe_peb_get(sigar_t *sigar, HANDLE proc,
|
||||||
{
|
{
|
||||||
SIGAR_W2A(buf, procexe->name, sizeof(procexe->name));
|
SIGAR_W2A(buf, procexe->name, sizeof(procexe->name));
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
procexe->name[0] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
size = rtl_bufsize(buf, rtl.CurrentDirectoryName);
|
size = rtl_bufsize(buf, rtl.CurrentDirectoryName);
|
||||||
memset(buf, '\0', sizeof(buf));
|
memset(buf, '\0', sizeof(buf));
|
||||||
|
@ -123,9 +123,6 @@ int sigar_proc_exe_peb_get(sigar_t *sigar, HANDLE proc,
|
||||||
{
|
{
|
||||||
SIGAR_W2A(buf, procexe->cwd, sizeof(procexe->cwd));
|
SIGAR_W2A(buf, procexe->cwd, sizeof(procexe->cwd));
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
procexe->cwd[0] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
@ -171,15 +168,16 @@ int sigar_proc_args_peb_get(sigar_t *sigar, HANDLE proc,
|
||||||
}
|
}
|
||||||
|
|
||||||
size = rtl_bufsize(buf, rtl.CommandLine);
|
size = rtl_bufsize(buf, rtl.CommandLine);
|
||||||
|
if (size <= 0) {
|
||||||
|
return ERROR_DATATYPE_MISMATCH; /* fallback to wmi */
|
||||||
|
}
|
||||||
memset(buf, '\0', sizeof(buf));
|
memset(buf, '\0', sizeof(buf));
|
||||||
|
|
||||||
if ((size > 0) &&
|
if (ReadProcessMemory(proc, rtl.CommandLine.Buffer, buf, size, NULL)) {
|
||||||
ReadProcessMemory(proc, rtl.CommandLine.Buffer, buf, size, NULL))
|
|
||||||
{
|
|
||||||
return sigar_parse_proc_args(sigar, buf, procargs);
|
return sigar_parse_proc_args(sigar, buf, procargs);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return SIGAR_OK;
|
return GetLastError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1435,19 +1435,21 @@ static int sigar_remote_proc_args_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
char cmdline[SIGAR_CMDLINE_MAX], *ptr = cmdline, *arg;
|
char cmdline[SIGAR_CMDLINE_MAX], *ptr = cmdline, *arg;
|
||||||
HANDLE proc = open_process(pid);
|
HANDLE proc = open_process(pid);
|
||||||
|
|
||||||
if (!proc) {
|
if (proc) {
|
||||||
return GetLastError();
|
status = sigar_proc_args_peb_get(sigar, proc, procargs);
|
||||||
|
|
||||||
|
CloseHandle(proc);
|
||||||
|
|
||||||
|
if (status == SIGAR_OK) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
status = sigar_proc_args_peb_get(sigar, proc, procargs);
|
/* likely we are 32-bit, pid process is 64-bit */
|
||||||
|
status = sigar_proc_args_wmi_get(sigar, pid, procargs);
|
||||||
CloseHandle(proc);
|
if (status == ERROR_NOT_FOUND) {
|
||||||
|
status = SIGAR_NO_SUCH_PROCESS;
|
||||||
if (status == ERROR_DATATYPE_MISMATCH) {
|
|
||||||
/* we are 32-bit, pid process is 64-bit */
|
|
||||||
status = sigar_proc_args_wmi_get(sigar, pid, procargs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1608,10 +1610,13 @@ SIGAR_DECLARE(int) sigar_proc_exe_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
}
|
}
|
||||||
|
|
||||||
status = sigar_proc_exe_peb_get(sigar, proc, procexe);
|
status = sigar_proc_exe_peb_get(sigar, proc, procexe);
|
||||||
if (status == ERROR_DATATYPE_MISMATCH) {
|
if (procexe->name[0] == '\0') {
|
||||||
/* we are 32-bit, pid process is 64-bit */
|
/* likely we are 32-bit, pid process is 64-bit */
|
||||||
procexe->cwd[0] = '\0'; /* XXX where else can we try? */
|
/* procexe->cwd[0] = XXX where else can we try? */
|
||||||
status = sigar_proc_exe_wmi_get(sigar, pid, procexe);
|
status = sigar_proc_exe_wmi_get(sigar, pid, procexe);
|
||||||
|
if (status == ERROR_NOT_FOUND) {
|
||||||
|
status = SIGAR_NO_SUCH_PROCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (procexe->cwd[0] != '\0') {
|
if (procexe->cwd[0] != '\0') {
|
||||||
|
|
|
@ -42,15 +42,18 @@ class WMI {
|
||||||
HRESULT GetProcStringProperty(DWORD pid, TCHAR *name, TCHAR *value, DWORD len);
|
HRESULT GetProcStringProperty(DWORD pid, TCHAR *name, TCHAR *value, DWORD len);
|
||||||
HRESULT GetProcExecutablePath(DWORD pid, TCHAR *value);
|
HRESULT GetProcExecutablePath(DWORD pid, TCHAR *value);
|
||||||
HRESULT GetProcCommandLine(DWORD pid, TCHAR *value);
|
HRESULT GetProcCommandLine(DWORD pid, TCHAR *value);
|
||||||
|
int GetLastError();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IWbemServices *wbem;
|
IWbemServices *wbem;
|
||||||
|
HRESULT result;
|
||||||
BSTR GetProcQuery(DWORD pid);
|
BSTR GetProcQuery(DWORD pid);
|
||||||
};
|
};
|
||||||
|
|
||||||
WMI::WMI()
|
WMI::WMI()
|
||||||
{
|
{
|
||||||
wbem = NULL;
|
wbem = NULL;
|
||||||
|
result = S_OK;
|
||||||
CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,14 +63,31 @@ WMI::~WMI()
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* XXX must be a better way to map HRESULT */
|
||||||
|
int WMI::GetLastError()
|
||||||
|
{
|
||||||
|
switch (result) {
|
||||||
|
case S_OK:
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
case WBEM_E_NOT_FOUND:
|
||||||
|
return ERROR_NOT_FOUND;
|
||||||
|
case WBEM_E_ACCESS_DENIED:
|
||||||
|
return ERROR_ACCESS_DENIED;
|
||||||
|
case WBEM_E_NOT_SUPPORTED:
|
||||||
|
return SIGAR_ENOTIMPL;
|
||||||
|
default:
|
||||||
|
return ERROR_INVALID_FUNCTION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT WMI::Open(LPCTSTR machine, LPCTSTR user, LPCTSTR pass)
|
HRESULT WMI::Open(LPCTSTR machine, LPCTSTR user, LPCTSTR pass)
|
||||||
{
|
{
|
||||||
HRESULT result;
|
|
||||||
IWbemLocator *locator;
|
IWbemLocator *locator;
|
||||||
wchar_t path[MAX_PATH];
|
wchar_t path[MAX_PATH];
|
||||||
|
|
||||||
if (wbem) {
|
if (wbem) {
|
||||||
return S_OK;
|
result = S_OK;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
result =
|
result =
|
||||||
|
@ -116,6 +136,7 @@ void WMI::Close()
|
||||||
if (wbem) {
|
if (wbem) {
|
||||||
wbem->Release();
|
wbem->Release();
|
||||||
wbem = NULL;
|
wbem = NULL;
|
||||||
|
result = S_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +149,6 @@ BSTR WMI::GetProcQuery(DWORD pid)
|
||||||
|
|
||||||
HRESULT WMI::GetProcStringProperty(DWORD pid, TCHAR *name, TCHAR *value, DWORD len)
|
HRESULT WMI::GetProcStringProperty(DWORD pid, TCHAR *name, TCHAR *value, DWORD len)
|
||||||
{
|
{
|
||||||
HRESULT result;
|
|
||||||
IWbemClassObject *obj;
|
IWbemClassObject *obj;
|
||||||
VARIANT var;
|
VARIANT var;
|
||||||
|
|
||||||
|
@ -177,11 +197,11 @@ extern "C" int sigar_proc_args_wmi_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
WMI *wmi = new WMI();
|
WMI *wmi = new WMI();
|
||||||
|
|
||||||
if (FAILED(wmi->Open())) {
|
if (FAILED(wmi->Open())) {
|
||||||
return GetLastError();
|
return wmi->GetLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FAILED(wmi->GetProcCommandLine(pid, buf))) {
|
if (FAILED(wmi->GetProcCommandLine(pid, buf))) {
|
||||||
status = GetLastError();
|
status = wmi->GetLastError();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
status = sigar_parse_proc_args(sigar, buf, procargs);
|
status = sigar_parse_proc_args(sigar, buf, procargs);
|
||||||
|
@ -201,13 +221,13 @@ extern "C" int sigar_proc_exe_wmi_get(sigar_t *sigar, sigar_pid_t pid,
|
||||||
WMI *wmi = new WMI();
|
WMI *wmi = new WMI();
|
||||||
|
|
||||||
if (FAILED(wmi->Open())) {
|
if (FAILED(wmi->Open())) {
|
||||||
return GetLastError();
|
return wmi->GetLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
procexe->name[0] = '\0';
|
procexe->name[0] = '\0';
|
||||||
|
|
||||||
if (FAILED(wmi->GetProcExecutablePath(pid, buf))) {
|
if (FAILED(wmi->GetProcExecutablePath(pid, buf))) {
|
||||||
status = GetLastError();
|
status = wmi->GetLastError();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
status = SIGAR_OK;
|
status = SIGAR_OK;
|
||||||
|
|
Loading…
Reference in New Issue