OSDN Git Service

#xxxxx DTXViewerのプロジェクトを追加。
[dtxmania/dtxmania.git] / DTXViewerプロジェクト / @FDK10プロジェクト / GetDXVersion.cpp
diff --git a/DTXViewerプロジェクト/@FDK10プロジェクト/GetDXVersion.cpp b/DTXViewerプロジェクト/@FDK10プロジェクト/GetDXVersion.cpp
new file mode 100644 (file)
index 0000000..001ea6c
--- /dev/null
@@ -0,0 +1,566 @@
+//-----------------------------------------------------------------------------
+// File: GetDXVer.cpp
+//
+// Desc: Demonstrates how applications can detect what version of DirectX
+//       is installed.
+//
+// (C) Copyright Microsoft Corp.  All rights reserved.
+//-----------------------------------------------------------------------------
+#include "stdafx.h"
+#include <windows.h>
+#include <stdio.h>
+#pragma warning(disable: 4005 4995)
+#include <tchar.h>
+#pragma warning(default: 4005 4995)
+#pragma warning( disable : 4996 ) // disable deprecated warning 
+#include <strsafe.h>
+#pragma warning( default : 4996 ) 
+#include <dxdiag.h>
+
+namespace FDK {
+       namespace General {
+
+static HRESULT GetDirectXVersionViaDxDiag( DWORD* pdwDirectXVersionMajor, DWORD* pdwDirectXVersionMinor, TCHAR* pcDirectXVersionLetter );
+static HRESULT GetDirectXVersionViaFileVersions( DWORD* pdwDirectXVersionMajor, DWORD* pdwDirectXVersionMinor, TCHAR* pcDirectXVersionLetter );
+static HRESULT GetFileVersion( TCHAR* szPath, ULARGE_INTEGER* pllFileVersion );
+static ULARGE_INTEGER MakeInt64( WORD a, WORD b, WORD c, WORD d );
+static int CompareLargeInts( ULARGE_INTEGER ullParam1, ULARGE_INTEGER ullParam2 );
+
+
+//-----------------------------------------------------------------------------
+// Name: GetDXVersion()
+// Desc: This function returns the DirectX version.
+// Arguments:
+//      pdwDirectXVersion - This can be NULL.  If non-NULL, the return value is:
+//              0x00000000 = No DirectX installed
+//              0x00010000 = DirectX 1.0 installed
+//              0x00020000 = DirectX 2.0 installed
+//              0x00030000 = DirectX 3.0 installed
+//              0x00030001 = DirectX 3.0a installed
+//              0x00050000 = DirectX 5.0 installed
+//              0x00060000 = DirectX 6.0 installed
+//              0x00060100 = DirectX 6.1 installed
+//              0x00060101 = DirectX 6.1a installed
+//              0x00070000 = DirectX 7.0 installed
+//              0x00070001 = DirectX 7.0a installed
+//              0x00080000 = DirectX 8.0 installed
+//              0x00080100 = DirectX 8.1 installed
+//              0x00080101 = DirectX 8.1a installed
+//              0x00080102 = DirectX 8.1b installed
+//              0x00080200 = DirectX 8.2 installed
+//              0x00090000 = DirectX 9.0 installed
+//      strDirectXVersion - Destination string to receive a string name of the DirectX Version.  Can be NULL.
+//      cchDirectXVersion - Size of destination buffer in characters.  Length should be at least 10 chars.
+// Returns: S_OK if the function succeeds.
+//          E_FAIL if the DirectX version info couldn't be determined.
+//
+// Please note that this code is intended as a general guideline. Your
+// app will probably be able to simply query for functionality (via
+// QueryInterface) for one or two components.
+//
+// Also please ensure your app will run on future releases of DirectX.
+// For example:
+//     "if( dwDirectXVersion != 0x00080100 ) return false;" is VERY BAD.
+//     "if( dwDirectXVersion < 0x00080100 ) return false;" is MUCH BETTER.
+//-----------------------------------------------------------------------------
+HRESULT GetDXVersion( DWORD* pdwDirectXVersion, TCHAR* strDirectXVersion, int cchDirectXVersion )
+{
+    bool bGotDirectXVersion = false;
+
+    // Init values to unknown
+    if( pdwDirectXVersion )
+        *pdwDirectXVersion = 0;
+    if( strDirectXVersion && cchDirectXVersion > 0 )
+        strDirectXVersion[0] = 0;
+
+    DWORD dwDirectXVersionMajor = 0;
+    DWORD dwDirectXVersionMinor = 0;
+    TCHAR cDirectXVersionLetter = ' ';
+
+    // First, try to use dxdiag's COM interface to get the DirectX version.
+    // The only downside is this will only work on DirectX9 or later.
+    if( SUCCEEDED( GetDirectXVersionViaDxDiag( &dwDirectXVersionMajor, &dwDirectXVersionMinor, &cDirectXVersionLetter ) ) )
+        bGotDirectXVersion = true;
+
+    if( !bGotDirectXVersion )
+    {
+        // Getting the DirectX version info from DxDiag failed,
+        // so most likely we are on DirectX8.x or earlier
+        if( SUCCEEDED( GetDirectXVersionViaFileVersions( &dwDirectXVersionMajor, &dwDirectXVersionMinor, &cDirectXVersionLetter ) ) )
+            bGotDirectXVersion = true;
+    }
+
+    // If both techniques failed, then return E_FAIL
+    if( !bGotDirectXVersion )
+        return E_FAIL;
+
+    // Set the output values to what we got and return
+    cDirectXVersionLetter = (char)tolower(cDirectXVersionLetter);
+
+    if( pdwDirectXVersion )
+    {
+        // If pdwDirectXVersion is non-NULL, then set it to something
+        // like 0x00080102 which would represent DirectX8.1b
+        DWORD dwDirectXVersion = dwDirectXVersionMajor;
+        dwDirectXVersion <<= 8;
+        dwDirectXVersion += dwDirectXVersionMinor;
+        dwDirectXVersion <<= 8;
+        if( cDirectXVersionLetter >= 'a' && cDirectXVersionLetter <= 'z' )
+            dwDirectXVersion += (cDirectXVersionLetter - 'a') + 1;
+
+        *pdwDirectXVersion = dwDirectXVersion;
+    }
+
+    if( strDirectXVersion && cchDirectXVersion > 0 )
+    {
+        // If strDirectXVersion is non-NULL, then set it to something
+        // like "8.1b" which would represent DirectX8.1b
+        if( cDirectXVersionLetter == ' ' )
+            StringCchPrintf( strDirectXVersion, cchDirectXVersion, TEXT("%d.%d"), dwDirectXVersionMajor, dwDirectXVersionMinor );
+        else
+            StringCchPrintf( strDirectXVersion, cchDirectXVersion, TEXT("%d.%d%c"), dwDirectXVersionMajor, dwDirectXVersionMinor, cDirectXVersionLetter );
+    }
+
+   return S_OK;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+// Name: GetDirectXVersionViaDxDiag()
+// Desc: Tries to get the DirectX version from DxDiag's COM interface
+//-----------------------------------------------------------------------------
+HRESULT GetDirectXVersionViaDxDiag( DWORD* pdwDirectXVersionMajor,
+                                    DWORD* pdwDirectXVersionMinor,
+                                    TCHAR* pcDirectXVersionLetter )
+{
+    HRESULT hr;
+    bool bCleanupCOM = false;
+
+    bool bSuccessGettingMajor = false;
+    bool bSuccessGettingMinor = false;
+    bool bSuccessGettingLetter = false;
+
+    // Init COM.  COM may fail if its already been inited with a different
+    // concurrency model.  And if it fails you shouldn't release it.
+    hr = CoInitialize(NULL);
+    bCleanupCOM = SUCCEEDED(hr);
+
+    // Get an IDxDiagProvider
+    bool bGotDirectXVersion = false;
+    IDxDiagProvider* pDxDiagProvider = NULL;
+    hr = CoCreateInstance( CLSID_DxDiagProvider,
+                           NULL,
+                           CLSCTX_INPROC_SERVER,
+                           IID_IDxDiagProvider,
+                           (LPVOID*) &pDxDiagProvider );
+    if( SUCCEEDED(hr) )
+    {
+        // Fill out a DXDIAG_INIT_PARAMS struct
+        DXDIAG_INIT_PARAMS dxDiagInitParam;
+        ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) );
+        dxDiagInitParam.dwSize                  = sizeof(DXDIAG_INIT_PARAMS);
+        dxDiagInitParam.dwDxDiagHeaderVersion   = DXDIAG_DX9_SDK_VERSION;
+        dxDiagInitParam.bAllowWHQLChecks        = false;
+        dxDiagInitParam.pReserved               = NULL;
+
+        // Init the m_pDxDiagProvider
+        hr = pDxDiagProvider->Initialize( &dxDiagInitParam );
+        if( SUCCEEDED(hr) )
+        {
+            IDxDiagContainer* pDxDiagRoot = NULL;
+            IDxDiagContainer* pDxDiagSystemInfo = NULL;
+
+            // Get the DxDiag root container
+            hr = pDxDiagProvider->GetRootContainer( &pDxDiagRoot );
+            if( SUCCEEDED(hr) )
+            {
+                // Get the object called DxDiag_SystemInfo
+                hr = pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pDxDiagSystemInfo );
+                if( SUCCEEDED(hr) )
+                {
+                    VARIANT var;
+                    VariantInit( &var );
+
+                    // Get the "dwDirectXVersionMajor" property
+                    hr = pDxDiagSystemInfo->GetProp( L"dwDirectXVersionMajor", &var );
+                    if( SUCCEEDED(hr) && var.vt == VT_UI4 )
+                    {
+                        if( pdwDirectXVersionMajor )
+                            *pdwDirectXVersionMajor = var.ulVal;
+                        bSuccessGettingMajor = true;
+                    }
+                    VariantClear( &var );
+
+                    // Get the "dwDirectXVersionMinor" property
+                    hr = pDxDiagSystemInfo->GetProp( L"dwDirectXVersionMinor", &var );
+                    if( SUCCEEDED(hr) && var.vt == VT_UI4 )
+                    {
+                        if( pdwDirectXVersionMinor )
+                            *pdwDirectXVersionMinor = var.ulVal;
+                        bSuccessGettingMinor = true;
+                    }
+                    VariantClear( &var );
+
+                    // Get the "szDirectXVersionLetter" property
+                    hr = pDxDiagSystemInfo->GetProp( L"szDirectXVersionLetter", &var );
+                    if( SUCCEEDED(hr) && var.vt == VT_BSTR && SysStringLen( var.bstrVal ) != 0 )
+                    {
+#ifdef UNICODE
+                        *pcDirectXVersionLetter = var.bstrVal[0];
+#else
+                        char strDestination[10];
+                        WideCharToMultiByte( CP_ACP, 0, var.bstrVal, -1, strDestination, 10*sizeof(CHAR), NULL, NULL );
+                        if( pcDirectXVersionLetter )
+                            *pcDirectXVersionLetter = strDestination[0];
+#endif
+                        bSuccessGettingLetter = true;
+                    }
+                    VariantClear( &var );
+
+                    // If it all worked right, then mark it down
+                    if( bSuccessGettingMajor && bSuccessGettingMinor && bSuccessGettingLetter )
+                        bGotDirectXVersion = true;
+
+                    pDxDiagSystemInfo->Release();
+                }
+
+                pDxDiagRoot->Release();
+            }
+        }
+
+        pDxDiagProvider->Release();
+    }
+
+    if( bCleanupCOM )
+        CoUninitialize();
+
+    if( bGotDirectXVersion )
+        return S_OK;
+    else
+        return E_FAIL;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+// Name: GetDirectXVersionViaFileVersions()
+// Desc: Tries to get the DirectX version by looking at DirectX file versions
+//-----------------------------------------------------------------------------
+HRESULT GetDirectXVersionViaFileVersions( DWORD* pdwDirectXVersionMajor,
+                                         DWORD* pdwDirectXVersionMinor,
+                                         TCHAR* pcDirectXVersionLetter )
+{
+    ULARGE_INTEGER llFileVersion;
+    TCHAR szPath[512];
+    TCHAR szFile[512];
+    BOOL bFound = false;
+
+    if( GetSystemDirectory( szPath, MAX_PATH ) != 0 )
+    {
+        szPath[MAX_PATH-1]=0;
+
+        // Switch off the ddraw version
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\ddraw.dll") );
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 2, 0, 95 ) ) >= 0 ) // Win9x version
+            {
+                // flle is >= DirectX1.0 version, so we must be at least DirectX1.0
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 1;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 3, 0, 1096 ) ) >= 0 ) // Win9x version
+            {
+                // flle is is >= DirectX2.0 version, so we must DirectX2.0 or DirectX2.0a (no redist change)
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 2;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 4, 0, 68 ) ) >= 0 ) // Win9x version
+            {
+                // flle is is >= DirectX3.0 version, so we must be at least DirectX3.0
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 3;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+        }
+
+        // Switch off the d3drg8x.dll version
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\d3drg8x.dll") );
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 4, 0, 70 ) ) >= 0 ) // Win9x version
+            {
+                // d3drg8x.dll is the DirectX3.0a version, so we must be DirectX3.0a or DirectX3.0b  (no redist change)
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 3;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('a');
+                bFound = true;
+            }
+        }
+
+        // Switch off the ddraw version
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\ddraw.dll") );
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 5, 0, 155 ) ) >= 0 ) // Win9x version
+            {
+                // ddraw.dll is the DirectX5.0 version, so we must be DirectX5.0 or DirectX5.2 (no redist change)
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 5;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 6, 0, 318 ) ) >= 0 ) // Win9x version
+            {
+                // ddraw.dll is the DirectX6.0 version, so we must be at least DirectX6.0
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 6;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 6, 0, 436 ) ) >= 0 ) // Win9x version
+            {
+                // ddraw.dll is the DirectX6.1 version, so we must be at least DirectX6.1
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 6;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+        }
+
+        // Switch off the dplayx.dll version
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\dplayx.dll") );
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 6, 3, 518 ) ) >= 0 ) // Win9x version
+            {
+                // ddraw.dll is the DirectX6.1 version, so we must be at least DirectX6.1a
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 6;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('a');
+                bFound = true;
+            }
+        }
+
+        // Switch off the ddraw version
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\ddraw.dll") );
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 7, 0, 700 ) ) >= 0 ) // Win9x version
+            {
+                // TODO: find win2k version
+
+                // ddraw.dll is the DirectX7.0 version, so we must be at least DirectX7.0
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 7;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+        }
+
+        // Switch off the dinput version
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\dinput.dll") );
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( CompareLargeInts( llFileVersion, MakeInt64( 4, 7, 0, 716 ) ) >= 0 ) // Win9x version
+            {
+                // ddraw.dll is the DirectX7.0 version, so we must be at least DirectX7.0a
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 7;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('a');
+                bFound = true;
+            }
+        }
+
+        // Switch off the ddraw version
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\ddraw.dll") );
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( (HIWORD(llFileVersion.HighPart) == 4 && CompareLargeInts( llFileVersion, MakeInt64( 4, 8, 0, 400 ) ) >= 0) || // Win9x version
+                (HIWORD(llFileVersion.HighPart) == 5 && CompareLargeInts( llFileVersion, MakeInt64( 5, 1, 2258, 400 ) ) >= 0) ) // Win2k/WinXP version
+            {
+                // ddraw.dll is the DirectX8.0 version, so we must be at least DirectX8.0 or DirectX8.0a (no redist change)
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+        }
+
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\d3d8.dll"));
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( (HIWORD(llFileVersion.HighPart) == 4 && CompareLargeInts( llFileVersion, MakeInt64( 4, 8, 1, 881 ) ) >= 0) || // Win9x version
+                (HIWORD(llFileVersion.HighPart) == 5 && CompareLargeInts( llFileVersion, MakeInt64( 5, 1, 2600, 881 ) ) >= 0) ) // Win2k/WinXP version
+            {
+                // d3d8.dll is the DirectX8.1 version, so we must be at least DirectX8.1
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+
+            if( (HIWORD(llFileVersion.HighPart) == 4 && CompareLargeInts( llFileVersion, MakeInt64( 4, 8, 1, 901 ) ) >= 0) || // Win9x version
+                (HIWORD(llFileVersion.HighPart) == 5 && CompareLargeInts( llFileVersion, MakeInt64( 5, 1, 2600, 901 ) ) >= 0) ) // Win2k/WinXP version
+            {
+                // d3d8.dll is the DirectX8.1a version, so we must be at least DirectX8.1a
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('a');
+                bFound = true;
+            }
+        }
+
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\mpg2splt.ax"));
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( CompareLargeInts( llFileVersion, MakeInt64( 6, 3, 1, 885 ) ) >= 0 ) // Win9x/Win2k/WinXP version
+            {
+                // quartz.dll is the DirectX8.1b version, so we must be at least DirectX8.1b
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 1;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT('b');
+                bFound = true;
+            }
+        }
+
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\dpnet.dll"));
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            if( (HIWORD(llFileVersion.HighPart) == 4 && CompareLargeInts( llFileVersion, MakeInt64( 4, 9, 0, 134 ) ) >= 0) || // Win9x version
+                (HIWORD(llFileVersion.HighPart) == 5 && CompareLargeInts( llFileVersion, MakeInt64( 5, 2, 3677, 134 ) ) >= 0) ) // Win2k/WinXP version
+            {
+                // dpnet.dll is the DirectX8.2 version, so we must be at least DirectX8.2
+                if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 8;
+                if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 2;
+                if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+                bFound = true;
+            }
+        }
+
+        StringCchCopy( szFile, 512, szPath );
+        StringCchCat( szFile, 512, TEXT("\\d3d9.dll"));
+        if( SUCCEEDED( GetFileVersion( szFile, &llFileVersion ) ) )
+        {
+            // File exists, but be at least DirectX9
+            if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 9;
+            if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+            if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+            bFound = true;
+        }
+    }
+
+    if( !bFound )
+    {
+        // No DirectX installed
+        if( pdwDirectXVersionMajor ) *pdwDirectXVersionMajor = 0;
+        if( pdwDirectXVersionMinor ) *pdwDirectXVersionMinor = 0;
+        if( pcDirectXVersionLetter ) *pcDirectXVersionLetter = TEXT(' ');
+    }
+
+    return S_OK;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+// Name: GetFileVersion()
+// Desc: Returns ULARGE_INTEGER with a file version of a file, or a failure code.
+//-----------------------------------------------------------------------------
+HRESULT GetFileVersion( TCHAR* szPath, ULARGE_INTEGER* pllFileVersion )
+{
+    if( szPath == NULL || pllFileVersion == NULL )
+        return E_INVALIDARG;
+
+    DWORD dwHandle;
+    UINT  cb;
+    cb = GetFileVersionInfoSize( szPath, &dwHandle );
+    if (cb > 0)
+    {
+        BYTE* pFileVersionBuffer = new BYTE[cb];
+        if( pFileVersionBuffer == NULL )
+            return E_OUTOFMEMORY;
+
+        if (GetFileVersionInfo( szPath, 0, cb, pFileVersionBuffer))
+        {
+            VS_FIXEDFILEINFO* pVersion = NULL;
+            if (VerQueryValue(pFileVersionBuffer, TEXT("\\"), (VOID**)&pVersion, &cb) &&
+                pVersion != NULL)
+            {
+                pllFileVersion->HighPart = pVersion->dwFileVersionMS;
+                pllFileVersion->LowPart  = pVersion->dwFileVersionLS;
+                delete[] pFileVersionBuffer;
+                return S_OK;
+            }
+        }
+
+        delete[] pFileVersionBuffer;
+    }
+
+    return E_FAIL;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+// Name: MakeInt64()
+// Desc: Returns a ULARGE_INTEGER where a<<48|b<<32|c<<16|d<<0
+//-----------------------------------------------------------------------------
+ULARGE_INTEGER MakeInt64( WORD a, WORD b, WORD c, WORD d )
+{
+    ULARGE_INTEGER ull;
+    ull.HighPart = MAKELONG(b,a);
+    ull.LowPart = MAKELONG(d,c);
+    return ull;
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+// Name: CompareLargeInts()
+// Desc: Returns 1 if ullParam1 > ullParam2
+//       Returns 0 if ullParam1 = ullParam2
+//       Returns -1 if ullParam1 < ullParam2
+//-----------------------------------------------------------------------------
+int CompareLargeInts( ULARGE_INTEGER ullParam1, ULARGE_INTEGER ullParam2 )
+{
+    if( ullParam1.HighPart > ullParam2.HighPart )
+        return 1;
+    if( ullParam1.HighPart < ullParam2.HighPart )
+        return -1;
+
+    if( ullParam1.LowPart > ullParam2.LowPart )
+        return 1;
+    if( ullParam1.LowPart < ullParam2.LowPart )
+        return -1;
+
+    return 0;
+}
+
+       }//General
+}//FDK
\ No newline at end of file