Andrew Nguyen : dxdiagn: Add a NetMeeting detection property to the DxDiag_SystemInfo container.

Alexandre Julliard julliard at winehq.org
Mon Apr 4 10:10:54 CDT 2011


Module: wine
Branch: master
Commit: 9e3fd163068ec43638fc2f82aa8cae1db98c03da
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9e3fd163068ec43638fc2f82aa8cae1db98c03da

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Sun Apr  3 20:55:39 2011 -0500

dxdiagn: Add a NetMeeting detection property to the DxDiag_SystemInfo container.

---

 dlls/dxdiagn/Makefile.in |    2 +-
 dlls/dxdiagn/provider.c  |   99 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 100 insertions(+), 1 deletions(-)

diff --git a/dlls/dxdiagn/Makefile.in b/dlls/dxdiagn/Makefile.in
index 12dd8be..b522547 100644
--- a/dlls/dxdiagn/Makefile.in
+++ b/dlls/dxdiagn/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = dxdiagn.dll
-IMPORTS   = strmiids dxguid uuid ddraw version ole32 oleaut32 user32 advapi32
+IMPORTS   = strmiids dxguid uuid ddraw version ole32 oleaut32 psapi user32 advapi32
 
 C_SRCS = \
 	container.c \
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index 5281981..058f5a6 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -2,6 +2,7 @@
  * IDxDiagProvider Implementation
  * 
  * Copyright 2004-2005 Raphael Junqueira
+ * Copyright 2010 Andrew Nguyen
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -36,6 +37,7 @@
 #include "strmif.h"
 #include "initguid.h"
 #include "fil_data.h"
+#include "psapi.h"
 
 #include "wine/debug.h"
 
@@ -346,6 +348,98 @@ static inline HRESULT add_ull_as_bstr_property(IDxDiagContainerImpl_Container *n
     return S_OK;
 }
 
+/* Copied from programs/taskkill/taskkill.c. */
+static DWORD *enumerate_processes(DWORD *list_count)
+{
+    DWORD *pid_list, alloc_bytes = 1024 * sizeof(*pid_list), needed_bytes;
+
+    pid_list = HeapAlloc(GetProcessHeap(), 0, alloc_bytes);
+    if (!pid_list)
+        return NULL;
+
+    for (;;)
+    {
+        DWORD *realloc_list;
+
+        if (!EnumProcesses(pid_list, alloc_bytes, &needed_bytes))
+        {
+            HeapFree(GetProcessHeap(), 0, pid_list);
+            return NULL;
+        }
+
+        /* EnumProcesses can't signal an insufficient buffer condition, so the
+         * only way to possibly determine whether a larger buffer is required
+         * is to see whether the written number of bytes is the same as the
+         * buffer size. If so, the buffer will be reallocated to twice the
+         * size. */
+        if (alloc_bytes != needed_bytes)
+            break;
+
+        alloc_bytes *= 2;
+        realloc_list = HeapReAlloc(GetProcessHeap(), 0, pid_list, alloc_bytes);
+        if (!realloc_list)
+        {
+            HeapFree(GetProcessHeap(), 0, pid_list);
+            return NULL;
+        }
+        pid_list = realloc_list;
+    }
+
+    *list_count = needed_bytes / sizeof(*pid_list);
+    return pid_list;
+}
+
+/* Copied from programs/taskkill/taskkill.c. */
+static BOOL get_process_name_from_pid(DWORD pid, WCHAR *buf, DWORD chars)
+{
+    HANDLE process;
+    HMODULE module;
+    DWORD required_size;
+
+    process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
+    if (!process)
+        return FALSE;
+
+    if (!EnumProcessModules(process, &module, sizeof(module), &required_size))
+    {
+        CloseHandle(process);
+        return FALSE;
+    }
+
+    if (!GetModuleBaseNameW(process, module, buf, chars))
+    {
+        CloseHandle(process);
+        return FALSE;
+    }
+
+    CloseHandle(process);
+    return TRUE;
+}
+
+/* dxdiagn's detection scheme is simply to look for a process called conf.exe. */
+static BOOL is_netmeeting_running(void)
+{
+    static const WCHAR conf_exe[] = {'c','o','n','f','.','e','x','e',0};
+
+    DWORD list_count;
+    DWORD *pid_list = enumerate_processes(&list_count);
+
+    if (pid_list)
+    {
+        DWORD i;
+        WCHAR process_name[MAX_PATH];
+
+        for (i = 0; i < list_count; i++)
+        {
+            if (get_process_name_from_pid(pid_list[i], process_name, sizeof(process_name)/sizeof(WCHAR)) &&
+                !lstrcmpW(conf_exe, process_name))
+                return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
 static HRESULT fill_language_information(IDxDiagContainerImpl_Container *node)
 {
     static const WCHAR regional_setting_engW[] = {'R','e','g','i','o','n','a','l',' ','S','e','t','t','i','n','g',0};
@@ -394,6 +488,7 @@ static HRESULT build_systeminfo_tree(IDxDiagContainerImpl_Container *node)
     static const WCHAR ullPhysicalMemory[] = {'u','l','l','P','h','y','s','i','c','a','l','M','e','m','o','r','y',0};
     static const WCHAR ullUsedPageFile[]   = {'u','l','l','U','s','e','d','P','a','g','e','F','i','l','e',0};
     static const WCHAR ullAvailPageFile[]  = {'u','l','l','A','v','a','i','l','P','a','g','e','F','i','l','e',0};
+    static const WCHAR bNetMeetingRunning[] = {'b','N','e','t','M','e','e','t','i','n','g','R','u','n','n','i','n','g',0};
     static const WCHAR szWindowsDir[] = {'s','z','W','i','n','d','o','w','s','D','i','r',0};
     static const WCHAR dwOSMajorVersion[] = {'d','w','O','S','M','a','j','o','r','V','e','r','s','i','o','n',0};
     static const WCHAR dwOSMinorVersion[] = {'d','w','O','S','M','i','n','o','r','V','e','r','s','i','o','n',0};
@@ -448,6 +543,10 @@ static HRESULT build_systeminfo_tree(IDxDiagContainerImpl_Container *node)
     if (FAILED(hr))
         return hr;
 
+    hr = add_bool_property(node, bNetMeetingRunning, is_netmeeting_running());
+    if (FAILED(hr))
+        return hr;
+
     info.dwOSVersionInfoSize = sizeof(info);
     GetVersionExW(&info);
 




More information about the wine-cvs mailing list