Andrew Nguyen : dxdiagn: Add code that populates the DxDiag_DirectXFiles container.

Alexandre Julliard julliard at winehq.org
Tue Feb 15 11:29:26 CST 2011


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

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Tue Feb 15 01:14:45 2011 -0600

dxdiagn: Add code that populates the DxDiag_DirectXFiles container.

---

 dlls/dxdiagn/provider.c |  162 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 162 insertions(+), 0 deletions(-)

diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index dfb892a..c61555e 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -1250,8 +1250,170 @@ static HRESULT build_systemdevices_tree(IDxDiagContainerImpl_Container *node)
     return S_OK;
 }
 
+static HRESULT fill_file_description(IDxDiagContainerImpl_Container *node, const WCHAR *szFilePath, const WCHAR *szFileName)
+{
+    static const WCHAR szSlashSep[] = {'\\',0};
+    static const WCHAR szPath[] = {'s','z','P','a','t','h',0};
+    static const WCHAR szName[] = {'s','z','N','a','m','e',0};
+    static const WCHAR szVersion[] = {'s','z','V','e','r','s','i','o','n',0};
+    static const WCHAR szAttributes[] = {'s','z','A','t','t','r','i','b','u','t','e','s',0};
+    static const WCHAR szLanguageEnglish[] = {'s','z','L','a','n','g','u','a','g','e','E','n','g','l','i','s','h',0};
+    static const WCHAR dwFileTimeHigh[] = {'d','w','F','i','l','e','T','i','m','e','H','i','g','h',0};
+    static const WCHAR dwFileTimeLow[] = {'d','w','F','i','l','e','T','i','m','e','L','o','w',0};
+    static const WCHAR bBeta[] = {'b','B','e','t','a',0};
+    static const WCHAR bDebug[] = {'b','D','e','b','u','g',0};
+    static const WCHAR bExists[] = {'b','E','x','i','s','t','s',0};
+
+    /* Values */
+    static const WCHAR szFinal_Retail_v[] = {'F','i','n','a','l',' ','R','e','t','a','i','l',0};
+    static const WCHAR szEnglish_v[] = {'E','n','g','l','i','s','h',0};
+    static const WCHAR szVersionFormat[] = {'%','u','.','%','0','2','u','.','%','0','4','u','.','%','0','4','u',0};
+
+    HRESULT hr;
+    WCHAR *szFile;
+    WCHAR szVersion_v[1024];
+    DWORD retval, hdl;
+    void *pVersionInfo = NULL;
+    BOOL boolret = FALSE;
+    UINT uiLength;
+    VS_FIXEDFILEINFO *pFileInfo;
+
+    szFile = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * (lstrlenW(szFilePath) +
+                                            lstrlenW(szFileName) + 2 /* slash + terminator */));
+    if (!szFile)
+        return E_OUTOFMEMORY;
+
+    lstrcpyW(szFile, szFilePath);
+    lstrcatW(szFile, szSlashSep);
+    lstrcatW(szFile, szFileName);
+
+    retval = GetFileVersionInfoSizeW(szFile, &hdl);
+    if (retval)
+    {
+        pVersionInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, retval);
+        if (!pVersionInfo)
+        {
+            hr = E_OUTOFMEMORY;
+            goto cleanup;
+        }
+
+        if (GetFileVersionInfoW(szFile, 0, retval, pVersionInfo) &&
+            VerQueryValueW(pVersionInfo, szSlashSep, (void **)&pFileInfo, &uiLength))
+            boolret = TRUE;
+    }
+
+    hr = add_bstr_property(node, szPath, szFile);
+    if (FAILED(hr))
+        goto cleanup;
+
+    hr = add_bstr_property(node, szName, szFileName);
+    if (FAILED(hr))
+        goto cleanup;
+
+    hr = add_bool_property(node, bExists, boolret);
+    if (FAILED(hr))
+        goto cleanup;
+
+    if (boolret)
+    {
+        snprintfW(szVersion_v, sizeof(szVersion_v)/sizeof(szVersion_v[0]),
+                  szVersionFormat,
+                  HIWORD(pFileInfo->dwFileVersionMS),
+                  LOWORD(pFileInfo->dwFileVersionMS),
+                  HIWORD(pFileInfo->dwFileVersionLS),
+                  LOWORD(pFileInfo->dwFileVersionLS));
+
+        hr = add_bstr_property(node, szVersion, szVersion_v);
+        if (FAILED(hr))
+            goto cleanup;
+
+        hr = add_bstr_property(node, szAttributes, szFinal_Retail_v);
+        if (FAILED(hr))
+            goto cleanup;
+
+        hr = add_bstr_property(node, szLanguageEnglish, szEnglish_v);
+        if (FAILED(hr))
+            goto cleanup;
+
+        hr = add_ui4_property(node, dwFileTimeHigh, pFileInfo->dwFileDateMS);
+        if (FAILED(hr))
+            goto cleanup;
+
+        hr = add_ui4_property(node, dwFileTimeLow, pFileInfo->dwFileDateLS);
+        if (FAILED(hr))
+            goto cleanup;
+
+        hr = add_bool_property(node, bBeta, ((pFileInfo->dwFileFlags & pFileInfo->dwFileFlagsMask) & VS_FF_PRERELEASE) != 0);
+        if (FAILED(hr))
+            goto cleanup;
+
+        hr = add_bool_property(node, bDebug, ((pFileInfo->dwFileFlags & pFileInfo->dwFileFlagsMask) & VS_FF_DEBUG) != 0);
+        if (FAILED(hr))
+            goto cleanup;
+    }
+
+    hr = S_OK;
+cleanup:
+    HeapFree(GetProcessHeap(), 0, pVersionInfo);
+    HeapFree(GetProcessHeap(), 0, szFile);
+
+    return hr;
+}
 static HRESULT build_directxfiles_tree(IDxDiagContainerImpl_Container *node)
 {
+    static const WCHAR dlls[][15] =
+    {
+        {'d','3','d','8','.','d','l','l',0},
+        {'d','3','d','9','.','d','l','l',0},
+        {'d','d','r','a','w','.','d','l','l',0},
+        {'d','e','v','e','n','u','m','.','d','l','l',0},
+        {'d','i','n','p','u','t','8','.','d','l','l',0},
+        {'d','i','n','p','u','t','.','d','l','l',0},
+        {'d','m','b','a','n','d','.','d','l','l',0},
+        {'d','m','c','o','m','p','o','s','.','d','l','l',0},
+        {'d','m','i','m','e','.','d','l','l',0},
+        {'d','m','l','o','a','d','e','r','.','d','l','l',0},
+        {'d','m','s','c','r','i','p','t','.','d','l','l',0},
+        {'d','m','s','t','y','l','e','.','d','l','l',0},
+        {'d','m','s','y','n','t','h','.','d','l','l',0},
+        {'d','m','u','s','i','c','.','d','l','l',0},
+        {'d','p','l','a','y','x','.','d','l','l',0},
+        {'d','p','n','e','t','.','d','l','l',0},
+        {'d','s','o','u','n','d','.','d','l','l',0},
+        {'d','s','w','a','v','e','.','d','l','l',0},
+        {'d','x','d','i','a','g','n','.','d','l','l',0},
+        {'q','u','a','r','t','z','.','d','l','l',0}
+    };
+
+    HRESULT hr;
+    WCHAR szFilePath[MAX_PATH];
+    INT i;
+
+    GetSystemDirectoryW(szFilePath, MAX_PATH);
+
+    for (i = 0; i < sizeof(dlls) / sizeof(dlls[0]); i++)
+    {
+        static const WCHAR szFormat[] = {'%','d',0};
+
+        WCHAR szFileID[5];
+        IDxDiagContainerImpl_Container *file_container;
+
+        snprintfW(szFileID, sizeof(szFileID)/sizeof(szFileID[0]), szFormat, i);
+
+        file_container = allocate_information_node(szFileID);
+        if (!file_container)
+            return E_OUTOFMEMORY;
+
+        hr = fill_file_description(file_container, szFilePath, dlls[i]);
+        if (FAILED(hr))
+        {
+            free_information_tree(file_container);
+            continue;
+        }
+
+        add_subcontainer(node, file_container);
+    }
+
     return S_OK;
 }
 




More information about the wine-cvs mailing list