static HRESULT DXDiag_InitDXDiagDirectSoundContainer(IDxDiagContainer* pSubCont) { HRESULT hr = S_OK; static const WCHAR DxDiag_SoundDevices[] = {'D','x','D','i','a','g','_','S','o','u','n','d','D','e','v','i','c','e','s',0}; static const WCHAR DxDiag_SoundCaptureDevices[] = {'D','x','D','i','a','g','_','S','o','u','n','d','C','a','p','t','u','r','e','D','e','v','i','c','e','s',0}; IDxDiagContainer* pSubSubCont = NULL; hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubSubCont); if (FAILED(hr)) { return hr; } hr = IDxDiagContainerImpl_AddChildContainer(pSubCont, DxDiag_SoundDevices, pSubSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubSubCont); if (FAILED(hr)) { return hr; } hr = IDxDiagContainerImpl_AddChildContainer(pSubCont, DxDiag_SoundCaptureDevices, pSubSubCont); return hr; }
static HRESULT DXDiag_InitDXDiagDirectXFilesContainer(IDxDiagContainer* pSubCont) { HRESULT hr = S_OK; 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} }; 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]; IDxDiagContainer *pDXFileSubCont; snprintfW(szFileID, sizeof(szFileID)/sizeof(szFileID[0]), szFormat, i); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pDXFileSubCont); if (FAILED(hr)) continue; if (FAILED(DXDiag_AddFileDescContainer(pDXFileSubCont, szFilePath, dlls[i])) || FAILED(IDxDiagContainerImpl_AddChildContainer(pSubCont, szFileID, pDXFileSubCont))) { IUnknown_Release(pDXFileSubCont); continue; } } return hr; }
HRESULT DXDiag_InitRootDXDiagContainer(IDxDiagContainer* pRootCont) { HRESULT hr = S_OK; static const WCHAR DxDiag_SystemInfo[] = {'D','x','D','i','a','g','_','S','y','s','t','e','m','I','n','f','o',0}; static const WCHAR DxDiag_SystemDevices[] = {'D','x','D','i','a','g','_','S','y','s','t','e','m','D','e','v','i','c','e','s',0}; static const WCHAR DxDiag_LogicalDisks[] = {'D','x','D','i','a','g','_','L','o','g','i','c','a','l','D','i','s','k','s',0}; static const WCHAR DxDiag_DirectXFiles[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','X','F','i','l','e','s',0}; static const WCHAR DxDiag_DisplayDevices[] = {'D','x','D','i','a','g','_','D','i','s','p','l','a','y','D','e','v','i','c','e','s',0}; static const WCHAR DxDiag_DirectSound[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','S','o','u','n','d',0}; static const WCHAR DxDiag_DirectMusic[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','M','u','s','i','c',0}; static const WCHAR DxDiag_DirectInput[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','I','n','p','u','t',0}; static const WCHAR DxDiag_DirectPlay[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','P','l','a','y',0}; static const WCHAR DxDiag_DirectShowFilters[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','S','h','o','w','F','i','l','t','e','r','s',0}; IDxDiagContainer* pSubCont = NULL; TRACE("(%p)\n", pRootCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagSystemInfoContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_SystemInfo, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagSystemDevicesContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_SystemDevices, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagLogicalDisksContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_LogicalDisks, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagDirectXFilesContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_DirectXFiles, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagDisplayContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_DisplayDevices, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagDirectSoundContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_DirectSound, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagDirectMusicContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_DirectMusic, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagDirectInputContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_DirectInput, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagDirectPlayContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_DirectPlay, pSubCont); hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pSubCont); if (FAILED(hr)) { return hr; } hr = DXDiag_InitDXDiagDirectShowFiltersContainer(pSubCont); hr = IDxDiagContainerImpl_AddChildContainer(pRootCont, DxDiag_DirectShowFilters, pSubCont); return hr; }
static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont) { static const WCHAR szDescription[] = {'s','z','D','e','s','c','r','i','p','t','i','o','n',0}; static const WCHAR szDeviceName[] = {'s','z','D','e','v','i','c','e','N','a','m','e',0}; static const WCHAR szKeyDeviceID[] = {'s','z','K','e','y','D','e','v','i','c','e','I','D',0}; static const WCHAR szKeyDeviceKey[] = {'s','z','K','e','y','D','e','v','i','c','e','K','e','y',0}; static const WCHAR szVendorId[] = {'s','z','V','e','n','d','o','r','I','d',0}; static const WCHAR szDeviceId[] = {'s','z','D','e','v','i','c','e','I','d',0}; static const WCHAR szDeviceIdentifier[] = {'s','z','D','e','v','i','c','e','I','d','e','n','t','i','f','i','e','r',0}; static const WCHAR dwWidth[] = {'d','w','W','i','d','t','h',0}; static const WCHAR dwHeight[] = {'d','w','H','e','i','g','h','t',0}; static const WCHAR dwBpp[] = {'d','w','B','p','p',0}; static const WCHAR szDisplayMemoryLocalized[] = {'s','z','D','i','s','p','l','a','y','M','e','m','o','r','y','L','o','c','a','l','i','z','e','d',0}; static const WCHAR szDisplayMemoryEnglish[] = {'s','z','D','i','s','p','l','a','y','M','e','m','o','r','y','E','n','g','l','i','s','h',0}; static const WCHAR szAdapterID[] = {'0',0}; static const WCHAR szEmpty[] = {0}; HRESULT hr; IDxDiagContainer *pDisplayAdapterSubCont = NULL; IDirectDraw7 *pDirectDraw; DDSCAPS2 dd_caps; DISPLAY_DEVICEW disp_dev; DDSURFACEDESC2 surface_descr; DWORD tmp; WCHAR buffer[256]; hr = DXDiag_CreateDXDiagContainer( &IID_IDxDiagContainer, (void**) &pDisplayAdapterSubCont ); if (FAILED( hr )) return hr; hr = IDxDiagContainerImpl_AddChildContainer( pSubCont, szAdapterID, pDisplayAdapterSubCont ); if (FAILED( hr )) return hr; if (EnumDisplayDevicesW( NULL, 0, &disp_dev, 0 )) { add_prop_str( pDisplayAdapterSubCont, szDeviceName, disp_dev.DeviceName ); add_prop_str( pDisplayAdapterSubCont, szDescription, disp_dev.DeviceString ); } hr = DirectDrawCreateEx( NULL, (LPVOID *)&pDirectDraw, &IID_IDirectDraw7, NULL); if (FAILED( hr )) return hr; dd_caps.dwCaps = DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY; dd_caps.dwCaps2 = dd_caps.dwCaps3 = dd_caps.dwCaps4 = 0; hr = IDirectDraw7_GetAvailableVidMem( pDirectDraw, &dd_caps, &tmp, NULL ); if (SUCCEEDED(hr)) { static const WCHAR mem_fmt[] = {'%','.','1','f',' ','M','B',0}; snprintfW( buffer, sizeof(buffer)/sizeof(buffer[0]), mem_fmt, ((float)tmp) / 1000000.0 ); add_prop_str( pDisplayAdapterSubCont, szDisplayMemoryLocalized, buffer ); add_prop_str( pDisplayAdapterSubCont, szDisplayMemoryEnglish, buffer ); } surface_descr.dwSize = sizeof(surface_descr); hr = IDirectDraw7_GetDisplayMode( pDirectDraw, &surface_descr ); if (SUCCEEDED(hr)) { if (surface_descr.dwFlags & DDSD_WIDTH) add_prop_ui4( pDisplayAdapterSubCont, dwWidth, surface_descr.dwWidth ); if (surface_descr.dwFlags & DDSD_HEIGHT) add_prop_ui4( pDisplayAdapterSubCont, dwHeight, surface_descr.dwHeight ); if (surface_descr.dwFlags & DDSD_PIXELFORMAT) add_prop_ui4( pDisplayAdapterSubCont, dwBpp, surface_descr.u4.ddpfPixelFormat.u1.dwRGBBitCount ); } get_display_device_id( buffer ); add_prop_str( pDisplayAdapterSubCont, szDeviceIdentifier, buffer ); add_prop_str( pDisplayAdapterSubCont, szVendorId, szEmpty ); add_prop_str( pDisplayAdapterSubCont, szDeviceId, szEmpty ); add_prop_str( pDisplayAdapterSubCont, szKeyDeviceKey, szEmpty ); add_prop_str( pDisplayAdapterSubCont, szKeyDeviceID, szEmpty ); IUnknown_Release( pDirectDraw ); return hr; }