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