1210 lines
46 KiB
C++
1210 lines
46 KiB
C++
|
/****************************************************************************
|
||
|
*
|
||
|
* File: save.cpp
|
||
|
* Project: DxDiag (DirectX Diagnostic Tool)
|
||
|
* Author: Mike Anderson (manders@microsoft.com)
|
||
|
* Purpose: Save gathered information to a file in text or CSV format
|
||
|
*
|
||
|
* Note that the text file is always ANSI, even on Unicode builds, to make
|
||
|
* the resulting file easier to use (e.g., Win9x Notepad doesn't understand
|
||
|
* Unicode).
|
||
|
*
|
||
|
* (C) Copyright 1998 Microsoft Corp. All rights reserved.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
#include <tchar.h>
|
||
|
#include <Windows.h>
|
||
|
#include <multimon.h>
|
||
|
#include <stdio.h>
|
||
|
#include "reginfo.h"
|
||
|
#include "sysinfo.h"
|
||
|
#include "fileinfo.h"
|
||
|
#include "dispinfo.h"
|
||
|
#include "sndinfo.h"
|
||
|
#include "musinfo.h"
|
||
|
#include "showinfo.h"
|
||
|
#include "inptinfo.h"
|
||
|
#include "netinfo.h"
|
||
|
#include "save.h"
|
||
|
|
||
|
|
||
|
static HRESULT SaveBugInfo(FILE* pFile, BugInfo* pBugInfo);
|
||
|
static HRESULT SaveSysInfo(FILE* pFile, SysInfo* pSysInfo);
|
||
|
static HRESULT SaveNotesInfo(FILE* pFile, SysInfo* pSysInfo, DisplayInfo* pDisplayInfoFirst, SoundInfo* pSoundInfoFirst);
|
||
|
static HRESULT SaveNote(FILE* pFile, TCHAR* strNote );
|
||
|
static HRESULT SaveDxComponentFileInfo(FILE* pFile, FileInfo* pFileInfoFirst);
|
||
|
static HRESULT SaveDxWinComponentFileInfo(FILE* pFile, FileInfo* pFileInfoFirst);
|
||
|
static HRESULT SaveBackedUpFileInfo(FILE* pFile);
|
||
|
static HRESULT SaveDisplayInfo(FILE* pFile, DisplayInfo* pDisplayInfoFirst);
|
||
|
static HRESULT SaveSoundInfo(FILE* pFile, SoundInfo* pSoundInfoFirst);
|
||
|
static HRESULT SaveMusicInfo(FILE* pFile, MusicInfo* pMusicInfo);
|
||
|
static HRESULT SaveShowInfo(FILE* pFile, ShowInfo* pShowInfo);
|
||
|
static HRESULT SaveInputInfo(FILE* pFile, InputInfo* pInputInfo);
|
||
|
static HRESULT SaveNetInfo(FILE* pFile, NetInfo* pNetInfo);
|
||
|
static HRESULT SaveInactiveDriverInfo(FILE* pFile, DisplayInfo* pDisplayInfoFirst);
|
||
|
static HRESULT SaveRegistryErrorInfo(FILE* pFile, RegError* pRegErrorFirst);
|
||
|
static HRESULT SaveDebugLevels(FILE* pFile, SysInfo* pSysInfo);
|
||
|
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveAllInfo - Save all gathered information in text format.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveAllInfo(TCHAR* pszFile, SysInfo* pSysInfo,
|
||
|
FileInfo* pFileInfoWinComponentsFirst, FileInfo* pFileInfoComponentsFirst,
|
||
|
DisplayInfo* pDisplayInfoFirst, SoundInfo* pSoundInfoFirst,
|
||
|
MusicInfo* pMusicInfo, InputInfo* pInputInfo,
|
||
|
NetInfo* pNetInfo, ShowInfo* pShowInfo, BugInfo* pBugInfo)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
FILE* pFile;
|
||
|
|
||
|
pFile = _tfopen(pszFile, TEXT("wt"));
|
||
|
if (pFile == NULL)
|
||
|
goto LEnd;
|
||
|
|
||
|
if (pBugInfo != NULL)
|
||
|
{
|
||
|
if (FAILED(hr = SaveBugInfo(pFile, pBugInfo)))
|
||
|
goto LEnd;
|
||
|
}
|
||
|
|
||
|
if (FAILED(hr = SaveSysInfo(pFile, pSysInfo)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveNotesInfo(pFile, pSysInfo, pDisplayInfoFirst, pSoundInfoFirst)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveDxComponentFileInfo(pFile, pFileInfoComponentsFirst)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveDxWinComponentFileInfo(pFile, pFileInfoWinComponentsFirst)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveBackedUpFileInfo(pFile)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveDisplayInfo(pFile, pDisplayInfoFirst)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveSoundInfo(pFile, pSoundInfoFirst)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveMusicInfo(pFile, pMusicInfo)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveShowInfo(pFile, pShowInfo)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveInputInfo(pFile, pInputInfo)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveNetInfo(pFile, pNetInfo)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveInactiveDriverInfo(pFile, pDisplayInfoFirst)))
|
||
|
goto LEnd;
|
||
|
|
||
|
if (FAILED(hr = SaveDebugLevels(pFile, pSysInfo)))
|
||
|
goto LEnd;
|
||
|
|
||
|
LEnd:
|
||
|
if (pFile != NULL)
|
||
|
fclose(pFile);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveAllInfoCsv - Save all gathered information in CSV format.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveAllInfoCsv(TCHAR* pszFile, SysInfo* pSysInfo,
|
||
|
FileInfo* pFileInfoComponentsFirst, DisplayInfo* pDisplayInfoFirst,
|
||
|
SoundInfo* pSoundInfoFirst, InputInfo* pInputInfo)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
FILE* pFile;
|
||
|
|
||
|
pFile = _tfopen(pszFile, TEXT("wt"));
|
||
|
if (pFile == NULL)
|
||
|
goto LEnd;
|
||
|
|
||
|
// Date
|
||
|
_ftprintf(pFile, TEXT("%02d%02d%d,%02d%02d"),
|
||
|
pSysInfo->m_time.wMonth, pSysInfo->m_time.wDay, pSysInfo->m_time.wYear,
|
||
|
pSysInfo->m_time.wHour, pSysInfo->m_time.wMinute);
|
||
|
|
||
|
// Machine name
|
||
|
_ftprintf(pFile, TEXT(",%s"), pSysInfo->m_szMachine);
|
||
|
|
||
|
// DX Version
|
||
|
_ftprintf(pFile, TEXT(",%s"), pSysInfo->m_szDirectXVersion);
|
||
|
|
||
|
// OS
|
||
|
_ftprintf(pFile, TEXT(",%s,%d.%d,%d,"),
|
||
|
pSysInfo->m_szOS, pSysInfo->m_dwMajorVersion, pSysInfo->m_dwMinorVersion,
|
||
|
LOWORD(pSysInfo->m_dwBuildNumber));
|
||
|
_ftprintf(pFile, TEXT("%s"), pSysInfo->m_szCSDVersion);
|
||
|
|
||
|
// Processor - string may have commas, so change them to semicolons
|
||
|
TCHAR szProcessor[1024];
|
||
|
TCHAR* psz;
|
||
|
lstrcpy(szProcessor, pSysInfo->m_szProcessor);
|
||
|
for (psz = szProcessor; *psz != TEXT('\0'); psz++)
|
||
|
{
|
||
|
if (*psz == TEXT(','))
|
||
|
*psz = TEXT(';');
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT(",%s"), szProcessor);
|
||
|
|
||
|
// Display devices
|
||
|
// (chip type, matching ID, DAC type, disp memory, driver name, driver version)
|
||
|
DisplayInfo* pDisplayInfo;
|
||
|
pDisplayInfo = pDisplayInfoFirst;
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(",%s"), pDisplayInfo->m_szChipType);
|
||
|
_ftprintf(pFile, TEXT(",%s"), pDisplayInfo->m_szKeyDeviceID);
|
||
|
_ftprintf(pFile, TEXT(",%s"), pDisplayInfo->m_szDACType);
|
||
|
_ftprintf(pFile, TEXT(",%s"), pDisplayInfo->m_szDisplayMemoryEnglish);
|
||
|
_ftprintf(pFile, TEXT(",%s"), pDisplayInfo->m_szDriverName);
|
||
|
_ftprintf(pFile, TEXT(",%s"), pDisplayInfo->m_szDriverVersion);
|
||
|
}
|
||
|
|
||
|
// Sound devices
|
||
|
SoundInfo* pSoundInfo;
|
||
|
for (pSoundInfo = pSoundInfoFirst; pSoundInfo != NULL;
|
||
|
pSoundInfo = pSoundInfo->m_pSoundInfoNext)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(",%s"), pSoundInfo->m_szDescription);
|
||
|
_ftprintf(pFile, TEXT(",%s"), pSoundInfo->m_szDeviceID);
|
||
|
_ftprintf(pFile, TEXT(",%s"), pSoundInfo->m_szDriverName);
|
||
|
_ftprintf(pFile, TEXT(",%s"), pSoundInfo->m_szDriverVersion);
|
||
|
}
|
||
|
|
||
|
LEnd:
|
||
|
if (pFile != NULL)
|
||
|
fclose(pFile);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveBugInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveBugInfo(FILE* pFile, BugInfo* pBugInfo)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("---------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Bug Information\n"));
|
||
|
_ftprintf(pFile, TEXT("---------------\n"));
|
||
|
_ftprintf(pFile, TEXT(" User name: %s\n"), pBugInfo->m_szName);
|
||
|
_ftprintf(pFile, TEXT(" Email: %s\n"), pBugInfo->m_szEmail);
|
||
|
_ftprintf(pFile, TEXT(" Company: %s\n"), pBugInfo->m_szCompany);
|
||
|
_ftprintf(pFile, TEXT(" Phone: %s\n"), pBugInfo->m_szPhone);
|
||
|
_ftprintf(pFile, TEXT(" City, State: %s\n"), pBugInfo->m_szCityState);
|
||
|
_ftprintf(pFile, TEXT(" Country: %s\n"), pBugInfo->m_szCountry);
|
||
|
_ftprintf(pFile, TEXT("Bug Description: %s\n"), pBugInfo->m_szBugDescription);
|
||
|
_ftprintf(pFile, TEXT(" Repro Steps: %s\n"), pBugInfo->m_szReproSteps);
|
||
|
_ftprintf(pFile, TEXT(" SW/HW Config: %s\n"), pBugInfo->m_szSwHw);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveSysInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveSysInfo(FILE* pFile, SysInfo* pSysInfo)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("System Information\n"));
|
||
|
_ftprintf(pFile, TEXT("------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Time of this report: %s\n"), pSysInfo->m_szTime);
|
||
|
_ftprintf(pFile, TEXT(" Machine name: %s\n"), pSysInfo->m_szMachine);
|
||
|
_ftprintf(pFile, TEXT(" Operating System: %s\n"), pSysInfo->m_szOSExLong);
|
||
|
_ftprintf(pFile, TEXT(" Language: %s\n"), pSysInfo->m_szLanguages);
|
||
|
_ftprintf(pFile, TEXT("System Manufacturer: %s\n"), pSysInfo->m_szSystemManufacturerEnglish);
|
||
|
_ftprintf(pFile, TEXT(" System Model: %s\n"), pSysInfo->m_szSystemModelEnglish);
|
||
|
_ftprintf(pFile, TEXT(" BIOS: %s\n"), pSysInfo->m_szBIOSEnglish);
|
||
|
_ftprintf(pFile, TEXT(" Processor: %s\n"), pSysInfo->m_szProcessor);
|
||
|
_ftprintf(pFile, TEXT(" Memory: %s\n"), pSysInfo->m_szPhysicalMemory);
|
||
|
_ftprintf(pFile, TEXT(" Page File: %s\n"), pSysInfo->m_szPageFileEnglish);
|
||
|
_ftprintf(pFile, TEXT("Primary File System: %s\n"), pSysInfo->m_szD3D8CacheFileSystem );
|
||
|
_ftprintf(pFile, TEXT(" DirectX Version: %s\n"), pSysInfo->m_szDirectXVersionLong);
|
||
|
_ftprintf(pFile, TEXT("DX Setup Parameters: %s\n"), pSysInfo->m_szSetupParam);
|
||
|
|
||
|
TCHAR szUnicode[1024];
|
||
|
TCHAR szBit[1024];
|
||
|
|
||
|
#ifdef _WIN64
|
||
|
_tcscpy(szBit, TEXT(" 64bit"));
|
||
|
#else
|
||
|
_tcscpy(szBit, TEXT(" 32bit"));
|
||
|
#endif
|
||
|
|
||
|
#ifdef UNICODE
|
||
|
_tcscpy(szUnicode, TEXT(" Unicode"));
|
||
|
#else
|
||
|
_tcscpy(szUnicode, TEXT(""));
|
||
|
#endif
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" DxDiag Version: %s%s%s\n"), pSysInfo->m_szDxDiagVersion, szBit, szUnicode );
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveNote
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveNote(FILE* pFile, TCHAR* strNote )
|
||
|
{
|
||
|
TCHAR strBuffer[1024*8];
|
||
|
_tcscpy( strBuffer, strNote );
|
||
|
|
||
|
TCHAR* pEndOfLine;
|
||
|
TCHAR* pCurrent = strBuffer;
|
||
|
TCHAR* pStartOfNext;
|
||
|
BOOL bFirstTime = TRUE;
|
||
|
|
||
|
pEndOfLine = _tcschr( pCurrent, TEXT('\r') );
|
||
|
if( pEndOfLine == NULL )
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("%s\n"), pCurrent );
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
while(TRUE)
|
||
|
{
|
||
|
*pEndOfLine = 0;
|
||
|
pStartOfNext = pEndOfLine + 2;
|
||
|
|
||
|
// Output the current line, iff its not a "To test" line
|
||
|
if( _tcsstr( pCurrent, TEXT("To test") ) == NULL )
|
||
|
{
|
||
|
// Ouput trailing spaces everytime except the first time
|
||
|
if( !bFirstTime )
|
||
|
_ftprintf(pFile, TEXT(" ") );
|
||
|
bFirstTime = FALSE;
|
||
|
|
||
|
_ftprintf(pFile, TEXT("%s\n"), pCurrent );
|
||
|
}
|
||
|
|
||
|
// Advance current
|
||
|
pCurrent = pStartOfNext;
|
||
|
|
||
|
// Look for the end of the next, and stop if there's no more
|
||
|
pEndOfLine = _tcschr( pStartOfNext, TEXT('\r') );
|
||
|
if( pEndOfLine == NULL )
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveNotesInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveNotesInfo(FILE* pFile, SysInfo* pSysInfo,
|
||
|
DisplayInfo* pDisplayInfoFirst, SoundInfo* pSoundInfoFirst)
|
||
|
{
|
||
|
DisplayInfo* pDisplayInfo;
|
||
|
SoundInfo* pSoundInfo;
|
||
|
DWORD dwIndex;
|
||
|
|
||
|
_ftprintf(pFile, TEXT("------------\n"));
|
||
|
_ftprintf(pFile, TEXT("DxDiag Notes\n"));
|
||
|
_ftprintf(pFile, TEXT("------------\n"));
|
||
|
_ftprintf(pFile, TEXT(" DirectX Files Tab: ") );
|
||
|
SaveNote(pFile, pSysInfo->m_szDXFileNotesEnglish);
|
||
|
|
||
|
dwIndex = 1;
|
||
|
for (pDisplayInfo = pDisplayInfoFirst; pDisplayInfo != NULL;
|
||
|
pDisplayInfo = pDisplayInfo->m_pDisplayInfoNext)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Display Tab %d: "), dwIndex);
|
||
|
SaveNote(pFile, pDisplayInfo->m_szNotesEnglish);
|
||
|
dwIndex++;
|
||
|
}
|
||
|
|
||
|
dwIndex = 1;
|
||
|
for (pSoundInfo = pSoundInfoFirst; pSoundInfo != NULL;
|
||
|
pSoundInfo = pSoundInfo->m_pSoundInfoNext)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Sound Tab %d: "), dwIndex);
|
||
|
SaveNote(pFile, pSoundInfo->m_szNotesEnglish);
|
||
|
dwIndex++;
|
||
|
}
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" Music Tab: "));
|
||
|
SaveNote(pFile, pSysInfo->m_szMusicNotesEnglish);
|
||
|
_ftprintf(pFile, TEXT(" Input Tab: "));
|
||
|
SaveNote(pFile, pSysInfo->m_szInputNotesEnglish);
|
||
|
_ftprintf(pFile, TEXT(" Network Tab: "));
|
||
|
SaveNote(pFile, pSysInfo->m_szNetworkNotesEnglish);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveDxComponentFileInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveDxComponentFileInfo(FILE* pFile, FileInfo* pFileInfoFirst)
|
||
|
{
|
||
|
FileInfo* pFileInfo;
|
||
|
TCHAR sz[1024];
|
||
|
|
||
|
_ftprintf(pFile, TEXT("------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("DirectX Components\n"));
|
||
|
_ftprintf(pFile, TEXT("------------------\n"));
|
||
|
for (pFileInfo = pFileInfoFirst; pFileInfo != NULL;
|
||
|
pFileInfo = pFileInfo->m_pFileInfoNext)
|
||
|
{
|
||
|
if (!pFileInfo->m_bExists && !pFileInfo->m_bProblem)
|
||
|
continue;
|
||
|
wsprintf(sz, TEXT("%12s: %s %s %s %s %s %d bytes %s\n"),
|
||
|
pFileInfo->m_szName,
|
||
|
pFileInfo->m_szVersion,
|
||
|
pFileInfo->m_szLanguage,
|
||
|
pFileInfo->m_bBeta ? TEXT("Beta") : TEXT("Final"),
|
||
|
pFileInfo->m_bDebug ? TEXT("Debug") : TEXT("Retail"),
|
||
|
pFileInfo->m_szDatestamp,
|
||
|
pFileInfo->m_numBytes,
|
||
|
pFileInfo->m_bSigned ? TEXT("Digitally Signed") : TEXT(""));
|
||
|
_ftprintf(pFile, sz);
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveDxWinComponentFileInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveDxWinComponentFileInfo(FILE* pFile, FileInfo* pFileInfoFirst)
|
||
|
{
|
||
|
if (pFileInfoFirst == NULL)
|
||
|
return S_OK;
|
||
|
|
||
|
FileInfo* pFileInfo;
|
||
|
TCHAR sz[1024];
|
||
|
|
||
|
_ftprintf(pFile, TEXT("------------------------------------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Components Incorrectly Located in Windows Folder\n"));
|
||
|
_ftprintf(pFile, TEXT("------------------------------------------------\n"));
|
||
|
for (pFileInfo = pFileInfoFirst; pFileInfo != NULL;
|
||
|
pFileInfo = pFileInfo->m_pFileInfoNext)
|
||
|
{
|
||
|
wsprintf(sz, TEXT("%12s: %s %s %s %s %s %d bytes %s\n"),
|
||
|
pFileInfo->m_szName,
|
||
|
pFileInfo->m_szVersion,
|
||
|
pFileInfo->m_szLanguage,
|
||
|
pFileInfo->m_bBeta ? TEXT("Beta") : TEXT("Final"),
|
||
|
pFileInfo->m_bDebug ? TEXT("Debug") : TEXT("Retail"),
|
||
|
pFileInfo->m_szDatestamp,
|
||
|
pFileInfo->m_numBytes,
|
||
|
pFileInfo->m_bSigned ? "Digitally Signed" : "");
|
||
|
_ftprintf(pFile, sz);
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveBackedUpFileInfo - Since this only shows up in the saved report,
|
||
|
* we gather this info on the fly.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveBackedUpFileInfo(FILE* pFile)
|
||
|
{
|
||
|
FileInfo fileInfo;
|
||
|
TCHAR szBackupDir[1024];
|
||
|
TCHAR szCurrentDir[1024];
|
||
|
TCHAR szFileSpec[1024];
|
||
|
HANDLE hFindFile;
|
||
|
WIN32_FIND_DATA findData;
|
||
|
BOOL bFirstFile = TRUE;
|
||
|
BOOL bFirstFileThisDir;
|
||
|
HANDLE hFindFile2;
|
||
|
WIN32_FIND_DATA findData2;
|
||
|
|
||
|
GetSystemDirectory(szBackupDir, MAX_PATH);
|
||
|
lstrcat(szBackupDir, TEXT("\\DXBackup"));
|
||
|
lstrcpy(szFileSpec, szBackupDir);
|
||
|
lstrcat(szFileSpec, TEXT("\\*.*"));
|
||
|
|
||
|
hFindFile = FindFirstFile(szFileSpec, &findData);
|
||
|
if (hFindFile != INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
while (TRUE)
|
||
|
{
|
||
|
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
|
||
|
lstrcmp(findData.cFileName, TEXT(".")) != 0 &&
|
||
|
lstrcmp(findData.cFileName, TEXT("..")) != 0)
|
||
|
{
|
||
|
bFirstFileThisDir = TRUE;
|
||
|
wsprintf(szCurrentDir, TEXT("%s\\%s"), szBackupDir, findData.cFileName);
|
||
|
lstrcpy(szFileSpec, szCurrentDir);
|
||
|
lstrcat(szFileSpec, TEXT("\\*.*"));
|
||
|
hFindFile2 = FindFirstFile(szFileSpec, &findData2);
|
||
|
if (hFindFile2 != INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
while (TRUE)
|
||
|
{
|
||
|
if ((findData2.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
|
||
|
{
|
||
|
if (bFirstFile)
|
||
|
{
|
||
|
bFirstFile = FALSE;
|
||
|
_ftprintf(pFile, TEXT("-----------------------------------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Backed-up drivers in %s\n"), szBackupDir);
|
||
|
_ftprintf(pFile, TEXT("-----------------------------------------------\n"));
|
||
|
}
|
||
|
else if (bFirstFileThisDir)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
}
|
||
|
if (bFirstFileThisDir)
|
||
|
{
|
||
|
bFirstFileThisDir = FALSE;
|
||
|
_ftprintf(pFile, TEXT("%s:\n"), szCurrentDir);
|
||
|
}
|
||
|
|
||
|
wsprintf(szFileSpec, TEXT("%s\\%s"), szCurrentDir, findData2.cFileName);
|
||
|
ZeroMemory(&fileInfo, sizeof(fileInfo));
|
||
|
lstrcpy(fileInfo.m_szName, findData2.cFileName);
|
||
|
GetFileVersion(szFileSpec, fileInfo.m_szVersion, fileInfo.m_szAttributes, fileInfo.m_szLanguageLocal, fileInfo.m_szLanguage, &fileInfo.m_bBeta, &fileInfo.m_bDebug);
|
||
|
GetFileDateAndSize(szFileSpec, fileInfo.m_szDatestampLocal, fileInfo.m_szDatestamp, &fileInfo.m_numBytes);
|
||
|
FileIsSigned(szFileSpec, &fileInfo.m_bSigned, NULL);
|
||
|
|
||
|
_ftprintf(pFile, TEXT("%12s: %s %s %s %s Date: %s Size: %d bytes %s\n"),
|
||
|
fileInfo.m_szName,
|
||
|
fileInfo.m_szVersion,
|
||
|
fileInfo.m_szLanguage,
|
||
|
fileInfo.m_bBeta ? TEXT("Beta") : TEXT("Final"),
|
||
|
fileInfo.m_bDebug ? TEXT("Debug") : TEXT("Retail"),
|
||
|
fileInfo.m_szDatestamp,
|
||
|
fileInfo.m_numBytes,
|
||
|
fileInfo.m_bSigned ? TEXT("Digitally Signed") : TEXT(""));
|
||
|
}
|
||
|
if (!FindNextFile(hFindFile2, &findData2))
|
||
|
break;
|
||
|
}
|
||
|
FindClose(hFindFile2);
|
||
|
}
|
||
|
}
|
||
|
if (!FindNextFile(hFindFile, &findData))
|
||
|
break;
|
||
|
}
|
||
|
FindClose(hFindFile);
|
||
|
};
|
||
|
|
||
|
if (!bFirstFile)
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveDisplayInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveDisplayInfo(FILE* pFile, DisplayInfo* pDisplayInfoFirst)
|
||
|
{
|
||
|
DisplayInfo* pDisplayInfo;
|
||
|
TCHAR szVersion[1024];
|
||
|
|
||
|
_ftprintf(pFile, TEXT("---------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Display Devices\n"));
|
||
|
_ftprintf(pFile, TEXT("---------------\n"));
|
||
|
for (pDisplayInfo = pDisplayInfoFirst; pDisplayInfo != NULL;
|
||
|
pDisplayInfo = pDisplayInfo->m_pDisplayInfoNext)
|
||
|
{
|
||
|
wsprintf(szVersion, TEXT("%s (%s)"), pDisplayInfo->m_szDriverVersion, pDisplayInfo->m_szDriverLanguage);
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" Card name: %s\n"), pDisplayInfo->m_szDescription);
|
||
|
_ftprintf(pFile, TEXT(" Manufacturer: %s\n"), pDisplayInfo->m_szManufacturer);
|
||
|
_ftprintf(pFile, TEXT(" Chip type: %s\n"), pDisplayInfo->m_szChipType);
|
||
|
_ftprintf(pFile, TEXT(" DAC type: %s\n"), pDisplayInfo->m_szDACType);
|
||
|
_ftprintf(pFile, TEXT(" Device ID: %s\n"), pDisplayInfo->m_szKeyDeviceID);
|
||
|
_ftprintf(pFile, TEXT(" Display Memory: %s\n"), pDisplayInfo->m_szDisplayMemoryEnglish);
|
||
|
_ftprintf(pFile, TEXT(" Current Mode: %s\n"), pDisplayInfo->m_szDisplayModeEnglish);
|
||
|
_ftprintf(pFile, TEXT(" Monitor: %s\n"), pDisplayInfo->m_szMonitorName);
|
||
|
_ftprintf(pFile, TEXT(" Monitor Max Res: %s\n"), pDisplayInfo->m_szMonitorMaxRes);
|
||
|
_ftprintf(pFile, TEXT(" Driver Name: %s\n"), pDisplayInfo->m_szDriverName);
|
||
|
_ftprintf(pFile, TEXT(" Driver Version: %s\n"), szVersion);
|
||
|
_ftprintf(pFile, TEXT(" DDI Version: %s\n"), pDisplayInfo->m_szDDIVersion);
|
||
|
_ftprintf(pFile, TEXT("Driver Attributes: %s %s\n"), pDisplayInfo->m_bDriverBeta ? TEXT("Beta") : TEXT("Final"), pDisplayInfo->m_bDriverDebug ? TEXT("Debug") : TEXT("Retail"));
|
||
|
_ftprintf(pFile, TEXT(" Driver Date/Size: %s, %d bytes\n"), pDisplayInfo->m_szDriverDate, pDisplayInfo->m_cbDriver);
|
||
|
_ftprintf(pFile, TEXT(" Driver Signed: %s\n"), pDisplayInfo->m_bDriverSignedValid ? ( pDisplayInfo->m_bDriverSigned ? TEXT("Yes") : TEXT("No") ) : TEXT("n/a") );
|
||
|
_ftprintf(pFile, TEXT(" WHQL Date Stamp: %s\n"), pDisplayInfo->m_bDX8DriverSignedValid ? ( pDisplayInfo->m_bDX8DriverSigned ? pDisplayInfo->m_szDX8DriverSignDate : TEXT("None") ) : TEXT("n/a") );
|
||
|
_ftprintf(pFile, TEXT(" VDD: %s\n"), pDisplayInfo->m_szVdd);
|
||
|
_ftprintf(pFile, TEXT(" Mini VDD: %s\n"), pDisplayInfo->m_szMiniVdd);
|
||
|
_ftprintf(pFile, TEXT(" Mini VDD Date: %s, %d bytes\n"), pDisplayInfo->m_szMiniVddDate, pDisplayInfo->m_cbMiniVdd);
|
||
|
_ftprintf(pFile, TEXT("Device Identifier: %s\n"), pDisplayInfo->m_szDX8DeviceIdentifier );
|
||
|
_ftprintf(pFile, TEXT(" Vendor ID: %s\n"), pDisplayInfo->m_szDX8VendorId );
|
||
|
_ftprintf(pFile, TEXT(" Device ID: %s\n"), pDisplayInfo->m_szDX8DeviceId );
|
||
|
_ftprintf(pFile, TEXT(" SubSys ID: %s\n"), pDisplayInfo->m_szDX8SubSysId );
|
||
|
_ftprintf(pFile, TEXT(" Revision ID: %s\n"), pDisplayInfo->m_szDX8Revision );
|
||
|
|
||
|
if (pDisplayInfo->m_pRegErrorFirst == NULL)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry: OK\n"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry: Errors found:\n"));
|
||
|
SaveRegistryErrorInfo(pFile, pDisplayInfo->m_pRegErrorFirst);
|
||
|
}
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" DDraw Status: %s\n"), pDisplayInfo->m_szDDStatusEnglish);
|
||
|
_ftprintf(pFile, TEXT(" D3D Status: %s\n"), pDisplayInfo->m_szD3DStatusEnglish);
|
||
|
_ftprintf(pFile, TEXT(" AGP Status: %s\n"), pDisplayInfo->m_szAGPStatusEnglish);
|
||
|
|
||
|
_ftprintf(pFile, TEXT("DDraw Test Result: %s\n"), pDisplayInfo->m_testResultDD.m_szDescriptionEnglish);
|
||
|
_ftprintf(pFile, TEXT(" D3D7 Test Result: %s\n"), pDisplayInfo->m_testResultD3D7.m_szDescriptionEnglish);
|
||
|
_ftprintf(pFile, TEXT(" D3D8 Test Result: %s\n"), pDisplayInfo->m_testResultD3D8.m_szDescriptionEnglish);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveSoundInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveSoundInfo(FILE* pFile, SoundInfo* pSoundInfoFirst)
|
||
|
{
|
||
|
SoundInfo* pSoundInfo;
|
||
|
TCHAR szAcceleration[1024];
|
||
|
TCHAR szVersion[1024];
|
||
|
TCHAR szAttributes[1024];
|
||
|
TCHAR szSigned[1024];
|
||
|
TCHAR szDateSize[1024];
|
||
|
|
||
|
_ftprintf(pFile, TEXT("-------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Sound Devices\n"));
|
||
|
_ftprintf(pFile, TEXT("-------------\n"));
|
||
|
for (pSoundInfo = pSoundInfoFirst; pSoundInfo != NULL;
|
||
|
pSoundInfo = pSoundInfo->m_pSoundInfoNext)
|
||
|
{
|
||
|
switch (pSoundInfo->m_lwAccelerationLevel)
|
||
|
{
|
||
|
case 0:
|
||
|
lstrcpy(szAcceleration, TEXT("Emulation Only"));
|
||
|
break;
|
||
|
case 1:
|
||
|
lstrcpy(szAcceleration, TEXT("Basic"));
|
||
|
break;
|
||
|
case 2:
|
||
|
lstrcpy(szAcceleration, TEXT("Standard"));
|
||
|
break;
|
||
|
case 3:
|
||
|
lstrcpy(szAcceleration, TEXT("Full"));
|
||
|
break;
|
||
|
default:
|
||
|
lstrcpy(szAcceleration, TEXT("Unknown"));
|
||
|
break;
|
||
|
}
|
||
|
if (lstrlen(pSoundInfo->m_szDriverName) > 0)
|
||
|
{
|
||
|
wsprintf(szVersion, TEXT("%s (%s)"), pSoundInfo->m_szDriverVersion, pSoundInfo->m_szDriverLanguage);
|
||
|
wsprintf(szAttributes, TEXT("%s %s"), pSoundInfo->m_bDriverBeta ? TEXT("Beta") : TEXT("Final"), pSoundInfo->m_bDriverDebug ? TEXT("Debug") : TEXT("Retail"));
|
||
|
wsprintf(szSigned, TEXT("%s"), pSoundInfo->m_bDriverSignedValid ? ( pSoundInfo->m_bDriverSigned ? TEXT("Yes") : TEXT("No") ) : TEXT("n/a") );
|
||
|
wsprintf(szDateSize, TEXT("%s, %d bytes"), pSoundInfo->m_szDriverDate, pSoundInfo->m_numBytes);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lstrcpy(szVersion, TEXT(""));
|
||
|
lstrcpy(szAttributes, TEXT(""));
|
||
|
lstrcpy(szSigned, TEXT(""));
|
||
|
lstrcpy(szDateSize, TEXT(""));
|
||
|
}
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" Description: %s\n"), pSoundInfo->m_szDescription);
|
||
|
_ftprintf(pFile, TEXT(" Device ID: %s\n"), pSoundInfo->m_szDeviceID);
|
||
|
_ftprintf(pFile, TEXT(" Manufacturer ID: %s\n"), pSoundInfo->m_szManufacturerID);
|
||
|
_ftprintf(pFile, TEXT(" Product ID: %s\n"), pSoundInfo->m_szProductID);
|
||
|
_ftprintf(pFile, TEXT(" Type: %s\n"), pSoundInfo->m_szType);
|
||
|
_ftprintf(pFile, TEXT(" Driver Name: %s\n"), pSoundInfo->m_szDriverName);
|
||
|
_ftprintf(pFile, TEXT(" Driver Version: %s\n"), szVersion);
|
||
|
_ftprintf(pFile, TEXT("Driver Attributes: %s\n"), szAttributes);
|
||
|
_ftprintf(pFile, TEXT(" Driver Signed: %s\n"), szSigned);
|
||
|
_ftprintf(pFile, TEXT(" Date and Size: %s\n"), szDateSize);
|
||
|
_ftprintf(pFile, TEXT(" Other Files: %s\n"), pSoundInfo->m_szOtherDrivers);
|
||
|
_ftprintf(pFile, TEXT(" Driver Provider: %s\n"), pSoundInfo->m_szProvider);
|
||
|
_ftprintf(pFile, TEXT(" HW Accel Level: %s\n"), szAcceleration);
|
||
|
if (pSoundInfo->m_pRegErrorFirst == NULL)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry: OK\n"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry: Errors found:\n"));
|
||
|
SaveRegistryErrorInfo(pFile, pSoundInfo->m_pRegErrorFirst);
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("Sound Test Result: %s\n"), pSoundInfo->m_testResultSnd.m_szDescriptionEnglish);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveMusicInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveMusicInfo(FILE* pFile, MusicInfo* pMusicInfo)
|
||
|
{
|
||
|
MusicPort* pMusicPort;
|
||
|
|
||
|
if (pMusicInfo == NULL || !pMusicInfo->m_bDMusicInstalled)
|
||
|
return S_OK;
|
||
|
|
||
|
_ftprintf(pFile, TEXT("-----------\n"));
|
||
|
_ftprintf(pFile, TEXT("DirectMusic\n"));
|
||
|
_ftprintf(pFile, TEXT("-----------\n"));
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" DLS Path: %s\n"), pMusicInfo->m_szGMFilePath);
|
||
|
_ftprintf(pFile, TEXT(" Version: %s\n"), pMusicInfo->m_szGMFileVersion);
|
||
|
_ftprintf(pFile, TEXT(" Ports:\n"));
|
||
|
|
||
|
for (pMusicPort = pMusicInfo->m_pMusicPortFirst; pMusicPort != NULL;
|
||
|
pMusicPort = pMusicPort->m_pMusicPortNext)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" %s, %s (%s), %s, %s, %s%s\n"),
|
||
|
pMusicPort->m_szDescription,
|
||
|
pMusicPort->m_bSoftware ? TEXT("Software") : TEXT("Hardware"),
|
||
|
pMusicPort->m_bKernelMode ? TEXT("Kernel Mode") : TEXT("Not Kernel Mode"),
|
||
|
pMusicPort->m_bOutputPort ? TEXT("Output") : TEXT("Input"),
|
||
|
pMusicPort->m_bUsesDLS ? TEXT("DLS") : TEXT("No DLS"),
|
||
|
pMusicPort->m_bExternal ? TEXT("External") : TEXT("Internal"),
|
||
|
pMusicPort->m_bDefaultPort ? TEXT(", Default Port") : TEXT("")
|
||
|
);
|
||
|
}
|
||
|
if (pMusicInfo->m_pRegErrorFirst == NULL)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry: OK\n"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry: Errors found:\n"));
|
||
|
SaveRegistryErrorInfo(pFile, pMusicInfo->m_pRegErrorFirst);
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("Music Test Result: %s\n"), pMusicInfo->m_testResult.m_szDescriptionEnglish);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveShowInfo - Since this only shows up in the saved report,
|
||
|
* we gather this info on the fly.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveShowInfo(FILE* pFile, ShowInfo* pShowInfo)
|
||
|
{
|
||
|
if( pShowInfo == NULL )
|
||
|
return S_OK;
|
||
|
|
||
|
_ftprintf(pFile, TEXT("------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("DirectShow Filters\n"));
|
||
|
_ftprintf(pFile, TEXT("------------------\n"));
|
||
|
|
||
|
FilterInfo* pFilterInfo;
|
||
|
|
||
|
TCHAR szCurCatName[1024];
|
||
|
TCHAR* szFileName = NULL;
|
||
|
TCHAR* szLastSlash = NULL;
|
||
|
_tcscpy( szCurCatName, TEXT("") );
|
||
|
|
||
|
pFilterInfo = pShowInfo->m_pFilters;
|
||
|
while(pFilterInfo)
|
||
|
{
|
||
|
if( _tcscmp( pFilterInfo->m_szCatName, szCurCatName ) != 0 )
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("\n%s:\n"), pFilterInfo->m_szCatName);
|
||
|
_tcscpy( szCurCatName, pFilterInfo->m_szCatName );
|
||
|
}
|
||
|
|
||
|
_ftprintf(pFile, TEXT("%s,"), pFilterInfo->m_szName);
|
||
|
_ftprintf(pFile, TEXT("0x%08x,"), pFilterInfo->m_dwMerit);
|
||
|
_ftprintf(pFile, TEXT("%d,"), pFilterInfo->m_dwInputs);
|
||
|
_ftprintf(pFile, TEXT("%d,"), pFilterInfo->m_dwOutputs);
|
||
|
|
||
|
// Display only the file name
|
||
|
szFileName = pFilterInfo->m_szFileName;
|
||
|
szLastSlash = _tcsrchr( pFilterInfo->m_szFileName, TEXT('\\') );
|
||
|
if( szLastSlash )
|
||
|
szFileName = szLastSlash + 1;
|
||
|
_ftprintf(pFile, TEXT("%s,"), szFileName);
|
||
|
|
||
|
_ftprintf(pFile, TEXT("%s\n"), pFilterInfo->m_szFileVersion);
|
||
|
|
||
|
pFilterInfo = pFilterInfo->m_pFilterInfoNext;
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveInputInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveInputInfo(FILE* pFile, InputInfo* pInputInfo)
|
||
|
{
|
||
|
InputDeviceInfo* pInputDeviceInfo;
|
||
|
InputDeviceInfoNT* pInputDeviceInfoNT;
|
||
|
InputDriverInfo* pInputDriverInfo;
|
||
|
|
||
|
_ftprintf(pFile, TEXT("-------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Input Devices\n"));
|
||
|
_ftprintf(pFile, TEXT("-------------\n"));
|
||
|
|
||
|
if( pInputInfo == NULL )
|
||
|
return S_OK;
|
||
|
|
||
|
if (pInputInfo->m_bNT)
|
||
|
{
|
||
|
for (pInputDeviceInfoNT = pInputInfo->m_pInputDeviceInfoNTFirst; pInputDeviceInfoNT != NULL;
|
||
|
pInputDeviceInfoNT = pInputDeviceInfoNT->m_pInputDeviceInfoNTNext)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Device Name: %s\n"), pInputDeviceInfoNT->m_szName);
|
||
|
_ftprintf(pFile, TEXT(" Provider: %s\n"), pInputDeviceInfoNT->m_szProvider);
|
||
|
_ftprintf(pFile, TEXT(" Hardware ID: %s\n"), pInputDeviceInfoNT->m_szId);
|
||
|
_ftprintf(pFile, TEXT(" Status: %d\n"), pInputDeviceInfoNT->m_dwProblem);
|
||
|
_ftprintf(pFile, TEXT(" Port Name: %s\n"), pInputDeviceInfoNT->m_szPortName);
|
||
|
_ftprintf(pFile, TEXT(" Port Provider: %s\n"), pInputDeviceInfoNT->m_szPortProvider);
|
||
|
_ftprintf(pFile, TEXT(" Port ID: %s\n"), pInputDeviceInfoNT->m_szPortId);
|
||
|
_ftprintf(pFile, TEXT(" Port Status: %d\n"), pInputDeviceInfoNT->m_dwPortProblem);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for (pInputDeviceInfo = pInputInfo->m_pInputDeviceInfoFirst; pInputDeviceInfo != NULL;
|
||
|
pInputDeviceInfo = pInputDeviceInfo->m_pInputDeviceInfoNext)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Device Name: %s\n"), pInputDeviceInfo->m_szDeviceName);
|
||
|
_ftprintf(pFile, TEXT(" Driver Name: %s\n"), pInputDeviceInfo->m_szDriverName);
|
||
|
_ftprintf(pFile, TEXT(" Driver Version: %s"), pInputDeviceInfo->m_szDriverVersion);
|
||
|
_ftprintf(pFile, TEXT(" (%s)\n"), pInputDeviceInfo->m_szDriverLanguage);
|
||
|
_ftprintf(pFile, TEXT("Driver Attributes: %s %s\n"), pInputDeviceInfo->m_bBeta ? "Beta" : "Final", pInputDeviceInfo->m_bDebug ? "Debug" : "Retail");
|
||
|
_ftprintf(pFile, TEXT(" Date and Size: %s, %d bytes\n"), pInputDeviceInfo->m_szDriverDate, pInputDeviceInfo->m_numBytes);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_ftprintf(pFile, TEXT("Poll w/ Interrupt: "));
|
||
|
_ftprintf(pFile, (pInputInfo->m_bPollFlags) ? TEXT("Yes\n") : TEXT("No\n") );
|
||
|
|
||
|
if (pInputInfo->m_pRegErrorFirst == NULL)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry: OK\n"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry: Errors found:\n"));
|
||
|
SaveRegistryErrorInfo(pFile, pInputInfo->m_pRegErrorFirst);
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
_ftprintf(pFile, TEXT("-------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Input Drivers\n"));
|
||
|
_ftprintf(pFile, TEXT("-------------\n"));
|
||
|
for (pInputDriverInfo = pInputInfo->m_pInputDriverInfoFirst; pInputDriverInfo != NULL;
|
||
|
pInputDriverInfo = pInputDriverInfo->m_pInputDriverInfoNext)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT(" Registry Key: %s\n"), pInputDriverInfo->m_szRegKey);
|
||
|
_ftprintf(pFile, TEXT(" Active: %s\n"), pInputDriverInfo->m_bActive ? "Yes" : "No");
|
||
|
_ftprintf(pFile, TEXT(" DeviceID: %s\n"), pInputDriverInfo->m_szDeviceID);
|
||
|
_ftprintf(pFile, TEXT("Matching DevID: %s\n"), pInputDriverInfo->m_szMatchingDeviceID);
|
||
|
_ftprintf(pFile, TEXT(" 16-bit Driver: %s\n"), pInputDriverInfo->m_szDriver16);
|
||
|
_ftprintf(pFile, TEXT(" 32-bit Driver: %s\n"), pInputDriverInfo->m_szDriver32);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveNetInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveNetInfo(FILE* pFile, NetInfo* pNetInfo)
|
||
|
{
|
||
|
NetSP* pNetSP;
|
||
|
NetApp* pNetApp;
|
||
|
|
||
|
_ftprintf(pFile, TEXT("----------------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("DirectPlay Service Providers\n"));
|
||
|
_ftprintf(pFile, TEXT("----------------------------\n"));
|
||
|
|
||
|
if( pNetInfo == NULL )
|
||
|
return S_OK;
|
||
|
|
||
|
for (pNetSP = pNetInfo->m_pNetSPFirst; pNetSP != NULL; pNetSP = pNetSP->m_pNetSPNext)
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("%s - Registry: %s, File: %s (%s)\n"),
|
||
|
pNetSP->m_szNameEnglish,
|
||
|
pNetSP->m_bRegistryOK ? TEXT("OK") : TEXT("Error"),
|
||
|
pNetSP->m_szFile,
|
||
|
pNetSP->m_szVersionEnglish);
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("DirectPlay Test Result: %s\n"), pNetInfo->m_testResult.m_szDescriptionEnglish);
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
|
||
|
_ftprintf(pFile, TEXT("-------------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("DirectPlay Lobbyable Apps\n"));
|
||
|
_ftprintf(pFile, TEXT("-------------------------\n"));
|
||
|
for (pNetApp = pNetInfo->m_pNetAppFirst; pNetApp != NULL; pNetApp = pNetApp->m_pNetAppNext)
|
||
|
{
|
||
|
if( pNetApp->m_dwDXVer == 7 )
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("%s (DX%d) - Registry: %s, ExeFile: %s (%s)\n"),
|
||
|
pNetApp->m_szName,
|
||
|
pNetApp->m_dwDXVer,
|
||
|
pNetApp->m_bRegistryOK ? TEXT("OK") : TEXT("Error"),
|
||
|
pNetApp->m_szExeFile,
|
||
|
pNetApp->m_szExeVersionEnglish);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("%s (DX%d) - Registry: %s, ExeFile: %s (%s) LauncherFile: %s (%s)\n"),
|
||
|
pNetApp->m_szName,
|
||
|
pNetApp->m_dwDXVer,
|
||
|
pNetApp->m_bRegistryOK ? TEXT("OK") : TEXT("Error"),
|
||
|
pNetApp->m_szExeFile,
|
||
|
pNetApp->m_szExeVersionEnglish,
|
||
|
pNetApp->m_szLauncherFile,
|
||
|
pNetApp->m_szLauncherVersionEnglish);
|
||
|
}
|
||
|
}
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveInactiveDriverInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveInactiveDriverInfo(FILE* pFile, DisplayInfo* pDisplayInfoFirst)
|
||
|
{
|
||
|
BOOL bNoInactive;
|
||
|
HKEY hKey;
|
||
|
DWORD cbData;
|
||
|
DWORD dwIndex;
|
||
|
TCHAR szSubKeyName[1024];
|
||
|
DisplayInfo* pDisplayInfo;
|
||
|
HKEY hSubKey;
|
||
|
TCHAR szSubSubKey[1024];
|
||
|
TCHAR szDriverDesc[1024];
|
||
|
DWORD ulType;
|
||
|
TCHAR szTempString[1024];
|
||
|
|
||
|
if (BIsPlatformNT())
|
||
|
return S_OK;
|
||
|
|
||
|
_ftprintf(pFile, TEXT("------------------------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Inactive Display Entries in Registry\n"));
|
||
|
_ftprintf(pFile, TEXT("------------------------------------\n"));
|
||
|
|
||
|
bNoInactive = TRUE;
|
||
|
|
||
|
// Display info (inactive).
|
||
|
hKey = 0;
|
||
|
if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\Class\\Display"), 0, KEY_READ, &hKey))
|
||
|
{
|
||
|
cbData = sizeof szSubKeyName;
|
||
|
dwIndex = 0;
|
||
|
|
||
|
while (!RegEnumKeyEx(hKey, dwIndex, szSubKeyName, &cbData, NULL, NULL, NULL, NULL))
|
||
|
{
|
||
|
TCHAR* pch;
|
||
|
BOOL bMatch = FALSE;
|
||
|
|
||
|
// See if this driver is used:
|
||
|
for (pDisplayInfo = pDisplayInfoFirst; pDisplayInfo != NULL;
|
||
|
pDisplayInfo = pDisplayInfo->m_pDisplayInfoNext)
|
||
|
{
|
||
|
pch = _tcsrchr(pDisplayInfo->m_szKeyDeviceKey, TEXT('\\'));
|
||
|
if (pch != NULL)
|
||
|
{
|
||
|
pch++;
|
||
|
|
||
|
if (lstrcmp(szSubKeyName, pch) == 0)
|
||
|
{
|
||
|
bMatch = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!bMatch)
|
||
|
{
|
||
|
hSubKey = 0;
|
||
|
wsprintf(szSubSubKey, TEXT("System\\CurrentControlSet\\Services\\Class\\Display\\%s"), szSubKeyName);
|
||
|
|
||
|
if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubSubKey, 0, KEY_READ, &hSubKey))
|
||
|
{
|
||
|
cbData = sizeof szDriverDesc;
|
||
|
szDriverDesc[0] = 0;
|
||
|
RegQueryValueEx(hSubKey, TEXT("DriverDesc"), 0, &ulType, (LPBYTE)szDriverDesc, &cbData);
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" Card name: %s\n"), szDriverDesc);
|
||
|
bNoInactive = FALSE;
|
||
|
}
|
||
|
|
||
|
if (hSubKey)
|
||
|
{
|
||
|
RegCloseKey(hSubKey);
|
||
|
hSubKey = 0;
|
||
|
}
|
||
|
|
||
|
wsprintf(szSubSubKey, TEXT("System\\CurrentControlSet\\Services\\Class\\Display\\%s\\DEFAULT"), szSubKeyName);
|
||
|
|
||
|
if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubSubKey, 0, KEY_READ, &hSubKey))
|
||
|
{
|
||
|
TCHAR szDisplayDriverName[1024];
|
||
|
cbData = sizeof szDisplayDriverName;
|
||
|
szDisplayDriverName[0] = 0;
|
||
|
RegQueryValueEx(hSubKey, TEXT("DRV"), 0, &ulType, (LPBYTE)szDisplayDriverName, &cbData);
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" Driver: %s\n"), szDisplayDriverName);
|
||
|
bNoInactive = FALSE;
|
||
|
}
|
||
|
|
||
|
if (hSubKey)
|
||
|
{
|
||
|
RegCloseKey(hSubKey);
|
||
|
hSubKey = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cbData = sizeof szSubKeyName;
|
||
|
dwIndex++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (hKey)
|
||
|
{
|
||
|
RegCloseKey(hKey);
|
||
|
hKey = 0;
|
||
|
}
|
||
|
|
||
|
if (bNoInactive)
|
||
|
_ftprintf(pFile, TEXT(" None\n"));
|
||
|
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
|
||
|
_ftprintf(pFile, TEXT("----------------------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("Inactive Sound Entries in Registry\n"));
|
||
|
_ftprintf(pFile, TEXT("----------------------------------\n"));
|
||
|
|
||
|
bNoInactive = TRUE;
|
||
|
|
||
|
hKey = 0;
|
||
|
if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\control\\MediaResources\\wave"), 0, KEY_READ, &hKey))
|
||
|
{
|
||
|
dwIndex = 0;
|
||
|
while (TRUE)
|
||
|
{
|
||
|
cbData = sizeof szSubKeyName;
|
||
|
if (ERROR_SUCCESS != RegEnumKeyEx(hKey, dwIndex, szSubKeyName, &cbData, NULL, NULL, NULL, NULL))
|
||
|
break;
|
||
|
|
||
|
if (!RegOpenKeyEx(hKey, szSubKeyName, 0, KEY_READ, &hSubKey))
|
||
|
{
|
||
|
cbData = sizeof szTempString;
|
||
|
if (!RegQueryValueEx(hSubKey, TEXT("Active"), 0, &ulType, (LPBYTE)szTempString, &cbData))
|
||
|
{
|
||
|
if (lstrcmp(szTempString, TEXT("0")) == 0)
|
||
|
{
|
||
|
TCHAR szWaveOutDesc[1024];
|
||
|
TCHAR szWaveDriverName[1024];
|
||
|
cbData = sizeof szWaveOutDesc;
|
||
|
RegQueryValueEx(hSubKey, TEXT("Description"), 0, &ulType, (LPBYTE)szWaveOutDesc, &cbData);
|
||
|
|
||
|
cbData = sizeof szWaveDriverName;
|
||
|
RegQueryValueEx(hSubKey, TEXT("Driver"), 0, &ulType, (LPBYTE)szWaveDriverName, &cbData);
|
||
|
|
||
|
_ftprintf(pFile, TEXT(" Card name: %s\n"), szWaveOutDesc);
|
||
|
_ftprintf(pFile, TEXT(" Driver: %s\n"), szWaveDriverName);
|
||
|
bNoInactive = FALSE;
|
||
|
}
|
||
|
}
|
||
|
RegCloseKey(hSubKey);
|
||
|
}
|
||
|
dwIndex++;
|
||
|
}
|
||
|
RegCloseKey(hKey);
|
||
|
}
|
||
|
|
||
|
if (bNoInactive)
|
||
|
_ftprintf(pFile, TEXT(" None\n"));
|
||
|
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveRegistryErrorInfo
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveRegistryErrorInfo(FILE* pFile, RegError* pRegErrorFirst)
|
||
|
{
|
||
|
RegError* pRegError = pRegErrorFirst;
|
||
|
DWORD i;
|
||
|
CHAR* pszRoot;
|
||
|
|
||
|
while (pRegError != NULL)
|
||
|
{
|
||
|
switch ((DWORD_PTR)pRegError->m_hkeyRoot)
|
||
|
{
|
||
|
case (DWORD_PTR)HKEY_LOCAL_MACHINE:
|
||
|
pszRoot = "HKLM";
|
||
|
break;
|
||
|
case (DWORD_PTR)HKEY_CURRENT_USER:
|
||
|
pszRoot = "HKCU";
|
||
|
break;
|
||
|
case (DWORD_PTR)HKEY_CLASSES_ROOT:
|
||
|
pszRoot = "HKCR";
|
||
|
break;
|
||
|
case (DWORD_PTR)HKEY_USERS:
|
||
|
pszRoot = "HKU";
|
||
|
break;
|
||
|
case (DWORD_PTR)HKEY_CURRENT_CONFIG:
|
||
|
pszRoot = "HKCC";
|
||
|
break;
|
||
|
default:
|
||
|
pszRoot = "";
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
_ftprintf(pFile, TEXT("Key '%s\\%s'"), pszRoot, pRegError->m_szKey);
|
||
|
switch (pRegError->m_ret)
|
||
|
{
|
||
|
case RET_MISSINGKEY:
|
||
|
_ftprintf(pFile, TEXT(" is missing.\n"));
|
||
|
break;
|
||
|
case RET_MISSINGVALUE:
|
||
|
_ftprintf(pFile, TEXT(" is missing value '%s'.\n"), pRegError->m_szValue);
|
||
|
break;
|
||
|
case RET_VALUEWRONGTYPE:
|
||
|
_ftprintf(pFile, TEXT(" has value '%s', but it is the wrong type.\n"), pRegError->m_szValue);
|
||
|
break;
|
||
|
case RET_VALUEWRONGDATA:
|
||
|
_ftprintf(pFile, TEXT(", Value '%s'"), pRegError->m_szValue);
|
||
|
switch(pRegError->m_dwTypeActual)
|
||
|
{
|
||
|
case REG_DWORD:
|
||
|
_ftprintf(pFile, TEXT(", should be '%d' but is '%d'.\n"), pRegError->m_dwExpected, pRegError->m_dwActual);
|
||
|
break;
|
||
|
case REG_SZ:
|
||
|
_ftprintf(pFile, TEXT(", should be '%s'"), pRegError->m_szExpected);
|
||
|
_ftprintf(pFile, TEXT(", but is '%s'.\n"), pRegError->m_szActual);
|
||
|
break;
|
||
|
case REG_BINARY:
|
||
|
_ftprintf(pFile, TEXT(", should be '"));
|
||
|
for (i = 0; i < pRegError->m_dwExpectedSize; i++)
|
||
|
_ftprintf(pFile, TEXT("%02x"), pRegError->m_bExpected[i]);
|
||
|
_ftprintf(pFile, TEXT("' but is '"));
|
||
|
for (i = 0; i < pRegError->m_dwActualSize; i++)
|
||
|
_ftprintf(pFile, TEXT("%02x"), pRegError->m_bActual[i]);
|
||
|
_ftprintf(pFile, TEXT("'.\n"));
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
pRegError = pRegError->m_pRegErrorNext;
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* SaveDebugLevels
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
HRESULT SaveDebugLevels(FILE* pFile, SysInfo* pSysInfo)
|
||
|
{
|
||
|
TCHAR sz[1024];
|
||
|
|
||
|
if( pSysInfo->m_bIsD3D8DebugRuntimeAvailable ||
|
||
|
pSysInfo->m_bIsDInput8DebugRuntimeAvailable ||
|
||
|
pSysInfo->m_bIsDMusicDebugRuntimeAvailable ||
|
||
|
pSysInfo->m_bIsDDrawDebugRuntime ||
|
||
|
pSysInfo->m_bIsDSoundDebugRuntime ||
|
||
|
pSysInfo->m_bIsDPlayDebugRuntime ||
|
||
|
pSysInfo->m_nD3DDebugLevel > 0 ||
|
||
|
pSysInfo->m_nDDrawDebugLevel > 0 ||
|
||
|
pSysInfo->m_nDIDebugLevel > 0 ||
|
||
|
pSysInfo->m_nDMusicDebugLevel > 0 ||
|
||
|
pSysInfo->m_nDPlayDebugLevel > 0 ||
|
||
|
pSysInfo->m_nDSoundDebugLevel > 0 )
|
||
|
{
|
||
|
_ftprintf(pFile, TEXT("--------------------\n"));
|
||
|
_ftprintf(pFile, TEXT("DirectX Debug Levels\n"));
|
||
|
_ftprintf(pFile, TEXT("--------------------\n"));
|
||
|
|
||
|
_stprintf(sz, TEXT("Direct3D: %d/4 (%s)\n"), pSysInfo->m_nD3DDebugLevel, pSysInfo->m_bIsD3D8DebugRuntimeAvailable ? (pSysInfo->m_bIsD3DDebugRuntime ? TEXT("debug") : TEXT("retail") ) : TEXT("n/a") );
|
||
|
_ftprintf(pFile, sz);
|
||
|
_stprintf(sz, TEXT("DirectDraw: %d/4 (%s)\n"), pSysInfo->m_nDDrawDebugLevel, pSysInfo->m_bIsDDrawDebugRuntime ? TEXT("debug") : TEXT("retail") );
|
||
|
_ftprintf(pFile, sz);
|
||
|
_stprintf(sz, TEXT("DirectInput: %d/5 (%s)\n"), pSysInfo->m_nDIDebugLevel, pSysInfo->m_bIsDInput8DebugRuntimeAvailable ? (pSysInfo->m_bIsDInput8DebugRuntime ? TEXT("debug") : TEXT("retail") ) : TEXT("n/a") );
|
||
|
_ftprintf(pFile, sz);
|
||
|
_stprintf(sz, TEXT("DirectMusic: %d/5 (%s)\n"), pSysInfo->m_nDMusicDebugLevel, pSysInfo->m_bIsDMusicDebugRuntimeAvailable ? (pSysInfo->m_bIsDMusicDebugRuntime ? TEXT("debug") : TEXT("retail") ) : TEXT("n/a") );
|
||
|
_ftprintf(pFile, sz);
|
||
|
_stprintf(sz, TEXT("DirectPlay: %d/9 (%s)\n"), pSysInfo->m_nDPlayDebugLevel, pSysInfo->m_bIsDPlayDebugRuntime ? TEXT("debug") : TEXT("retail") );
|
||
|
_ftprintf(pFile, sz);
|
||
|
_stprintf(sz, TEXT("DirectSound: %d/5 (%s)\n"), pSysInfo->m_nDSoundDebugLevel, pSysInfo->m_bIsDSoundDebugRuntime ? TEXT("debug") : TEXT("retail") );
|
||
|
_ftprintf(pFile, sz);
|
||
|
|
||
|
_ftprintf(pFile, TEXT("\n"));
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|