From 3fb3c1eefed9ed239dc69e63aed36f9e012ab1d7 Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Mon, 16 Sep 2024 15:54:46 -0700
Subject: [PATCH 01/11] Refactor command-line tools to use shared header

---
 CMakeLists.txt                                |  13 +-
 Common/CmdLineHelpers.h                       | 356 +++++++
 {DDSView => Common}/directx.ico               | Bin
 {Texassemble => Common}/settings.manifest     |   0
 DDSView/DDSView.rc                            |   2 +-
 Texassemble/Texassemble_Desktop_2019.vcxproj  |  17 +-
 .../Texassemble_Desktop_2019.vcxproj.filters  |   5 +-
 .../Texassemble_Desktop_2019_Win10.vcxproj    |  23 +-
 ...ssemble_Desktop_2019_Win10.vcxproj.filters |   5 +-
 Texassemble/Texassemble_Desktop_2022.vcxproj  |  17 +-
 .../Texassemble_Desktop_2022.vcxproj.filters  |   5 +-
 .../Texassemble_Desktop_2022_Win10.vcxproj    |  23 +-
 ...ssemble_Desktop_2022_Win10.vcxproj.filters |   5 +-
 Texassemble/directx.ico                       | Bin 25214 -> 0 bytes
 Texassemble/texassemble.cpp                   | 352 +------
 Texassemble/texassemble.rc                    |   2 +-
 Texconv/Texconv.rc                            |   2 +-
 Texconv/Texconv_Desktop_2019.vcxproj          |  17 +-
 Texconv/Texconv_Desktop_2019.vcxproj.filters  |   5 +-
 Texconv/Texconv_Desktop_2019_Win10.vcxproj    |  23 +-
 ...Texconv_Desktop_2019_Win10.vcxproj.filters |   5 +-
 Texconv/Texconv_Desktop_2022.vcxproj          |  17 +-
 Texconv/Texconv_Desktop_2022.vcxproj.filters  |   5 +-
 Texconv/Texconv_Desktop_2022_Win10.vcxproj    |  23 +-
 ...Texconv_Desktop_2022_Win10.vcxproj.filters |   5 +-
 Texconv/directx.ico                           | Bin 25214 -> 0 bytes
 Texconv/settings.manifest                     |  21 -
 Texconv/texconv.cpp                           | 400 +-------
 Texdiag/directx.ico                           | Bin 25214 -> 0 bytes
 Texdiag/settings.manifest                     |  21 -
 Texdiag/texdiag.cpp                           | 958 ++++++------------
 Texdiag/texdiag.rc                            |   2 +-
 Texdiag/texdiag_Desktop_2019.vcxproj          |  17 +-
 Texdiag/texdiag_Desktop_2019.vcxproj.filters  |   5 +-
 Texdiag/texdiag_Desktop_2019_Win10.vcxproj    |  23 +-
 ...texdiag_Desktop_2019_Win10.vcxproj.filters |   5 +-
 Texdiag/texdiag_Desktop_2022.vcxproj          |  17 +-
 Texdiag/texdiag_Desktop_2022.vcxproj.filters  |   5 +-
 Texdiag/texdiag_Desktop_2022_Win10.vcxproj    |  23 +-
 ...texdiag_Desktop_2022_Win10.vcxproj.filters |   5 +-
 40 files changed, 956 insertions(+), 1473 deletions(-)
 create mode 100644 Common/CmdLineHelpers.h
 rename {DDSView => Common}/directx.ico (100%)
 rename {Texassemble => Common}/settings.manifest (100%)
 delete mode 100644 Texassemble/directx.ico
 delete mode 100644 Texconv/directx.ico
 delete mode 100644 Texconv/settings.manifest
 delete mode 100644 Texdiag/directx.ico
 delete mode 100644 Texdiag/settings.manifest

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 82091ef2..102b4861 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -404,8 +404,10 @@ if(BUILD_TOOLS AND WIN32)
   add_executable(texassemble
     Texassemble/texassemble.cpp
     Texassemble/texassemble.rc
-    Texassemble/settings.manifest
+    Common/CmdLineHelpers.h
+    Common/settings.manifest
     Texassemble/AnimatedGif.cpp)
+  target_include_directories(texassemble PRIVATE Common)
   target_compile_features(texassemble PRIVATE cxx_std_17)
   target_link_libraries(texassemble PRIVATE ${PROJECT_NAME} ole32.lib version.lib)
   source_group(texassemble REGULAR_EXPRESSION Texassemble/*.*)
@@ -416,9 +418,11 @@ if(BUILD_TOOLS AND BUILD_DX11 AND WIN32)
   add_executable(texconv
     Texconv/texconv.cpp
     Texconv/texconv.rc
-    Texconv/settings.manifest
+    Common/CmdLineHelpers.h
+    Common/settings.manifest
     Texconv/ExtendedBMP.cpp
     Texconv/PortablePixMap.cpp)
+  target_include_directories(texconv PRIVATE Common)
   target_compile_features(texconv PRIVATE cxx_std_17)
   target_link_libraries(texconv PRIVATE ${PROJECT_NAME} ole32.lib shell32.lib version.lib)
   source_group(texconv REGULAR_EXPRESSION Texconv/*.*)
@@ -429,7 +433,9 @@ if(BUILD_TOOLS AND WIN32)
   add_executable(texdiag
     Texdiag/texdiag.cpp
     Texdiag/texdiag.rc
-    Texdiag/settings.manifest)
+    Common/CmdLineHelpers.h
+    Common/settings.manifest)
+  target_include_directories(texdiag PRIVATE Common)
   target_compile_features(texdiag PRIVATE cxx_std_17)
   target_link_libraries(texdiag PRIVATE ${PROJECT_NAME} ole32.lib version.lib)
   source_group(texdiag REGULAR_EXPRESSION Texdiag/*.*)
@@ -497,6 +503,7 @@ if(BUILD_SAMPLE AND BUILD_DX11 AND WIN32)
   target_include_directories(ddsview PRIVATE ${COMPILED_DDSVIEW_SHADERS})
 
   if(NOT USE_PREBUILT_SHADERS)
+      #TODO: DIRECTX_FXC_TOOL
       add_custom_command(
             OUTPUT "${COMPILED_DDSVIEW_SHADERS}/ddsview_ps1D.inc"
             MAIN_DEPENDENCY "${PROJECT_SOURCE_DIR}/DDSView/hlsl.cmd"
diff --git a/Common/CmdLineHelpers.h b/Common/CmdLineHelpers.h
new file mode 100644
index 00000000..f81c3c78
--- /dev/null
+++ b/Common/CmdLineHelpers.h
@@ -0,0 +1,356 @@
+//--------------------------------------------------------------------------------------
+// File: CmdLineHelpers.h
+//
+// Command-line tool shared functions
+//
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+//--------------------------------------------------------------------------------------
+
+#pragma once
+
+#if __cplusplus < 201703L
+#error Requires C++17 (and /Zc:__cplusplus with MSVC)
+#endif
+
+namespace Helpers
+{
+    inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
+
+    struct find_closer { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) FindClose(h); } };
+
+    using ScopedFindHandle = std::unique_ptr<void, find_closer>;
+
+#ifdef _PREFAST_
+#pragma prefast(disable : 26018, "Only used with static internal arrays")
+#endif
+
+    struct SConversion
+    {
+        std::wstring szSrc;
+        std::wstring szFolder;
+    };
+
+    template<typename T>
+    struct SValue
+    {
+        const wchar_t*  name;
+        T               value;
+    };
+
+    template<typename T>
+    T LookupByName(const wchar_t *pName, const SValue<T> *pArray)
+    {
+        while (pArray->name)
+        {
+            if (!_wcsicmp(pName, pArray->name))
+                return pArray->value;
+
+            pArray++;
+        }
+
+        return static_cast<T>(0);
+    }
+
+    template<typename T>
+    const wchar_t* LookupByValue(T value, const SValue<T> *pArray)
+    {
+        while (pArray->name)
+        {
+            if (value == pArray->value)
+                return pArray->name;
+
+            pArray++;
+        }
+
+        return L"";
+    }
+
+    void PrintFormat(DXGI_FORMAT Format, const SValue<DXGI_FORMAT>* pFormatList)
+    {
+        for (auto pFormat = pFormatList; pFormat->name; pFormat++)
+        {
+            if (pFormat->value == Format)
+            {
+                wprintf(L"%ls", pFormat->name);
+                return;
+            }
+        }
+
+        wprintf(L"*UNKNOWN*");
+    }
+
+    void PrintFormat(DXGI_FORMAT Format, const SValue<DXGI_FORMAT>* pFormatList1, const SValue<DXGI_FORMAT>* pFormatList2)
+    {
+        for (auto pFormat = pFormatList1; pFormat->name; pFormat++)
+        {
+            if (pFormat->value == Format)
+            {
+                wprintf(L"%ls", pFormat->name);
+                return;
+            }
+        }
+
+        for (auto pFormat = pFormatList2; pFormat->name; pFormat++)
+        {
+            if (pFormat->value == Format)
+            {
+                wprintf(L"%ls", pFormat->name);
+                return;
+            }
+        }
+
+        wprintf(L"*UNKNOWN*");
+    }
+
+    template<typename T>
+    void PrintList(size_t cch, const SValue<T> *pValue)
+    {
+        while (pValue->name)
+        {
+            const size_t cchName = wcslen(pValue->name);
+
+            if (cch + cchName + 2 >= 80)
+            {
+                wprintf(L"\n      ");
+                cch = 6;
+            }
+
+            wprintf(L"%ls ", pValue->name);
+            cch += cchName + 2;
+            pValue++;
+        }
+
+        wprintf(L"\n");
+    }
+
+    void PrintLogo(bool versionOnly, _In_z_ const wchar_t* name, _In_z_ const wchar_t* desc)
+    {
+        wchar_t version[32] = {};
+
+        wchar_t appName[_MAX_PATH] = {};
+        if (GetModuleFileNameW(nullptr, appName, _MAX_PATH))
+        {
+            const DWORD size = GetFileVersionInfoSizeW(appName, nullptr);
+            if (size > 0)
+            {
+                auto verInfo = std::make_unique<uint8_t[]>(size);
+                if (GetFileVersionInfoW(appName, 0, size, verInfo.get()))
+                {
+                    LPVOID lpstr = nullptr;
+                    UINT strLen = 0;
+                    if (VerQueryValueW(verInfo.get(), L"\\StringFileInfo\\040904B0\\ProductVersion", &lpstr, &strLen))
+                    {
+                        wcsncpy_s(version, reinterpret_cast<const wchar_t*>(lpstr), strLen);
+                    }
+                }
+            }
+        }
+
+        if (!*version || wcscmp(version, L"1.0.0.0") == 0)
+        {
+            swprintf_s(version, L"%03d (library)", DIRECTX_TEX_VERSION);
+        }
+
+        if (versionOnly)
+        {
+            wprintf(L"%ls version %ls\n", name, version);
+        }
+        else
+        {
+            wprintf(L"%ls Version %ls\n", desc, version);
+            wprintf(L"Copyright (C) Microsoft Corp.\n");
+        #ifdef _DEBUG
+            wprintf(L"*** Debug build ***\n");
+        #endif
+            wprintf(L"\n");
+        }
+    }
+
+    void SearchForFiles(const std::filesystem::path& path, std::list<SConversion>& files, bool recursive, const wchar_t* folder)
+    {
+        // Process files
+        WIN32_FIND_DATAW findData = {};
+        ScopedFindHandle hFile(safe_handle(FindFirstFileExW(path.c_str(),
+            FindExInfoBasic, &findData,
+            FindExSearchNameMatch, nullptr,
+            FIND_FIRST_EX_LARGE_FETCH)));
+        if (hFile)
+        {
+            for (;;)
+            {
+                if (!(findData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY)))
+                {
+                    SConversion conv = {};
+                    conv.szSrc = path.parent_path().append(findData.cFileName).native();
+                    if (folder)
+                    {
+                        conv.szFolder = folder;
+                    }
+                    files.push_back(conv);
+                }
+
+                if (!FindNextFileW(hFile.get(), &findData))
+                    break;
+            }
+        }
+
+        // Process directories
+        if (recursive)
+        {
+            auto searchDir = path.parent_path().append(L"*");
+
+            hFile.reset(safe_handle(FindFirstFileExW(searchDir.c_str(),
+                FindExInfoBasic, &findData,
+                FindExSearchLimitToDirectories, nullptr,
+                FIND_FIRST_EX_LARGE_FETCH)));
+            if (!hFile)
+                return;
+
+            for (;;)
+            {
+                if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+                {
+                    if (findData.cFileName[0] != L'.')
+                    {
+                        auto subfolder = (folder)
+                            ? (std::wstring(folder) + std::wstring(findData.cFileName) + std::filesystem::path::preferred_separator)
+                            : (std::wstring(findData.cFileName) + std::filesystem::path::preferred_separator);
+
+                        auto subdir = path.parent_path().append(findData.cFileName).append(path.filename().c_str());
+
+                        SearchForFiles(subdir, files, recursive, subfolder.c_str());
+                    }
+                }
+
+                if (!FindNextFileW(hFile.get(), &findData))
+                    break;
+            }
+        }
+    }
+
+    void ProcessFileList(std::wifstream& inFile, std::list<SConversion>& files)
+    {
+        std::list<SConversion> flist;
+        std::set<std::wstring> excludes;
+
+        for (;;)
+        {
+            std::wstring fname;
+            std::getline(inFile, fname);
+            if (!inFile)
+                break;
+
+            if (fname[0] == L'#')
+            {
+                // Comment
+            }
+            else if (fname[0] == L'-')
+            {
+                if (flist.empty())
+                {
+                    wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname.c_str());
+                }
+                else
+                {
+                    std::filesystem::path path(fname.c_str() + 1);
+                    auto& npath = path.make_preferred();
+                    if (wcspbrk(fname.c_str(), L"?*") != nullptr)
+                    {
+                        std::list<SConversion> removeFiles;
+                        SearchForFiles(npath, removeFiles, false, nullptr);
+
+                        for (auto& it : removeFiles)
+                        {
+                            std::wstring name = it.szSrc;
+                            std::transform(name.begin(), name.end(), name.begin(), towlower);
+                            excludes.insert(name);
+                        }
+                    }
+                    else
+                    {
+                        std::wstring name = npath.c_str();
+                        std::transform(name.begin(), name.end(), name.begin(), towlower);
+                        excludes.insert(name);
+                    }
+                }
+            }
+            else if (wcspbrk(fname.c_str(), L"?*") != nullptr)
+            {
+                std::filesystem::path path(fname.c_str());
+                SearchForFiles(path.make_preferred(), flist, false, nullptr);
+            }
+            else
+            {
+                SConversion conv = {};
+                std::filesystem::path path(fname.c_str());
+                conv.szSrc = path.make_preferred().native();
+                flist.push_back(conv);
+            }
+        }
+
+        inFile.close();
+
+        if (!excludes.empty())
+        {
+            // Remove any excluded files
+            for (auto it = flist.begin(); it != flist.end();)
+            {
+                std::wstring name = it->szSrc;
+                std::transform(name.begin(), name.end(), name.begin(), towlower);
+                auto item = it;
+                ++it;
+                if (excludes.find(name) != excludes.end())
+                {
+                    flist.erase(item);
+                }
+            }
+        }
+
+        if (flist.empty())
+        {
+            wprintf(L"WARNING: No file names found in -flist\n");
+        }
+        else
+        {
+            files.splice(files.end(), flist);
+        }
+    }
+
+    const wchar_t* GetErrorDesc(HRESULT hr)
+    {
+        static wchar_t desc[1024] = {};
+
+        LPWSTR errorText = nullptr;
+
+        const DWORD result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+            nullptr, static_cast<DWORD>(hr),
+            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPWSTR>(&errorText), 0, nullptr);
+
+        *desc = 0;
+
+        if (result > 0 && errorText)
+        {
+            swprintf_s(desc, L": %ls", errorText);
+
+            size_t len = wcslen(desc);
+            if (len >= 1)
+            {
+                desc[len - 1] = 0;
+            }
+
+            if (errorText)
+                LocalFree(errorText);
+
+            for (wchar_t* ptr = desc; *ptr != 0; ++ptr)
+            {
+                if (*ptr == L'\r' || *ptr == L'\n')
+                {
+                    *ptr = L' ';
+                }
+            }
+        }
+
+        return desc;
+    }
+}
\ No newline at end of file
diff --git a/DDSView/directx.ico b/Common/directx.ico
similarity index 100%
rename from DDSView/directx.ico
rename to Common/directx.ico
diff --git a/Texassemble/settings.manifest b/Common/settings.manifest
similarity index 100%
rename from Texassemble/settings.manifest
rename to Common/settings.manifest
diff --git a/DDSView/DDSView.rc b/DDSView/DDSView.rc
index 49efb346..c1986b18 100644
--- a/DDSView/DDSView.rc
+++ b/DDSView/DDSView.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_MAIN_ICON           ICON                    "directx.ico"
+IDI_MAIN_ICON           ICON                    "..\Common\directx.ico"
 
 #ifdef APSTUDIO_INVOKED
 /////////////////////////////////////////////////////////////////////////////
diff --git a/Texassemble/Texassemble_Desktop_2019.vcxproj b/Texassemble/Texassemble_Desktop_2019.vcxproj
index 7b6a3228..bfb1435d 100644
--- a/Texassemble/Texassemble_Desktop_2019.vcxproj
+++ b/Texassemble/Texassemble_Desktop_2019.vcxproj
@@ -134,7 +134,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -159,7 +159,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -183,7 +183,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -210,7 +210,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -237,7 +237,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -264,7 +264,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -298,7 +298,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texassemble/Texassemble_Desktop_2019.vcxproj.filters b/Texassemble/Texassemble_Desktop_2019.vcxproj.filters
index 1dc8bda3..b06f1951 100644
--- a/Texassemble/Texassemble_Desktop_2019.vcxproj.filters
+++ b/Texassemble/Texassemble_Desktop_2019.vcxproj.filters
@@ -16,8 +16,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texassemble/Texassemble_Desktop_2019_Win10.vcxproj b/Texassemble/Texassemble_Desktop_2019_Win10.vcxproj
index db3158ed..e3000243 100644
--- a/Texassemble/Texassemble_Desktop_2019_Win10.vcxproj
+++ b/Texassemble/Texassemble_Desktop_2019_Win10.vcxproj
@@ -191,7 +191,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -216,7 +216,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -240,7 +240,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -263,7 +263,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -290,7 +290,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -316,7 +316,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -342,7 +342,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -369,7 +369,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -395,7 +395,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -428,7 +428,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texassemble/Texassemble_Desktop_2019_Win10.vcxproj.filters b/Texassemble/Texassemble_Desktop_2019_Win10.vcxproj.filters
index 1dc8bda3..b06f1951 100644
--- a/Texassemble/Texassemble_Desktop_2019_Win10.vcxproj.filters
+++ b/Texassemble/Texassemble_Desktop_2019_Win10.vcxproj.filters
@@ -16,8 +16,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texassemble/Texassemble_Desktop_2022.vcxproj b/Texassemble/Texassemble_Desktop_2022.vcxproj
index 4f576ca9..1da5d713 100644
--- a/Texassemble/Texassemble_Desktop_2022.vcxproj
+++ b/Texassemble/Texassemble_Desktop_2022.vcxproj
@@ -134,7 +134,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -159,7 +159,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -183,7 +183,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -210,7 +210,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -237,7 +237,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -264,7 +264,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -298,7 +298,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texassemble/Texassemble_Desktop_2022.vcxproj.filters b/Texassemble/Texassemble_Desktop_2022.vcxproj.filters
index 1dc8bda3..b06f1951 100644
--- a/Texassemble/Texassemble_Desktop_2022.vcxproj.filters
+++ b/Texassemble/Texassemble_Desktop_2022.vcxproj.filters
@@ -16,8 +16,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texassemble/Texassemble_Desktop_2022_Win10.vcxproj b/Texassemble/Texassemble_Desktop_2022_Win10.vcxproj
index ac95131c..bf8a75b5 100644
--- a/Texassemble/Texassemble_Desktop_2022_Win10.vcxproj
+++ b/Texassemble/Texassemble_Desktop_2022_Win10.vcxproj
@@ -191,7 +191,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -216,7 +216,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -240,7 +240,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -263,7 +263,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -290,7 +290,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -316,7 +316,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -342,7 +342,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -369,7 +369,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -395,7 +395,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -428,7 +428,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texassemble/Texassemble_Desktop_2022_Win10.vcxproj.filters b/Texassemble/Texassemble_Desktop_2022_Win10.vcxproj.filters
index 1dc8bda3..b06f1951 100644
--- a/Texassemble/Texassemble_Desktop_2022_Win10.vcxproj.filters
+++ b/Texassemble/Texassemble_Desktop_2022_Win10.vcxproj.filters
@@ -16,8 +16,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texassemble/directx.ico b/Texassemble/directx.ico
deleted file mode 100644
index bc43c1b2085df668dffff26d80adcb0ef73f23a9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 25214
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
R57E|HlAXKCS=U$O{{if+y9)pS

diff --git a/Texassemble/texassemble.cpp b/Texassemble/texassemble.cpp
index d3cf3f21..82b7b470 100644
--- a/Texassemble/texassemble.cpp
+++ b/Texassemble/texassemble.cpp
@@ -76,11 +76,17 @@
 #include "DirectXTexPNG.h"
 #endif
 
+#include "CmdLineHelpers.h"
+
+using namespace Helpers;
 using namespace DirectX;
 using Microsoft::WRL::ComPtr;
 
 namespace
 {
+    const wchar_t* g_ToolName = L"texassemble";
+    const wchar_t* g_Description = L"Microsoft (R) DirectX Texture Assembler [DirectXTex]";
+
     enum COMMANDS : uint32_t
     {
         CMD_CUBE = 1,
@@ -137,22 +143,11 @@ namespace
 
     static_assert(OPT_MAX <= 32, "dwOptions is a unsigned int bitfield");
 
-    struct SConversion
-    {
-        std::wstring szSrc;
-    };
-
-    struct SValue
-    {
-        const wchar_t*  name;
-        uint32_t        value;
-    };
-
     //////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////
 
-    const SValue g_pCommands[] =
+    const SValue<uint32_t> g_pCommands[] =
     {
         { L"cube",              CMD_CUBE },
         { L"volume",            CMD_VOLUME },
@@ -177,7 +172,7 @@ namespace
         { nullptr,          0 }
     };
 
-    const SValue g_pOptions[] =
+    const SValue<uint32_t> g_pOptions[] =
     {
         { L"r",         OPT_RECURSIVE },
         { L"flist",     OPT_FILELIST },
@@ -206,9 +201,9 @@ namespace
         { nullptr,      0 }
     };
 
-#define DEFFMT(fmt) { L## #fmt, DXGI_FORMAT_ ## fmt }
+    #define DEFFMT(fmt) { L## #fmt, DXGI_FORMAT_ ## fmt }
 
-    const SValue g_pFormats[] =
+    const SValue<DXGI_FORMAT> g_pFormats[] =
     {
         // List does not include _TYPELESS or depth/stencil formats
         DEFFMT(R32G32B32A32_FLOAT),
@@ -285,7 +280,7 @@ namespace
         { nullptr, DXGI_FORMAT_UNKNOWN }
     };
 
-    const SValue g_pFormatAliases[] =
+    const SValue<DXGI_FORMAT> g_pFormatAliases[] =
     {
         { L"RGBA", DXGI_FORMAT_R8G8B8A8_UNORM },
         { L"BGRA", DXGI_FORMAT_B8G8R8A8_UNORM },
@@ -297,7 +292,7 @@ namespace
         { nullptr, DXGI_FORMAT_UNKNOWN }
     };
 
-    const SValue g_pFilters[] =
+    const SValue<uint32_t> g_pFilters[] =
     {
         { L"POINT",                     TEX_FILTER_POINT },
         { L"LINEAR",                    TEX_FILTER_LINEAR },
@@ -320,21 +315,21 @@ namespace
         { nullptr,                      TEX_FILTER_DEFAULT                              }
     };
 
-#define CODEC_DDS 0xFFFF0001
-#define CODEC_TGA 0xFFFF0002
-#define CODEC_HDR 0xFFFF0005
+    #define CODEC_DDS 0xFFFF0001
+    #define CODEC_TGA 0xFFFF0002
+    #define CODEC_HDR 0xFFFF0005
 
-#ifdef USE_OPENEXR
-#define CODEC_EXR 0xFFFF0006
-#endif
-#ifdef USE_LIBJPEG
-#define CODEC_JPEG 0xFFFF0007
-#endif
-#ifdef USE_LIBPNG
-#define CODEC_PNG 0xFFFF0008
-#endif
+    #ifdef USE_OPENEXR
+    #define CODEC_EXR 0xFFFF0006
+    #endif
+    #ifdef USE_LIBJPEG
+    #define CODEC_JPEG 0xFFFF0007
+    #endif
+    #ifdef USE_LIBPNG
+    #define CODEC_PNG 0xFFFF0008
+    #endif
 
-    const SValue g_pExtFileTypes[] =
+    const SValue<uint32_t> g_pExtFileTypes[] =
     {
         { L".BMP",  WIC_CODEC_BMP  },
     #ifdef USE_LIBJPEG
@@ -363,7 +358,7 @@ namespace
         { nullptr,  CODEC_DDS      }
     };
 
-    const SValue g_pFeatureLevels[] =   // valid feature levels for -fl for maximimum size
+    const SValue<uint32_t> g_pFeatureLevels[] =   // valid feature levels for -fl for maximimum size
     {
         { L"9.1",  2048 },
         { L"9.2",  2048 },
@@ -378,7 +373,7 @@ namespace
         { nullptr, 0 },
     };
 
-    const SValue g_pFeatureLevelsCube[] = // valid feature levels for -fl for maximum cubemap size
+    const SValue<uint32_t> g_pFeatureLevelsCube[] = // valid feature levels for -fl for maximum cubemap size
     {
         { L"9.1",  512 },
         { L"9.2",  512 },
@@ -393,7 +388,7 @@ namespace
         { nullptr, 0 },
     };
 
-    const SValue g_pFeatureLevelsArray[] = // valid feature levels for -fl for maximum array size
+    const SValue<uint32_t> g_pFeatureLevelsArray[] = // valid feature levels for -fl for maximum array size
     {
         { L"9.1",  1 },
         { L"9.2",  1 },
@@ -408,7 +403,7 @@ namespace
         { nullptr, 0 },
     };
 
-    const SValue g_pFeatureLevelsVolume[] = // valid feature levels for -fl for maximum depth size
+    const SValue<uint32_t> g_pFeatureLevelsVolume[] = // valid feature levels for -fl for maximum depth size
     {
         { L"9.1",  256 },
         { L"9.2",  256 },
@@ -438,183 +433,6 @@ HRESULT LoadAnimatedGif(const wchar_t* szFile,
 
 namespace
 {
-    inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
-
-    struct find_closer { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) FindClose(h); } };
-
-    using ScopedFindHandle = std::unique_ptr<void, find_closer>;
-
-#ifdef _PREFAST_
-#pragma prefast(disable : 26018, "Only used with static internal arrays")
-#endif
-
-    uint32_t LookupByName(const wchar_t *pName, const SValue *pArray)
-    {
-        while (pArray->name)
-        {
-            if (!_wcsicmp(pName, pArray->name))
-                return pArray->value;
-
-            pArray++;
-        }
-
-        return 0;
-    }
-
-    void SearchForFiles(const std::filesystem::path& path, std::list<SConversion>& files, bool recursive)
-    {
-        // Process files
-        WIN32_FIND_DATAW findData = {};
-        ScopedFindHandle hFile(safe_handle(FindFirstFileExW(path.c_str(),
-            FindExInfoBasic, &findData,
-            FindExSearchNameMatch, nullptr,
-            FIND_FIRST_EX_LARGE_FETCH)));
-        if (hFile)
-        {
-            for (;;)
-            {
-                if (!(findData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY)))
-                {
-                    SConversion conv = {};
-                    conv.szSrc = path.parent_path().append(findData.cFileName).native();
-                    files.push_back(conv);
-                }
-
-                if (!FindNextFileW(hFile.get(), &findData))
-                    break;
-            }
-        }
-
-        // Process directories
-        if (recursive)
-        {
-            auto searchDir = path.parent_path().append(L"*");
-
-            hFile.reset(safe_handle(FindFirstFileExW(searchDir.c_str(),
-                FindExInfoBasic, &findData,
-                FindExSearchLimitToDirectories, nullptr,
-                FIND_FIRST_EX_LARGE_FETCH)));
-            if (!hFile)
-                return;
-
-            for (;;)
-            {
-                if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-                {
-                    if (findData.cFileName[0] != L'.')
-                    {
-                        auto subdir = path.parent_path().append(findData.cFileName).append(path.filename().c_str());
-
-                        SearchForFiles(subdir, files, recursive);
-                    }
-                }
-
-                if (!FindNextFileW(hFile.get(), &findData))
-                    break;
-            }
-        }
-    }
-
-    void ProcessFileList(std::wifstream& inFile, std::list<SConversion>& files)
-    {
-        std::list<SConversion> flist;
-        std::set<std::wstring> excludes;
-
-        for (;;)
-        {
-            std::wstring fname;
-            std::getline(inFile, fname);
-            if (!inFile)
-                break;
-
-            if (fname[0] == L'#')
-            {
-                // Comment
-            }
-            else if (fname[0] == L'-')
-            {
-                if (flist.empty())
-                {
-                    wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname.c_str());
-                }
-                else
-                {
-                    std::filesystem::path path(fname.c_str() + 1);
-                    auto& npath = path.make_preferred();
-                    if (wcspbrk(fname.c_str(), L"?*") != nullptr)
-                    {
-                        std::list<SConversion> removeFiles;
-                        SearchForFiles(npath, removeFiles, false);
-
-                        for (auto& it : removeFiles)
-                        {
-                            std::wstring name = it.szSrc;
-                            std::transform(name.begin(), name.end(), name.begin(), towlower);
-                            excludes.insert(name);
-                        }
-                    }
-                    else
-                    {
-                        std::wstring name = npath.c_str();
-                        std::transform(name.begin(), name.end(), name.begin(), towlower);
-                        excludes.insert(name);
-                    }
-                }
-            }
-            else if (wcspbrk(fname.c_str(), L"?*") != nullptr)
-            {
-                std::filesystem::path path(fname.c_str());
-                SearchForFiles(path.make_preferred(), flist, false);
-            }
-            else
-            {
-                SConversion conv = {};
-                std::filesystem::path path(fname.c_str());
-                conv.szSrc = path.make_preferred().native();
-                flist.push_back(conv);
-            }
-        }
-
-        inFile.close();
-
-        if (!excludes.empty())
-        {
-            // Remove any excluded files
-            for (auto it = flist.begin(); it != flist.end();)
-            {
-                std::wstring name = it->szSrc;
-                std::transform(name.begin(), name.end(), name.begin(), towlower);
-                auto item = it;
-                ++it;
-                if (excludes.find(name) != excludes.end())
-                {
-                    flist.erase(item);
-                }
-            }
-        }
-
-        if (flist.empty())
-        {
-            wprintf(L"WARNING: No file names found in -flist\n");
-        }
-        else
-        {
-            files.splice(files.end(), flist);
-        }
-    }
-
-    void PrintFormat(DXGI_FORMAT Format)
-    {
-        for (auto pFormat = g_pFormats; pFormat->name; pFormat++)
-        {
-            if (static_cast<DXGI_FORMAT>(pFormat->value) == Format)
-            {
-                wprintf(L"%ls", pFormat->name);
-                break;
-            }
-        }
-    }
-
     void PrintInfo(const TexMetadata& info)
     {
         wprintf(L" (%zux%zu", info.width, info.height);
@@ -629,7 +447,7 @@ namespace
             wprintf(L",%zu", info.arraySize);
 
         wprintf(L" ");
-        PrintFormat(info.format);
+        PrintFormat(info.format, g_pFormats);
 
         switch (info.dimension)
         {
@@ -674,109 +492,9 @@ namespace
         wprintf(L")");
     }
 
-    void PrintList(size_t cch, const SValue *pValue)
-    {
-        while (pValue->name)
-        {
-            const size_t cchName = wcslen(pValue->name);
-
-            if (cch + cchName + 2 >= 80)
-            {
-                wprintf(L"\n      ");
-                cch = 6;
-            }
-
-            wprintf(L"%ls ", pValue->name);
-            cch += cchName + 2;
-            pValue++;
-        }
-
-        wprintf(L"\n");
-    }
-
-    void PrintLogo(bool versionOnly)
-    {
-        wchar_t version[32] = {};
-
-        wchar_t appName[_MAX_PATH] = {};
-        if (GetModuleFileNameW(nullptr, appName, _MAX_PATH))
-        {
-            const DWORD size = GetFileVersionInfoSizeW(appName, nullptr);
-            if (size > 0)
-            {
-                auto verInfo = std::make_unique<uint8_t[]>(size);
-                if (GetFileVersionInfoW(appName, 0, size, verInfo.get()))
-                {
-                    LPVOID lpstr = nullptr;
-                    UINT strLen = 0;
-                    if (VerQueryValueW(verInfo.get(), L"\\StringFileInfo\\040904B0\\ProductVersion", &lpstr, &strLen))
-                    {
-                        wcsncpy_s(version, reinterpret_cast<const wchar_t*>(lpstr), strLen);
-                    }
-                }
-            }
-        }
-
-        if (!*version || wcscmp(version, L"1.0.0.0") == 0)
-        {
-            swprintf_s(version, L"%03d (library)", DIRECTX_TEX_VERSION);
-        }
-
-        if (versionOnly)
-        {
-            wprintf(L"texassemble version %ls\n", version);
-        }
-        else
-        {
-            wprintf(L"Microsoft (R) DirectX Texture Assembler [DirectXTex] Version %ls\n", version);
-            wprintf(L"Copyright (C) Microsoft Corp.\n");
-        #ifdef _DEBUG
-            wprintf(L"*** Debug build ***\n");
-        #endif
-            wprintf(L"\n");
-        }
-    }
-
-    const wchar_t* GetErrorDesc(HRESULT hr)
-    {
-        static wchar_t desc[1024] = {};
-
-        LPWSTR errorText = nullptr;
-
-        const DWORD result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
-            nullptr, static_cast<DWORD>(hr),
-            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPWSTR>(&errorText), 0, nullptr);
-
-        *desc = 0;
-
-        if (result > 0 && errorText)
-        {
-            swprintf_s(desc, L": %ls", errorText);
-
-            size_t len = wcslen(desc);
-            if (len >= 1)
-            {
-                desc[len - 1] = 0;
-            }
-
-            if (errorText)
-                LocalFree(errorText);
-
-            for (wchar_t* ptr = desc; *ptr != 0; ++ptr)
-            {
-                if (*ptr == L'\r' || *ptr == L'\n')
-                {
-                    *ptr = L' ';
-                }
-            }
-        }
-
-        return desc;
-    }
-
     void PrintUsage()
     {
-        PrintLogo(false);
+        PrintLogo(false, g_ToolName, g_Description);
 
         static const wchar_t* const s_usage =
             L"Usage: texassemble <command> <options> [--] <files>\n"
@@ -1059,7 +777,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
     {
         if (!_wcsicmp(argv[1], L"--version"))
         {
-            PrintLogo(true);
+            PrintLogo(true, g_ToolName, g_Description);
             return 0;
         }
         else if (!_wcsicmp(argv[1], L"--help"))
@@ -1118,7 +836,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
             }
             else if (!_wcsicmp(pArg, L"--version"))
             {
-                PrintLogo(true);
+                PrintLogo(true, g_ToolName, g_Description);
                 return 0;
             }
             else if (!_wcsicmp(pArg, L"--help"))
@@ -1372,7 +1090,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
         {
             const size_t count = conversion.size();
             std::filesystem::path path(pArg);
-            SearchForFiles(path.make_preferred(), conversion, (dwOptions & (1 << OPT_RECURSIVE)) != 0);
+            SearchForFiles(path.make_preferred(), conversion, (dwOptions & (1 << OPT_RECURSIVE)) != 0, nullptr);
             if (conversion.size() <= count)
             {
                 wprintf(L"No matching files found for %ls\n", pArg);
@@ -1395,7 +1113,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
     }
 
     if (~dwOptions & (1 << OPT_NOLOGO))
-        PrintLogo(false);
+        PrintLogo(false, g_ToolName, g_Description);
 
     switch (dwCommand)
     {
diff --git a/Texassemble/texassemble.rc b/Texassemble/texassemble.rc
index 4000de9d..48cca03a 100644
--- a/Texassemble/texassemble.rc
+++ b/Texassemble/texassemble.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_MAIN_ICON           ICON                    "directx.ico"
+IDI_MAIN_ICON           ICON                    "..\Common\directx.ico"
 
 
 #ifdef APSTUDIO_INVOKED
diff --git a/Texconv/Texconv.rc b/Texconv/Texconv.rc
index e030300b..98116cf0 100644
--- a/Texconv/Texconv.rc
+++ b/Texconv/Texconv.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_MAIN_ICON           ICON                    "directx.ico"
+IDI_MAIN_ICON           ICON                    "..\Common\directx.ico"
 
 
 #ifdef APSTUDIO_INVOKED
diff --git a/Texconv/Texconv_Desktop_2019.vcxproj b/Texconv/Texconv_Desktop_2019.vcxproj
index 40df01bc..2bd5c9b7 100644
--- a/Texconv/Texconv_Desktop_2019.vcxproj
+++ b/Texconv/Texconv_Desktop_2019.vcxproj
@@ -135,7 +135,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -161,7 +161,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -186,7 +186,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -214,7 +214,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -242,7 +242,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -270,7 +270,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -305,7 +305,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texconv/Texconv_Desktop_2019.vcxproj.filters b/Texconv/Texconv_Desktop_2019.vcxproj.filters
index b665e63f..b463e031 100644
--- a/Texconv/Texconv_Desktop_2019.vcxproj.filters
+++ b/Texconv/Texconv_Desktop_2019.vcxproj.filters
@@ -17,8 +17,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texconv/Texconv_Desktop_2019_Win10.vcxproj b/Texconv/Texconv_Desktop_2019_Win10.vcxproj
index d4697168..a7c1ab9e 100644
--- a/Texconv/Texconv_Desktop_2019_Win10.vcxproj
+++ b/Texconv/Texconv_Desktop_2019_Win10.vcxproj
@@ -192,7 +192,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -218,7 +218,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -243,7 +243,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -267,7 +267,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -295,7 +295,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -322,7 +322,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -349,7 +349,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -377,7 +377,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -404,7 +404,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus /ZH:SHA_256 %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -438,7 +438,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texconv/Texconv_Desktop_2019_Win10.vcxproj.filters b/Texconv/Texconv_Desktop_2019_Win10.vcxproj.filters
index b665e63f..b463e031 100644
--- a/Texconv/Texconv_Desktop_2019_Win10.vcxproj.filters
+++ b/Texconv/Texconv_Desktop_2019_Win10.vcxproj.filters
@@ -17,8 +17,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texconv/Texconv_Desktop_2022.vcxproj b/Texconv/Texconv_Desktop_2022.vcxproj
index a37a6d4f..e16024ee 100644
--- a/Texconv/Texconv_Desktop_2022.vcxproj
+++ b/Texconv/Texconv_Desktop_2022.vcxproj
@@ -135,7 +135,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -161,7 +161,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -186,7 +186,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -214,7 +214,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -242,7 +242,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -270,7 +270,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -305,7 +305,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texconv/Texconv_Desktop_2022.vcxproj.filters b/Texconv/Texconv_Desktop_2022.vcxproj.filters
index b665e63f..b463e031 100644
--- a/Texconv/Texconv_Desktop_2022.vcxproj.filters
+++ b/Texconv/Texconv_Desktop_2022.vcxproj.filters
@@ -17,8 +17,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texconv/Texconv_Desktop_2022_Win10.vcxproj b/Texconv/Texconv_Desktop_2022_Win10.vcxproj
index 24e5c889..a661212c 100644
--- a/Texconv/Texconv_Desktop_2022_Win10.vcxproj
+++ b/Texconv/Texconv_Desktop_2022_Win10.vcxproj
@@ -192,7 +192,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -218,7 +218,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -243,7 +243,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -267,7 +267,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -295,7 +295,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -322,7 +322,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
@@ -349,7 +349,7 @@
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -377,7 +377,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -404,7 +404,7 @@
       <Optimization>MaxSpeed</Optimization>
       <OpenMPSupport>true</OpenMPSupport>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
@@ -438,7 +438,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texconv/Texconv_Desktop_2022_Win10.vcxproj.filters b/Texconv/Texconv_Desktop_2022_Win10.vcxproj.filters
index b665e63f..b463e031 100644
--- a/Texconv/Texconv_Desktop_2022_Win10.vcxproj.filters
+++ b/Texconv/Texconv_Desktop_2022_Win10.vcxproj.filters
@@ -17,8 +17,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texconv/directx.ico b/Texconv/directx.ico
deleted file mode 100644
index bc43c1b2085df668dffff26d80adcb0ef73f23a9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 25214
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
R57E|HlAXKCS=U$O{{if+y9)pS

diff --git a/Texconv/settings.manifest b/Texconv/settings.manifest
deleted file mode 100644
index 544e45d4..00000000
--- a/Texconv/settings.manifest
+++ /dev/null
@@ -1,21 +0,0 @@
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
-    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
-        <application>
-            <!-- Windows Vista -->
-            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
-            <!-- Windows 7 -->
-            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
-            <!-- Windows 8 -->
-            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
-            <!-- Windows 8.1 -->
-            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
-            <!-- Windows 10 / Windows 11 -->
-            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
-        </application>
-    </compatibility>
-    <asmv3:application>
-        <asmv3:windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
-            <ws2:longPathAware>true</ws2:longPathAware>
-        </asmv3:windowsSettings>
-    </asmv3:application>
-</assembly>
diff --git a/Texconv/texconv.cpp b/Texconv/texconv.cpp
index c8962347..784d6f62 100644
--- a/Texconv/texconv.cpp
+++ b/Texconv/texconv.cpp
@@ -82,12 +82,24 @@
 #include "DirectXTexXbox.h"
 #endif
 
+#include "CmdLineHelpers.h"
+
+using namespace Helpers;
 using namespace DirectX;
 using namespace DirectX::PackedVector;
 using Microsoft::WRL::ComPtr;
 
 namespace
 {
+    const wchar_t* g_ToolName = L"texconv";
+#if defined(USE_XBOX_EXTS) && defined(_USE_SCARLETT)
+    const wchar_t* g_Description = L"Microsoft (R) DirectX Texture Converter for Microsoft GDKX for Xbox Series X|S";
+#elif defined(USE_XBOX_EXTS)
+    const wchar_t* g_Description = L"Microsoft (R) DirectX Texture Converter for Microsoft GDKX for Xbox One";
+#else
+    const wchar_t* g_Description = L"Microsoft (R) DirectX Texture Converter [DirectXTex]";
+#endif
+
     enum OPTIONS : uint64_t
     {
         OPT_RECURSIVE = 1,
@@ -177,19 +189,6 @@ namespace
 
     static_assert(OPT_MAX <= 64, "dwOptions is a unsigned int bitfield");
 
-    struct SConversion
-    {
-        std::wstring szSrc;
-        std::wstring szFolder;
-    };
-
-    template<typename T>
-    struct SValue
-    {
-        const wchar_t*  name;
-        T               value;
-    };
-
     const SValue<uint64_t> g_pOptions[] =
     {
         { L"r",             OPT_RECURSIVE },
@@ -259,9 +258,9 @@ namespace
         { nullptr,          0 }
     };
 
-#define DEFFMT(fmt) { L## #fmt, DXGI_FORMAT_ ## fmt }
+    #define DEFFMT(fmt) { L## #fmt, DXGI_FORMAT_ ## fmt }
 
-    const SValue<uint32_t> g_pFormats[] =
+    const SValue<DXGI_FORMAT> g_pFormats[] =
     {
         // List does not include _TYPELESS or depth/stencil formats
         DEFFMT(R32G32B32A32_FLOAT),
@@ -389,7 +388,7 @@ namespace
         { nullptr, 0 }
     };
 
-    const SValue<uint32_t> g_pReadOnlyFormats[] =
+    const SValue<DXGI_FORMAT> g_pReadOnlyFormats[] =
     {
         DEFFMT(R32G32B32A32_TYPELESS),
         DEFFMT(R32G32B32_TYPELESS),
@@ -481,39 +480,39 @@ namespace
         { nullptr, 0 },
     };
 
-#define CODEC_DDS 0xFFFF0001
-#define CODEC_TGA 0xFFFF0002
-#define CODEC_HDP 0xFFFF0003
-#define CODEC_JXR 0xFFFF0004
-#define CODEC_HDR 0xFFFF0005
-#define CODEC_PPM 0xFFFF0006
-#define CODEC_PFM 0xFFFF0007
+    #define CODEC_DDS 0xFFFF0001
+    #define CODEC_TGA 0xFFFF0002
+    #define CODEC_HDP 0xFFFF0003
+    #define CODEC_JXR 0xFFFF0004
+    #define CODEC_HDR 0xFFFF0005
+    #define CODEC_PPM 0xFFFF0006
+    #define CODEC_PFM 0xFFFF0007
 
-#ifdef USE_OPENEXR
-#define CODEC_EXR 0xFFFF0008
-#endif
-#ifdef USE_LIBJPEG
-#define CODEC_JPEG 0xFFFF0009
-#endif
-#ifdef USE_LIBPNG
-#define CODEC_PNG 0xFFFF000A
-#endif
+    #ifdef USE_OPENEXR
+    #define CODEC_EXR 0xFFFF0008
+    #endif
+    #ifdef USE_LIBJPEG
+    #define CODEC_JPEG 0xFFFF0009
+    #endif
+    #ifdef USE_LIBPNG
+    #define CODEC_PNG 0xFFFF000A
+    #endif
 
     const SValue<uint32_t> g_pSaveFileTypes[] =   // valid formats to write to
     {
         { L"bmp",   WIC_CODEC_BMP  },
-#ifdef USE_LIBJPEG
+    #ifdef USE_LIBJPEG
         { L"jpg",   CODEC_JPEG     },
         { L"jpeg",  CODEC_JPEG     },
-#else
+    #else
         { L"jpg",   WIC_CODEC_JPEG },
         { L"jpeg",  WIC_CODEC_JPEG },
-#endif
-#ifdef USE_LIBPNG
+    #endif
+    #ifdef USE_LIBPNG
         { L"png",   CODEC_PNG      },
-#else
+    #else
         { L"png",   WIC_CODEC_PNG  },
-#endif
+    #endif
         { L"dds",   CODEC_DDS      },
         { L"ddx",   CODEC_DDS      },
         { L"tga",   CODEC_TGA      },
@@ -587,222 +586,11 @@ HRESULT __cdecl SaveToPortablePixMapHDR(
 
 namespace
 {
-    inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
-
-    struct find_closer { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) FindClose(h); } };
-
-    using ScopedFindHandle = std::unique_ptr<void, find_closer>;
-
     constexpr static bool ispow2(size_t x)
     {
         return ((x != 0) && !(x & (x - 1)));
     }
 
-#ifdef _PREFAST_
-#pragma prefast(disable : 26018, "Only used with static internal arrays")
-#endif
-
-    template<typename T>
-    T LookupByName(const wchar_t *pName, const SValue<T> *pArray)
-    {
-        while (pArray->name)
-        {
-            if (!_wcsicmp(pName, pArray->name))
-                return pArray->value;
-
-            pArray++;
-        }
-
-        return 0;
-    }
-
-    template<typename T>
-    const wchar_t* LookupByValue(T value, const SValue<T> *pArray)
-    {
-        while (pArray->name)
-        {
-            if (value == pArray->value)
-                return pArray->name;
-
-            pArray++;
-        }
-
-        return L"";
-    }
-
-    void SearchForFiles(const std::filesystem::path& path, std::list<SConversion>& files, bool recursive, const wchar_t* folder)
-    {
-        // Process files
-        WIN32_FIND_DATAW findData = {};
-        ScopedFindHandle hFile(safe_handle(FindFirstFileExW(path.c_str(),
-            FindExInfoBasic, &findData,
-            FindExSearchNameMatch, nullptr,
-            FIND_FIRST_EX_LARGE_FETCH)));
-        if (hFile)
-        {
-            for (;;)
-            {
-                if (!(findData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY)))
-                {
-                    SConversion conv = {};
-                    conv.szSrc = path.parent_path().append(findData.cFileName).native();
-                    if (folder)
-                    {
-                        conv.szFolder = folder;
-                    }
-                    files.push_back(conv);
-                }
-
-                if (!FindNextFileW(hFile.get(), &findData))
-                    break;
-            }
-        }
-
-        // Process directories
-        if (recursive)
-        {
-            auto searchDir = path.parent_path().append(L"*");
-
-            hFile.reset(safe_handle(FindFirstFileExW(searchDir.c_str(),
-                FindExInfoBasic, &findData,
-                FindExSearchLimitToDirectories, nullptr,
-                FIND_FIRST_EX_LARGE_FETCH)));
-            if (!hFile)
-                return;
-
-            for (;;)
-            {
-                if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-                {
-                    if (findData.cFileName[0] != L'.')
-                    {
-                        auto subfolder = (folder)
-                            ? (std::wstring(folder) + std::wstring(findData.cFileName) + std::filesystem::path::preferred_separator)
-                            : (std::wstring(findData.cFileName) + std::filesystem::path::preferred_separator);
-
-                        auto subdir = path.parent_path().append(findData.cFileName).append(path.filename().c_str());
-
-                        SearchForFiles(subdir, files, recursive, subfolder.c_str());
-                    }
-                }
-
-                if (!FindNextFileW(hFile.get(), &findData))
-                    break;
-            }
-        }
-    }
-
-    void ProcessFileList(std::wifstream& inFile, std::list<SConversion>& files)
-    {
-        std::list<SConversion> flist;
-        std::set<std::wstring> excludes;
-
-        for (;;)
-        {
-            std::wstring fname;
-            std::getline(inFile, fname);
-            if (!inFile)
-                break;
-
-            if (fname[0] == L'#')
-            {
-                // Comment
-            }
-            else if (fname[0] == L'-')
-            {
-                if (flist.empty())
-                {
-                    wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname.c_str());
-                }
-                else
-                {
-                    std::filesystem::path path(fname.c_str() + 1);
-                    auto& npath = path.make_preferred();
-                    if (wcspbrk(fname.c_str(), L"?*") != nullptr)
-                    {
-                        std::list<SConversion> removeFiles;
-                        SearchForFiles(npath, removeFiles, false, nullptr);
-
-                        for (auto& it : removeFiles)
-                        {
-                            std::wstring name = it.szSrc;
-                            std::transform(name.begin(), name.end(), name.begin(), towlower);
-                            excludes.insert(name);
-                        }
-                    }
-                    else
-                    {
-                        std::wstring name = npath.c_str();
-                        std::transform(name.begin(), name.end(), name.begin(), towlower);
-                        excludes.insert(name);
-                    }
-                }
-            }
-            else if (wcspbrk(fname.c_str(), L"?*") != nullptr)
-            {
-                std::filesystem::path path(fname.c_str());
-                SearchForFiles(path.make_preferred(), flist, false, nullptr);
-            }
-            else
-            {
-                SConversion conv = {};
-                std::filesystem::path path(fname.c_str());
-                conv.szSrc = path.make_preferred().native();
-                flist.push_back(conv);
-            }
-        }
-
-        inFile.close();
-
-        if (!excludes.empty())
-        {
-            // Remove any excluded files
-            for (auto it = flist.begin(); it != flist.end();)
-            {
-                std::wstring name = it->szSrc;
-                std::transform(name.begin(), name.end(), name.begin(), towlower);
-                auto item = it;
-                ++it;
-                if (excludes.find(name) != excludes.end())
-                {
-                    flist.erase(item);
-                }
-            }
-        }
-
-        if (flist.empty())
-        {
-            wprintf(L"WARNING: No file names found in -flist\n");
-        }
-        else
-        {
-            files.splice(files.end(), flist);
-        }
-    }
-
-    void PrintFormat(DXGI_FORMAT Format)
-    {
-        for (auto pFormat = g_pFormats; pFormat->name; pFormat++)
-        {
-            if (static_cast<DXGI_FORMAT>(pFormat->value) == Format)
-            {
-                wprintf(L"%ls", pFormat->name);
-                return;
-            }
-        }
-
-        for (auto pFormat = g_pReadOnlyFormats; pFormat->name; pFormat++)
-        {
-            if (static_cast<DXGI_FORMAT>(pFormat->value) == Format)
-            {
-                wprintf(L"%ls", pFormat->name);
-                return;
-            }
-        }
-
-        wprintf(L"*UNKNOWN*");
-    }
-
     void PrintInfo(const TexMetadata& info, bool isXbox)
     {
         wprintf(L" (%zux%zu", info.width, info.height);
@@ -817,7 +605,7 @@ namespace
             wprintf(L",%zu", info.arraySize);
 
         wprintf(L" ");
-        PrintFormat(info.format);
+        PrintFormat(info.format, g_pFormats, g_pReadOnlyFormats);
 
         switch (info.dimension)
         {
@@ -867,75 +655,6 @@ namespace
         wprintf(L")");
     }
 
-    void PrintList(size_t cch, const SValue<uint32_t> *pValue)
-    {
-        while (pValue->name)
-        {
-            const size_t cchName = wcslen(pValue->name);
-
-            if (cch + cchName + 2 >= 80)
-            {
-                wprintf(L"\n      ");
-                cch = 6;
-            }
-
-            wprintf(L"%ls ", pValue->name);
-            cch += cchName + 2;
-            pValue++;
-        }
-
-        wprintf(L"\n");
-    }
-
-    void PrintLogo(bool versionOnly)
-    {
-        wchar_t version[32] = {};
-
-        wchar_t appName[_MAX_PATH] = {};
-        if (GetModuleFileNameW(nullptr, appName, _MAX_PATH))
-        {
-            const DWORD size = GetFileVersionInfoSizeW(appName, nullptr);
-            if (size > 0)
-            {
-                auto verInfo = std::make_unique<uint8_t[]>(size);
-                if (GetFileVersionInfoW(appName, 0, size, verInfo.get()))
-                {
-                    LPVOID lpstr = nullptr;
-                    UINT strLen = 0;
-                    if (VerQueryValueW(verInfo.get(), L"\\StringFileInfo\\040904B0\\ProductVersion", &lpstr, &strLen))
-                    {
-                        wcsncpy_s(version, reinterpret_cast<const wchar_t*>(lpstr), strLen);
-                    }
-                }
-            }
-        }
-
-        if (!*version || wcscmp(version, L"1.0.0.0") == 0)
-        {
-            swprintf_s(version, L"%03d (library)", DIRECTX_TEX_VERSION);
-        }
-
-        if (versionOnly)
-        {
-            wprintf(L"texconv version %ls\n", version);
-        }
-        else
-        {
-        #if defined(USE_XBOX_EXTS) && defined(_USE_SCARLETT)
-            wprintf(L"Microsoft (R) DirectX Texture Converter for Microsoft GDKX for Xbox Series X|S [Version %ls]\n", version);
-        #elif defined(USE_XBOX_EXTS)
-            wprintf(L"Microsoft (R) DirectX Texture Converter for Microsoft GDKX for Xbox One [Version %ls]\n", version);
-        #else
-            wprintf(L"Microsoft (R) DirectX Texture Converter [DirectXTex] Version %ls\n", version);
-        #endif
-            wprintf(L"Copyright (C) Microsoft Corp.\n");
-        #ifdef _DEBUG
-            wprintf(L"*** Debug build ***\n");
-        #endif
-            wprintf(L"\n");
-        }
-    }
-
     _Success_(return)
         bool GetDXGIFactory(_Outptr_ IDXGIFactory1** pFactory)
     {
@@ -964,7 +683,7 @@ namespace
 
     void PrintUsage()
     {
-        PrintLogo(false);
+        PrintLogo(false, g_ToolName, g_Description);
 
         static const wchar_t* const s_usage =
             L"Usage: texconv <options> [--] <files>\n"
@@ -1105,43 +824,6 @@ namespace
         }
     }
 
-    const wchar_t* GetErrorDesc(HRESULT hr)
-    {
-        static wchar_t desc[1024] = {};
-
-        LPWSTR errorText = nullptr;
-
-        const DWORD result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
-            nullptr, static_cast<DWORD>(hr),
-            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPWSTR>(&errorText), 0, nullptr);
-
-        *desc = 0;
-
-        if (result > 0 && errorText)
-        {
-            swprintf_s(desc, L": %ls", errorText);
-
-            size_t len = wcslen(desc);
-            if (len >= 1)
-            {
-                desc[len - 1] = 0;
-            }
-
-            if (errorText)
-                LocalFree(errorText);
-
-            for (wchar_t* ptr = desc; *ptr != 0; ++ptr)
-            {
-                if (*ptr == L'\r' || *ptr == L'\n')
-                {
-                    *ptr = L' ';
-                }
-            }
-        }
-
-        return desc;
-    }
-
     _Success_(return)
         bool CreateDevice(int adapter, _Outptr_ ID3D11Device** pDevice)
     {
@@ -1544,7 +1226,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
             }
             else if (!_wcsicmp(pArg,L"--version"))
             {
-                PrintLogo(true);
+                PrintLogo(true, g_ToolName, g_Description);
                 return 0;
             }
             else if (!_wcsicmp(pArg, L"--help"))
@@ -2152,7 +1834,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
     }
 
     if (~dwOptions & (uint64_t(1) << OPT_NOLOGO))
-        PrintLogo(false);
+        PrintLogo(false, g_ToolName, g_Description);
 
     auto fileTypeName = LookupByValue(FileType, g_pSaveFileTypes);
 
diff --git a/Texdiag/directx.ico b/Texdiag/directx.ico
deleted file mode 100644
index bc43c1b2085df668dffff26d80adcb0ef73f23a9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 25214
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
R57E|HlAXKCS=U$O{{if+y9)pS

diff --git a/Texdiag/settings.manifest b/Texdiag/settings.manifest
deleted file mode 100644
index 544e45d4..00000000
--- a/Texdiag/settings.manifest
+++ /dev/null
@@ -1,21 +0,0 @@
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
-    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
-        <application>
-            <!-- Windows Vista -->
-            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
-            <!-- Windows 7 -->
-            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
-            <!-- Windows 8 -->
-            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
-            <!-- Windows 8.1 -->
-            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
-            <!-- Windows 10 / Windows 11 -->
-            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
-        </application>
-    </compatibility>
-    <asmv3:application>
-        <asmv3:windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
-            <ws2:longPathAware>true</ws2:longPathAware>
-        </asmv3:windowsSettings>
-    </asmv3:application>
-</assembly>
diff --git a/Texdiag/texdiag.cpp b/Texdiag/texdiag.cpp
index 4a8d5302..cbbc0b78 100644
--- a/Texdiag/texdiag.cpp
+++ b/Texdiag/texdiag.cpp
@@ -72,627 +72,354 @@
 #include "DirectXTexPNG.h"
 #endif
 
-using namespace DirectX;
-
-enum COMMANDS : uint32_t
-{
-    CMD_INFO = 1,
-    CMD_ANALYZE,
-    CMD_COMPARE,
-    CMD_DIFF,
-    CMD_DUMPBC,
-    CMD_DUMPDDS,
-    CMD_MAX
-};
-
-enum OPTIONS : uint32_t
-{
-    OPT_RECURSIVE = 1,
-    OPT_FORMAT,
-    OPT_FILTER,
-    OPT_DDS_DWORD_ALIGN,
-    OPT_DDS_BAD_DXTN_TAILS,
-    OPT_DDS_PERMISSIVE,
-    OPT_DDS_IGNORE_MIPS,
-    OPT_OUTPUTFILE,
-    OPT_TOLOWER,
-    OPT_OVERWRITE,
-    OPT_FILETYPE,
-    OPT_NOLOGO,
-    OPT_TYPELESS_UNORM,
-    OPT_TYPELESS_FLOAT,
-    OPT_EXPAND_LUMINANCE,
-    OPT_TARGET_PIXELX,
-    OPT_TARGET_PIXELY,
-    OPT_DIFF_COLOR,
-    OPT_THRESHOLD,
-    OPT_FILELIST,
-    OPT_MAX
-};
-
-static_assert(OPT_MAX <= 32, "dwOptions is a unsigned int bitfield");
-
-struct SConversion
-{
-    std::wstring szSrc;
-};
-
-struct SValue
-{
-    const wchar_t*  name;
-    uint32_t        value;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-const SValue g_pCommands[] =
-{
-    { L"info",      CMD_INFO },
-    { L"analyze",   CMD_ANALYZE },
-    { L"compare",   CMD_COMPARE },
-    { L"diff",      CMD_DIFF },
-    { L"dumpbc",    CMD_DUMPBC },
-    { L"dumpdds",   CMD_DUMPDDS },
-    { nullptr,      0 }
-};
-
-const SValue g_pOptions[] =
-{
-    { L"r",          OPT_RECURSIVE },
-    { L"f",          OPT_FORMAT },
-    { L"if",         OPT_FILTER },
-    { L"dword",      OPT_DDS_DWORD_ALIGN },
-    { L"badtails",   OPT_DDS_BAD_DXTN_TAILS },
-    { L"permissive", OPT_DDS_PERMISSIVE },
-    { L"ignoremips", OPT_DDS_IGNORE_MIPS },
-    { L"nologo",     OPT_NOLOGO },
-    { L"o",          OPT_OUTPUTFILE },
-    { L"l",          OPT_TOLOWER },
-    { L"y",          OPT_OVERWRITE },
-    { L"ft",         OPT_FILETYPE },
-    { L"tu",         OPT_TYPELESS_UNORM },
-    { L"tf",         OPT_TYPELESS_FLOAT },
-    { L"xlum",       OPT_EXPAND_LUMINANCE },
-    { L"targetx",    OPT_TARGET_PIXELX },
-    { L"targety",    OPT_TARGET_PIXELY },
-    { L"c",          OPT_DIFF_COLOR },
-    { L"t",          OPT_THRESHOLD },
-    { L"flist",      OPT_FILELIST },
-    { nullptr,       0 }
-};
-
-#define DEFFMT(fmt) { L## #fmt, DXGI_FORMAT_ ## fmt }
-
-const SValue g_pFormats[] =
-{
-    // List does not include _TYPELESS, depth/stencil, or BC formats
-    DEFFMT(R32G32B32A32_FLOAT),
-    DEFFMT(R32G32B32A32_UINT),
-    DEFFMT(R32G32B32A32_SINT),
-    DEFFMT(R32G32B32_FLOAT),
-    DEFFMT(R32G32B32_UINT),
-    DEFFMT(R32G32B32_SINT),
-    DEFFMT(R16G16B16A16_FLOAT),
-    DEFFMT(R16G16B16A16_UNORM),
-    DEFFMT(R16G16B16A16_UINT),
-    DEFFMT(R16G16B16A16_SNORM),
-    DEFFMT(R16G16B16A16_SINT),
-    DEFFMT(R32G32_FLOAT),
-    DEFFMT(R32G32_UINT),
-    DEFFMT(R32G32_SINT),
-    DEFFMT(R10G10B10A2_UNORM),
-    DEFFMT(R10G10B10A2_UINT),
-    DEFFMT(R11G11B10_FLOAT),
-    DEFFMT(R8G8B8A8_UNORM),
-    DEFFMT(R8G8B8A8_UNORM_SRGB),
-    DEFFMT(R8G8B8A8_UINT),
-    DEFFMT(R8G8B8A8_SNORM),
-    DEFFMT(R8G8B8A8_SINT),
-    DEFFMT(R16G16_FLOAT),
-    DEFFMT(R16G16_UNORM),
-    DEFFMT(R16G16_UINT),
-    DEFFMT(R16G16_SNORM),
-    DEFFMT(R16G16_SINT),
-    DEFFMT(R32_FLOAT),
-    DEFFMT(R32_UINT),
-    DEFFMT(R32_SINT),
-    DEFFMT(R8G8_UNORM),
-    DEFFMT(R8G8_UINT),
-    DEFFMT(R8G8_SNORM),
-    DEFFMT(R8G8_SINT),
-    DEFFMT(R16_FLOAT),
-    DEFFMT(R16_UNORM),
-    DEFFMT(R16_UINT),
-    DEFFMT(R16_SNORM),
-    DEFFMT(R16_SINT),
-    DEFFMT(R8_UNORM),
-    DEFFMT(R8_UINT),
-    DEFFMT(R8_SNORM),
-    DEFFMT(R8_SINT),
-    DEFFMT(A8_UNORM),
-    DEFFMT(R9G9B9E5_SHAREDEXP),
-    DEFFMT(R8G8_B8G8_UNORM),
-    DEFFMT(G8R8_G8B8_UNORM),
-    DEFFMT(B5G6R5_UNORM),
-    DEFFMT(B5G5R5A1_UNORM),
-
-    // DXGI 1.1 formats
-    DEFFMT(B8G8R8A8_UNORM),
-    DEFFMT(B8G8R8X8_UNORM),
-    DEFFMT(R10G10B10_XR_BIAS_A2_UNORM),
-    DEFFMT(B8G8R8A8_UNORM_SRGB),
-    DEFFMT(B8G8R8X8_UNORM_SRGB),
-
-    // DXGI 1.2 formats
-    DEFFMT(AYUV),
-    DEFFMT(Y410),
-    DEFFMT(Y416),
-    DEFFMT(YUY2),
-    DEFFMT(Y210),
-    DEFFMT(Y216),
-    DEFFMT(B4G4R4A4_UNORM),
-
-    // D3D11on12 format
-    { L"A4B4G4R4_UNORM", DXGI_FORMAT(191) },
-
-    { nullptr, DXGI_FORMAT_UNKNOWN }
-};
-
-const SValue g_pFormatAliases[] =
-{
-    { L"RGBA", DXGI_FORMAT_R8G8B8A8_UNORM },
-    { L"BGRA", DXGI_FORMAT_B8G8R8A8_UNORM },
-    { L"BGR",  DXGI_FORMAT_B8G8R8X8_UNORM },
+#include "CmdLineHelpers.h"
 
-    { L"FP16", DXGI_FORMAT_R16G16B16A16_FLOAT },
-    { L"FP32", DXGI_FORMAT_R32G32B32A32_FLOAT },
-
-    { nullptr, DXGI_FORMAT_UNKNOWN }
-};
-
-const SValue g_pReadOnlyFormats[] =
-{
-    DEFFMT(R32G32B32A32_TYPELESS),
-    DEFFMT(R32G32B32_TYPELESS),
-    DEFFMT(R16G16B16A16_TYPELESS),
-    DEFFMT(R32G32_TYPELESS),
-    DEFFMT(R32G8X24_TYPELESS),
-    DEFFMT(D32_FLOAT_S8X24_UINT),
-    DEFFMT(R32_FLOAT_X8X24_TYPELESS),
-    DEFFMT(X32_TYPELESS_G8X24_UINT),
-    DEFFMT(R10G10B10A2_TYPELESS),
-    DEFFMT(R8G8B8A8_TYPELESS),
-    DEFFMT(R16G16_TYPELESS),
-    DEFFMT(R32_TYPELESS),
-    DEFFMT(D32_FLOAT),
-    DEFFMT(R24G8_TYPELESS),
-    DEFFMT(D24_UNORM_S8_UINT),
-    DEFFMT(R24_UNORM_X8_TYPELESS),
-    DEFFMT(X24_TYPELESS_G8_UINT),
-    DEFFMT(R8G8_TYPELESS),
-    DEFFMT(R16_TYPELESS),
-    DEFFMT(R8_TYPELESS),
-    DEFFMT(BC1_TYPELESS),
-    DEFFMT(BC1_UNORM),
-    DEFFMT(BC1_UNORM_SRGB),
-    DEFFMT(BC2_TYPELESS),
-    DEFFMT(BC2_UNORM),
-    DEFFMT(BC2_UNORM_SRGB),
-    DEFFMT(BC3_TYPELESS),
-    DEFFMT(BC3_UNORM),
-    DEFFMT(BC3_UNORM_SRGB),
-    DEFFMT(BC4_TYPELESS),
-    DEFFMT(BC4_UNORM),
-    DEFFMT(BC4_SNORM),
-    DEFFMT(BC5_TYPELESS),
-    DEFFMT(BC5_UNORM),
-    DEFFMT(BC5_SNORM),
-
-    // DXGI 1.1 formats
-    DEFFMT(B8G8R8A8_TYPELESS),
-    DEFFMT(B8G8R8X8_TYPELESS),
-    DEFFMT(BC6H_TYPELESS),
-    DEFFMT(BC6H_UF16),
-    DEFFMT(BC6H_SF16),
-    DEFFMT(BC7_TYPELESS),
-    DEFFMT(BC7_UNORM),
-    DEFFMT(BC7_UNORM_SRGB),
-
-    // DXGI 1.2 formats
-    DEFFMT(AI44),
-    DEFFMT(IA44),
-    DEFFMT(P8),
-    DEFFMT(A8P8),
-    DEFFMT(NV12),
-    DEFFMT(P010),
-    DEFFMT(P016),
-    DEFFMT(420_OPAQUE),
-    DEFFMT(NV11),
-
-    // DXGI 1.3 formats
-    { L"P208", DXGI_FORMAT(130) },
-    { L"V208", DXGI_FORMAT(131) },
-    { L"V408", DXGI_FORMAT(132) },
-
-    // Xbox-specific formats
-    { L"R10G10B10_7E3_A2_FLOAT (Xbox)", DXGI_FORMAT(116) },
-    { L"R10G10B10_6E4_A2_FLOAT (Xbox)", DXGI_FORMAT(117) },
-    { L"D16_UNORM_S8_UINT (Xbox)", DXGI_FORMAT(118) },
-    { L"R16_UNORM_X8_TYPELESS (Xbox)", DXGI_FORMAT(119) },
-    { L"X16_TYPELESS_G8_UINT (Xbox)", DXGI_FORMAT(120) },
-    { L"R10G10B10_SNORM_A2_UNORM (Xbox)", DXGI_FORMAT(189) },
-    { L"R4G4_UNORM (Xbox)", DXGI_FORMAT(190) },
-
-    { nullptr, DXGI_FORMAT_UNKNOWN }
-};
-
-const SValue g_pFilters[] =
-{
-    { L"POINT",                     TEX_FILTER_POINT },
-    { L"LINEAR",                    TEX_FILTER_LINEAR },
-    { L"CUBIC",                     TEX_FILTER_CUBIC },
-    { L"FANT",                      TEX_FILTER_FANT },
-    { L"BOX",                       TEX_FILTER_BOX },
-    { L"TRIANGLE",                  TEX_FILTER_TRIANGLE },
-    { L"POINT_DITHER",              TEX_FILTER_POINT | TEX_FILTER_DITHER },
-    { L"LINEAR_DITHER",             TEX_FILTER_LINEAR | TEX_FILTER_DITHER },
-    { L"CUBIC_DITHER",              TEX_FILTER_CUBIC | TEX_FILTER_DITHER },
-    { L"FANT_DITHER",               TEX_FILTER_FANT | TEX_FILTER_DITHER },
-    { L"BOX_DITHER",                TEX_FILTER_BOX | TEX_FILTER_DITHER },
-    { L"TRIANGLE_DITHER",           TEX_FILTER_TRIANGLE | TEX_FILTER_DITHER },
-    { L"POINT_DITHER_DIFFUSION",    TEX_FILTER_POINT | TEX_FILTER_DITHER_DIFFUSION },
-    { L"LINEAR_DITHER_DIFFUSION",   TEX_FILTER_LINEAR | TEX_FILTER_DITHER_DIFFUSION },
-    { L"CUBIC_DITHER_DIFFUSION",    TEX_FILTER_CUBIC | TEX_FILTER_DITHER_DIFFUSION },
-    { L"FANT_DITHER_DIFFUSION",     TEX_FILTER_FANT | TEX_FILTER_DITHER_DIFFUSION },
-    { L"BOX_DITHER_DIFFUSION",      TEX_FILTER_BOX | TEX_FILTER_DITHER_DIFFUSION },
-    { L"TRIANGLE_DITHER_DIFFUSION", TEX_FILTER_TRIANGLE | TEX_FILTER_DITHER_DIFFUSION },
-    { nullptr,                      TEX_FILTER_DEFAULT }
-};
-
-#define CODEC_DDS 0xFFFF0001
-#define CODEC_TGA 0xFFFF0002
-#define CODEC_HDR 0xFFFF0005
-
-#ifdef USE_OPENEXR
-#define CODEC_EXR 0xFFFF0006
-#endif
-#ifdef USE_LIBJPEG
-#define CODEC_JPEG 0xFFFF0007
-#endif
-#ifdef USE_LIBPNG
-#define CODEC_PNG 0xFFFF0008
-#endif
-
-const SValue g_pDumpFileTypes[] =
-{
-    { L"bmp",   WIC_CODEC_BMP  },
-#ifdef USE_LIBJPEG
-    { L"jpg",   CODEC_JPEG     },
-    { L"jpeg",  CODEC_JPEG     },
-#else
-    { L"jpg",   WIC_CODEC_JPEG },
-    { L"jpeg",  WIC_CODEC_JPEG },
-#endif
-#ifdef USE_LIBPNG
-    { L"png",   CODEC_PNG      },
-#else
-    { L"png",   WIC_CODEC_PNG  },
-#endif
-    { L"tga",   CODEC_TGA      },
-    { L"hdr",   CODEC_HDR      },
-    { L"tif",   WIC_CODEC_TIFF },
-    { L"tiff",  WIC_CODEC_TIFF },
-    { L"jxr",   WIC_CODEC_WMP  },
-#ifdef USE_OPENEXR
-    { L"exr",   CODEC_EXR      },
-#endif
-    { nullptr,  CODEC_DDS      }
-};
-
-const SValue g_pExtFileTypes[] =
-{
-    { L".bmp",  WIC_CODEC_BMP  },
-#ifdef USE_LIBJPEG
-    { L".jpg",  CODEC_JPEG     },
-    { L".jpeg", CODEC_JPEG     },
-#else
-    { L".jpg",  WIC_CODEC_JPEG },
-    { L".jpeg", WIC_CODEC_JPEG },
-#endif
-#ifdef USE_LIBPNG
-    { L".png",  CODEC_PNG      },
-#else
-    { L".png",  WIC_CODEC_PNG  },
-#endif
-    { L".dds",  CODEC_DDS      },
-    { L".tga",  CODEC_TGA      },
-    { L".hdr",  CODEC_HDR      },
-    { L".tif",  WIC_CODEC_TIFF },
-    { L".tiff", WIC_CODEC_TIFF },
-    { L".wdp",  WIC_CODEC_WMP  },
-    { L".hdp",  WIC_CODEC_WMP  },
-    { L".jxr",  WIC_CODEC_WMP  },
-#ifdef USE_OPENEXR
-    { L"exr",   CODEC_EXR      },
-#endif
-    { nullptr,  CODEC_DDS      }
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
+using namespace Helpers;
+using namespace DirectX;
 
 namespace
 {
-    inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
-
-    struct find_closer { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) FindClose(h); } };
-
-    using ScopedFindHandle = std::unique_ptr<void, find_closer>;
-
-#ifdef _PREFAST_
-#pragma prefast(disable : 26018, "Only used with static internal arrays")
-#endif
+    const wchar_t* g_ToolName = L"texdiag";
+    const wchar_t* g_Description = L"Microsoft (R) DirectX Texture Diagnostic Tool [DirectXTex]";
 
-    uint32_t LookupByName(const wchar_t *pName, const SValue *pArray)
+    enum COMMANDS : uint32_t
     {
-        while (pArray->name)
-        {
-            if (!_wcsicmp(pName, pArray->name))
-                return pArray->value;
-
-            pArray++;
-        }
-
-        return 0;
-    }
+        CMD_INFO = 1,
+        CMD_ANALYZE,
+        CMD_COMPARE,
+        CMD_DIFF,
+        CMD_DUMPBC,
+        CMD_DUMPDDS,
+        CMD_MAX
+    };
 
-    const wchar_t* LookupByValue(uint32_t pValue, const SValue *pArray)
+    enum OPTIONS : uint32_t
     {
-        while (pArray->name)
-        {
-            if (pValue == pArray->value)
-                return pArray->name;
+        OPT_RECURSIVE = 1,
+        OPT_FORMAT,
+        OPT_FILTER,
+        OPT_DDS_DWORD_ALIGN,
+        OPT_DDS_BAD_DXTN_TAILS,
+        OPT_DDS_PERMISSIVE,
+        OPT_DDS_IGNORE_MIPS,
+        OPT_OUTPUTFILE,
+        OPT_TOLOWER,
+        OPT_OVERWRITE,
+        OPT_FILETYPE,
+        OPT_NOLOGO,
+        OPT_TYPELESS_UNORM,
+        OPT_TYPELESS_FLOAT,
+        OPT_EXPAND_LUMINANCE,
+        OPT_TARGET_PIXELX,
+        OPT_TARGET_PIXELY,
+        OPT_DIFF_COLOR,
+        OPT_THRESHOLD,
+        OPT_FILELIST,
+        OPT_MAX
+    };
 
-            pArray++;
-        }
+    static_assert(OPT_MAX <= 32, "dwOptions is a unsigned int bitfield");
 
-        return L"";
-    }
+    //////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////
 
-    void SearchForFiles(const std::filesystem::path& path, std::list<SConversion>& files, bool recursive)
+    const SValue<uint32_t> g_pCommands[] =
     {
-        // Process files
-        WIN32_FIND_DATAW findData = {};
-        ScopedFindHandle hFile(safe_handle(FindFirstFileExW(path.c_str(),
-            FindExInfoBasic, &findData,
-            FindExSearchNameMatch, nullptr,
-            FIND_FIRST_EX_LARGE_FETCH)));
-        if (hFile)
-        {
-            for (;;)
-            {
-                if (!(findData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY)))
-                {
-                    SConversion conv = {};
-                    conv.szSrc = path.parent_path().append(findData.cFileName).native();
-                    files.push_back(conv);
-                }
-
-                if (!FindNextFileW(hFile.get(), &findData))
-                    break;
-            }
-        }
-
-        // Process directories
-        if (recursive)
-        {
-            auto searchDir = path.parent_path().append(L"*");
-
-            hFile.reset(safe_handle(FindFirstFileExW(searchDir.c_str(),
-                FindExInfoBasic, &findData,
-                FindExSearchLimitToDirectories, nullptr,
-                FIND_FIRST_EX_LARGE_FETCH)));
-            if (!hFile)
-                return;
-
-            for (;;)
-            {
-                if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-                {
-                    if (findData.cFileName[0] != L'.')
-                    {
-                        auto subdir = path.parent_path().append(findData.cFileName).append(path.filename().c_str());
-
-                        SearchForFiles(subdir, files, recursive);
-                    }
-                }
-
-                if (!FindNextFileW(hFile.get(), &findData))
-                    break;
-            }
-        }
-    }
+        { L"info",      CMD_INFO },
+        { L"analyze",   CMD_ANALYZE },
+        { L"compare",   CMD_COMPARE },
+        { L"diff",      CMD_DIFF },
+        { L"dumpbc",    CMD_DUMPBC },
+        { L"dumpdds",   CMD_DUMPDDS },
+        { nullptr,      0 }
+    };
 
-    void ProcessFileList(std::wifstream& inFile, std::list<SConversion>& files)
+    const SValue<uint32_t> g_pOptions[] =
     {
-        std::list<SConversion> flist;
-        std::set<std::wstring> excludes;
-
-        for (;;)
-        {
-            std::wstring fname;
-            std::getline(inFile, fname);
-            if (!inFile)
-                break;
-
-            if (fname[0] == L'#')
-            {
-                // Comment
-            }
-            else if (fname[0] == L'-')
-            {
-                if (flist.empty())
-                {
-                    wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname.c_str());
-                }
-                else
-                {
-                    std::filesystem::path path(fname.c_str() + 1);
-                    auto& npath = path.make_preferred();
-                    if (wcspbrk(fname.c_str(), L"?*") != nullptr)
-                    {
-                        std::list<SConversion> removeFiles;
-                        SearchForFiles(npath, removeFiles, false);
-
-                        for (auto& it : removeFiles)
-                        {
-                            std::wstring name = it.szSrc;
-                            std::transform(name.begin(), name.end(), name.begin(), towlower);
-                            excludes.insert(name);
-                        }
-                    }
-                    else
-                    {
-                        std::wstring name = npath.c_str();
-                        std::transform(name.begin(), name.end(), name.begin(), towlower);
-                        excludes.insert(name);
-                    }
-                }
-            }
-            else if (wcspbrk(fname.c_str(), L"?*") != nullptr)
-            {
-                std::filesystem::path path(fname.c_str());
-                SearchForFiles(path.make_preferred(), flist, false);
-            }
-            else
-            {
-                SConversion conv = {};
-                std::filesystem::path path(fname.c_str());
-                conv.szSrc = path.make_preferred().native();
-                flist.push_back(conv);
-            }
-        }
-
-        inFile.close();
+        { L"r",          OPT_RECURSIVE },
+        { L"f",          OPT_FORMAT },
+        { L"if",         OPT_FILTER },
+        { L"dword",      OPT_DDS_DWORD_ALIGN },
+        { L"badtails",   OPT_DDS_BAD_DXTN_TAILS },
+        { L"permissive", OPT_DDS_PERMISSIVE },
+        { L"ignoremips", OPT_DDS_IGNORE_MIPS },
+        { L"nologo",     OPT_NOLOGO },
+        { L"o",          OPT_OUTPUTFILE },
+        { L"l",          OPT_TOLOWER },
+        { L"y",          OPT_OVERWRITE },
+        { L"ft",         OPT_FILETYPE },
+        { L"tu",         OPT_TYPELESS_UNORM },
+        { L"tf",         OPT_TYPELESS_FLOAT },
+        { L"xlum",       OPT_EXPAND_LUMINANCE },
+        { L"targetx",    OPT_TARGET_PIXELX },
+        { L"targety",    OPT_TARGET_PIXELY },
+        { L"c",          OPT_DIFF_COLOR },
+        { L"t",          OPT_THRESHOLD },
+        { L"flist",      OPT_FILELIST },
+        { nullptr,       0 }
+    };
 
-        if (!excludes.empty())
-        {
-            // Remove any excluded files
-            for (auto it = flist.begin(); it != flist.end();)
-            {
-                std::wstring name = it->szSrc;
-                std::transform(name.begin(), name.end(), name.begin(), towlower);
-                auto item = it;
-                ++it;
-                if (excludes.find(name) != excludes.end())
-                {
-                    flist.erase(item);
-                }
-            }
-        }
+    #define DEFFMT(fmt) { L## #fmt, DXGI_FORMAT_ ## fmt }
 
-        if (flist.empty())
-        {
-            wprintf(L"WARNING: No file names found in -flist\n");
-        }
-        else
-        {
-            files.splice(files.end(), flist);
-        }
-    }
+    const SValue<DXGI_FORMAT> g_pFormats[] =
+    {
+        // List does not include _TYPELESS, depth/stencil, or BC formats
+        DEFFMT(R32G32B32A32_FLOAT),
+        DEFFMT(R32G32B32A32_UINT),
+        DEFFMT(R32G32B32A32_SINT),
+        DEFFMT(R32G32B32_FLOAT),
+        DEFFMT(R32G32B32_UINT),
+        DEFFMT(R32G32B32_SINT),
+        DEFFMT(R16G16B16A16_FLOAT),
+        DEFFMT(R16G16B16A16_UNORM),
+        DEFFMT(R16G16B16A16_UINT),
+        DEFFMT(R16G16B16A16_SNORM),
+        DEFFMT(R16G16B16A16_SINT),
+        DEFFMT(R32G32_FLOAT),
+        DEFFMT(R32G32_UINT),
+        DEFFMT(R32G32_SINT),
+        DEFFMT(R10G10B10A2_UNORM),
+        DEFFMT(R10G10B10A2_UINT),
+        DEFFMT(R11G11B10_FLOAT),
+        DEFFMT(R8G8B8A8_UNORM),
+        DEFFMT(R8G8B8A8_UNORM_SRGB),
+        DEFFMT(R8G8B8A8_UINT),
+        DEFFMT(R8G8B8A8_SNORM),
+        DEFFMT(R8G8B8A8_SINT),
+        DEFFMT(R16G16_FLOAT),
+        DEFFMT(R16G16_UNORM),
+        DEFFMT(R16G16_UINT),
+        DEFFMT(R16G16_SNORM),
+        DEFFMT(R16G16_SINT),
+        DEFFMT(R32_FLOAT),
+        DEFFMT(R32_UINT),
+        DEFFMT(R32_SINT),
+        DEFFMT(R8G8_UNORM),
+        DEFFMT(R8G8_UINT),
+        DEFFMT(R8G8_SNORM),
+        DEFFMT(R8G8_SINT),
+        DEFFMT(R16_FLOAT),
+        DEFFMT(R16_UNORM),
+        DEFFMT(R16_UINT),
+        DEFFMT(R16_SNORM),
+        DEFFMT(R16_SINT),
+        DEFFMT(R8_UNORM),
+        DEFFMT(R8_UINT),
+        DEFFMT(R8_SNORM),
+        DEFFMT(R8_SINT),
+        DEFFMT(A8_UNORM),
+        DEFFMT(R9G9B9E5_SHAREDEXP),
+        DEFFMT(R8G8_B8G8_UNORM),
+        DEFFMT(G8R8_G8B8_UNORM),
+        DEFFMT(B5G6R5_UNORM),
+        DEFFMT(B5G5R5A1_UNORM),
+
+        // DXGI 1.1 formats
+        DEFFMT(B8G8R8A8_UNORM),
+        DEFFMT(B8G8R8X8_UNORM),
+        DEFFMT(R10G10B10_XR_BIAS_A2_UNORM),
+        DEFFMT(B8G8R8A8_UNORM_SRGB),
+        DEFFMT(B8G8R8X8_UNORM_SRGB),
+
+        // DXGI 1.2 formats
+        DEFFMT(AYUV),
+        DEFFMT(Y410),
+        DEFFMT(Y416),
+        DEFFMT(YUY2),
+        DEFFMT(Y210),
+        DEFFMT(Y216),
+        DEFFMT(B4G4R4A4_UNORM),
+
+        // D3D11on12 format
+        { L"A4B4G4R4_UNORM", DXGI_FORMAT(191) },
+
+        { nullptr, DXGI_FORMAT_UNKNOWN }
+    };
 
-    void PrintFormat(DXGI_FORMAT Format)
+    const SValue<DXGI_FORMAT> g_pFormatAliases[] =
     {
-        for (auto pFormat = g_pFormats; pFormat->name; pFormat++)
-        {
-            if (static_cast<DXGI_FORMAT>(pFormat->value) == Format)
-            {
-                wprintf(L"%ls", pFormat->name);
-                return;
-            }
-        }
+        { L"RGBA", DXGI_FORMAT_R8G8B8A8_UNORM },
+        { L"BGRA", DXGI_FORMAT_B8G8R8A8_UNORM },
+        { L"BGR",  DXGI_FORMAT_B8G8R8X8_UNORM },
 
-        for (auto pFormat = g_pReadOnlyFormats; pFormat->name; pFormat++)
-        {
-            if (static_cast<DXGI_FORMAT>(pFormat->value) == Format)
-            {
-                wprintf(L"%ls", pFormat->name);
-                return;
-            }
-        }
+        { L"FP16", DXGI_FORMAT_R16G16B16A16_FLOAT },
+        { L"FP32", DXGI_FORMAT_R32G32B32A32_FLOAT },
 
-        wprintf(L"*UNKNOWN*");
-    }
+        { nullptr, DXGI_FORMAT_UNKNOWN }
+    };
 
-    void PrintList(size_t cch, const SValue *pValue)
+    const SValue<DXGI_FORMAT> g_pReadOnlyFormats[] =
     {
-        while (pValue->name)
-        {
-            const size_t cchName = wcslen(pValue->name);
+        DEFFMT(R32G32B32A32_TYPELESS),
+        DEFFMT(R32G32B32_TYPELESS),
+        DEFFMT(R16G16B16A16_TYPELESS),
+        DEFFMT(R32G32_TYPELESS),
+        DEFFMT(R32G8X24_TYPELESS),
+        DEFFMT(D32_FLOAT_S8X24_UINT),
+        DEFFMT(R32_FLOAT_X8X24_TYPELESS),
+        DEFFMT(X32_TYPELESS_G8X24_UINT),
+        DEFFMT(R10G10B10A2_TYPELESS),
+        DEFFMT(R8G8B8A8_TYPELESS),
+        DEFFMT(R16G16_TYPELESS),
+        DEFFMT(R32_TYPELESS),
+        DEFFMT(D32_FLOAT),
+        DEFFMT(R24G8_TYPELESS),
+        DEFFMT(D24_UNORM_S8_UINT),
+        DEFFMT(R24_UNORM_X8_TYPELESS),
+        DEFFMT(X24_TYPELESS_G8_UINT),
+        DEFFMT(R8G8_TYPELESS),
+        DEFFMT(R16_TYPELESS),
+        DEFFMT(R8_TYPELESS),
+        DEFFMT(BC1_TYPELESS),
+        DEFFMT(BC1_UNORM),
+        DEFFMT(BC1_UNORM_SRGB),
+        DEFFMT(BC2_TYPELESS),
+        DEFFMT(BC2_UNORM),
+        DEFFMT(BC2_UNORM_SRGB),
+        DEFFMT(BC3_TYPELESS),
+        DEFFMT(BC3_UNORM),
+        DEFFMT(BC3_UNORM_SRGB),
+        DEFFMT(BC4_TYPELESS),
+        DEFFMT(BC4_UNORM),
+        DEFFMT(BC4_SNORM),
+        DEFFMT(BC5_TYPELESS),
+        DEFFMT(BC5_UNORM),
+        DEFFMT(BC5_SNORM),
+
+        // DXGI 1.1 formats
+        DEFFMT(B8G8R8A8_TYPELESS),
+        DEFFMT(B8G8R8X8_TYPELESS),
+        DEFFMT(BC6H_TYPELESS),
+        DEFFMT(BC6H_UF16),
+        DEFFMT(BC6H_SF16),
+        DEFFMT(BC7_TYPELESS),
+        DEFFMT(BC7_UNORM),
+        DEFFMT(BC7_UNORM_SRGB),
+
+        // DXGI 1.2 formats
+        DEFFMT(AI44),
+        DEFFMT(IA44),
+        DEFFMT(P8),
+        DEFFMT(A8P8),
+        DEFFMT(NV12),
+        DEFFMT(P010),
+        DEFFMT(P016),
+        DEFFMT(420_OPAQUE),
+        DEFFMT(NV11),
+
+        // DXGI 1.3 formats
+        { L"P208", DXGI_FORMAT(130) },
+        { L"V208", DXGI_FORMAT(131) },
+        { L"V408", DXGI_FORMAT(132) },
+
+        // Xbox-specific formats
+        { L"R10G10B10_7E3_A2_FLOAT (Xbox)", DXGI_FORMAT(116) },
+        { L"R10G10B10_6E4_A2_FLOAT (Xbox)", DXGI_FORMAT(117) },
+        { L"D16_UNORM_S8_UINT (Xbox)", DXGI_FORMAT(118) },
+        { L"R16_UNORM_X8_TYPELESS (Xbox)", DXGI_FORMAT(119) },
+        { L"X16_TYPELESS_G8_UINT (Xbox)", DXGI_FORMAT(120) },
+        { L"R10G10B10_SNORM_A2_UNORM (Xbox)", DXGI_FORMAT(189) },
+        { L"R4G4_UNORM (Xbox)", DXGI_FORMAT(190) },
+
+        { nullptr, DXGI_FORMAT_UNKNOWN }
+    };
 
-            if (cch + cchName + 2 >= 80)
-            {
-                wprintf(L"\n      ");
-                cch = 6;
-            }
+    const SValue<uint32_t> g_pFilters[] =
+    {
+        { L"POINT",                     TEX_FILTER_POINT },
+        { L"LINEAR",                    TEX_FILTER_LINEAR },
+        { L"CUBIC",                     TEX_FILTER_CUBIC },
+        { L"FANT",                      TEX_FILTER_FANT },
+        { L"BOX",                       TEX_FILTER_BOX },
+        { L"TRIANGLE",                  TEX_FILTER_TRIANGLE },
+        { L"POINT_DITHER",              TEX_FILTER_POINT | TEX_FILTER_DITHER },
+        { L"LINEAR_DITHER",             TEX_FILTER_LINEAR | TEX_FILTER_DITHER },
+        { L"CUBIC_DITHER",              TEX_FILTER_CUBIC | TEX_FILTER_DITHER },
+        { L"FANT_DITHER",               TEX_FILTER_FANT | TEX_FILTER_DITHER },
+        { L"BOX_DITHER",                TEX_FILTER_BOX | TEX_FILTER_DITHER },
+        { L"TRIANGLE_DITHER",           TEX_FILTER_TRIANGLE | TEX_FILTER_DITHER },
+        { L"POINT_DITHER_DIFFUSION",    TEX_FILTER_POINT | TEX_FILTER_DITHER_DIFFUSION },
+        { L"LINEAR_DITHER_DIFFUSION",   TEX_FILTER_LINEAR | TEX_FILTER_DITHER_DIFFUSION },
+        { L"CUBIC_DITHER_DIFFUSION",    TEX_FILTER_CUBIC | TEX_FILTER_DITHER_DIFFUSION },
+        { L"FANT_DITHER_DIFFUSION",     TEX_FILTER_FANT | TEX_FILTER_DITHER_DIFFUSION },
+        { L"BOX_DITHER_DIFFUSION",      TEX_FILTER_BOX | TEX_FILTER_DITHER_DIFFUSION },
+        { L"TRIANGLE_DITHER_DIFFUSION", TEX_FILTER_TRIANGLE | TEX_FILTER_DITHER_DIFFUSION },
+        { nullptr,                      TEX_FILTER_DEFAULT }
+    };
 
-            wprintf(L"%ls ", pValue->name);
-            cch += cchName + 2;
-            pValue++;
-        }
+    #define CODEC_DDS 0xFFFF0001
+    #define CODEC_TGA 0xFFFF0002
+    #define CODEC_HDR 0xFFFF0005
 
-        wprintf(L"\n");
-    }
+    #ifdef USE_OPENEXR
+    #define CODEC_EXR 0xFFFF0006
+    #endif
+    #ifdef USE_LIBJPEG
+    #define CODEC_JPEG 0xFFFF0007
+    #endif
+    #ifdef USE_LIBPNG
+    #define CODEC_PNG 0xFFFF0008
+    #endif
 
-    void PrintLogo(bool versionOnly)
+    const SValue<uint32_t> g_pDumpFileTypes[] =
     {
-        wchar_t version[32] = {};
-
-        wchar_t appName[_MAX_PATH] = {};
-        if (GetModuleFileNameW(nullptr, appName, _MAX_PATH))
-        {
-            const DWORD size = GetFileVersionInfoSizeW(appName, nullptr);
-            if (size > 0)
-            {
-                auto verInfo = std::make_unique<uint8_t[]>(size);
-                if (GetFileVersionInfoW(appName, 0, size, verInfo.get()))
-                {
-                    LPVOID lpstr = nullptr;
-                    UINT strLen = 0;
-                    if (VerQueryValueW(verInfo.get(), L"\\StringFileInfo\\040904B0\\ProductVersion", &lpstr, &strLen))
-                    {
-                        wcsncpy_s(version, reinterpret_cast<const wchar_t*>(lpstr), strLen);
-                    }
-                }
-            }
-        }
-
-        if (!*version || wcscmp(version, L"1.0.0.0") == 0)
-        {
-            swprintf_s(version, L"%03d (library)", DIRECTX_TEX_VERSION);
-        }
+        { L"bmp",   WIC_CODEC_BMP  },
+    #ifdef USE_LIBJPEG
+        { L"jpg",   CODEC_JPEG     },
+        { L"jpeg",  CODEC_JPEG     },
+    #else
+        { L"jpg",   WIC_CODEC_JPEG },
+        { L"jpeg",  WIC_CODEC_JPEG },
+    #endif
+    #ifdef USE_LIBPNG
+        { L"png",   CODEC_PNG      },
+    #else
+        { L"png",   WIC_CODEC_PNG  },
+    #endif
+        { L"tga",   CODEC_TGA      },
+        { L"hdr",   CODEC_HDR      },
+        { L"tif",   WIC_CODEC_TIFF },
+        { L"tiff",  WIC_CODEC_TIFF },
+        { L"jxr",   WIC_CODEC_WMP  },
+    #ifdef USE_OPENEXR
+        { L"exr",   CODEC_EXR      },
+    #endif
+        { nullptr,  CODEC_DDS      }
+    };
 
-        if (versionOnly)
-        {
-            wprintf(L"texdiag version %ls\n", version);
-        }
-        else
-        {
-            wprintf(L"Microsoft (R) DirectX Texture Diagnostic Tool [DirectXTex] Version %ls\n", version);
-            wprintf(L"Copyright (C) Microsoft Corp.\n");
-        #ifdef _DEBUG
-            wprintf(L"*** Debug build ***\n");
-        #endif
-            wprintf(L"\n");
-        }
-    }
+    const SValue<uint32_t> g_pExtFileTypes[] =
+    {
+        { L".bmp",  WIC_CODEC_BMP  },
+    #ifdef USE_LIBJPEG
+        { L".jpg",  CODEC_JPEG     },
+        { L".jpeg", CODEC_JPEG     },
+    #else
+        { L".jpg",  WIC_CODEC_JPEG },
+        { L".jpeg", WIC_CODEC_JPEG },
+    #endif
+    #ifdef USE_LIBPNG
+        { L".png",  CODEC_PNG      },
+    #else
+        { L".png",  WIC_CODEC_PNG  },
+    #endif
+        { L".dds",  CODEC_DDS      },
+        { L".tga",  CODEC_TGA      },
+        { L".hdr",  CODEC_HDR      },
+        { L".tif",  WIC_CODEC_TIFF },
+        { L".tiff", WIC_CODEC_TIFF },
+        { L".wdp",  WIC_CODEC_WMP  },
+        { L".hdp",  WIC_CODEC_WMP  },
+        { L".jxr",  WIC_CODEC_WMP  },
+    #ifdef USE_OPENEXR
+        { L"exr",   CODEC_EXR      },
+    #endif
+        { nullptr,  CODEC_DDS      }
+    };
 
     void PrintUsage()
     {
-        PrintLogo(false);
+        PrintLogo(false, g_ToolName, g_Description);
 
         static const wchar_t* const s_usage =
             L"Usage: texdiag <command> <options> [--] <files>\n"
@@ -749,43 +476,6 @@ namespace
         PrintList(15, g_pDumpFileTypes);
     }
 
-    const wchar_t* GetErrorDesc(HRESULT hr)
-    {
-        static wchar_t desc[1024] = {};
-
-        LPWSTR errorText = nullptr;
-
-        const DWORD result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
-            nullptr, static_cast<DWORD>(hr),
-            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPWSTR>(&errorText), 0, nullptr);
-
-        *desc = 0;
-
-        if (result > 0 && errorText)
-        {
-            swprintf_s(desc, L": %ls", errorText);
-
-            size_t len = wcslen(desc);
-            if (len >= 1)
-            {
-                desc[len - 1] = 0;
-            }
-
-            if (errorText)
-                LocalFree(errorText);
-
-            for(wchar_t* ptr = desc; *ptr != 0; ++ptr)
-            {
-                if (*ptr == L'\r' || *ptr == L'\n')
-                {
-                    *ptr = L' ';
-                }
-            }
-        }
-
-        return desc;
-    }
-
     HRESULT LoadImage(
         const wchar_t *fileName,
         uint32_t dwOptions,
@@ -1053,7 +743,7 @@ namespace
         void Print(DXGI_FORMAT fmt)
         {
             wprintf(L"\t        Compression - ");
-            PrintFormat(fmt);
+            PrintFormat(fmt, g_pFormats, g_pReadOnlyFormats);
             wprintf(L"\n\t       Total blocks - %zu\n", blocks);
 
             switch (fmt)
@@ -3340,7 +3030,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
     {
         if (!_wcsicmp(argv[1], L"--version"))
         {
-            PrintLogo(true);
+            PrintLogo(true, g_ToolName, g_Description);
             return 0;
         }
         else if (!_wcsicmp(argv[1], L"--help"))
@@ -3384,7 +3074,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
             }
             else if (!_wcsicmp(pArg, L"--version"))
             {
-                PrintLogo(true);
+                PrintLogo(true, g_ToolName, g_Description);
                 return 0;
             }
             else if (!_wcsicmp(pArg, L"--help"))
@@ -3585,7 +3275,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
         {
             const size_t count = conversion.size();
             std::filesystem::path path(pArg);
-            SearchForFiles(path.make_preferred(), conversion, (dwOptions & (1 << OPT_RECURSIVE)) != 0);
+            SearchForFiles(path.make_preferred(), conversion, (dwOptions & (1 << OPT_RECURSIVE)) != 0, nullptr);
             if (conversion.size() <= count)
             {
                 wprintf(L"No matching files found for %ls\n", pArg);
@@ -3608,7 +3298,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
     }
 
     if (~dwOptions & (1 << OPT_NOLOGO))
-        PrintLogo(false);
+        PrintLogo(false, g_ToolName, g_Description);
 
     switch (dwCommand)
     {
@@ -3903,7 +3593,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
                 wprintf(L"    mipLevels = %zu\n", info.mipLevels);
                 wprintf(L"    arraySize = %zu\n", info.arraySize);
                 wprintf(L"       format = ");
-                PrintFormat(info.format);
+                PrintFormat(info.format, g_pFormats, g_pReadOnlyFormats);
                 wprintf(L"\n    dimension = ");
                 switch (info.dimension)
                 {
@@ -4069,7 +3759,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
                 }
 
                 wprintf(L"Compression: ");
-                PrintFormat(info.format);
+                PrintFormat(info.format, g_pFormats, g_pReadOnlyFormats);
                 wprintf(L"\n");
 
                 if (info.depth > 1)
diff --git a/Texdiag/texdiag.rc b/Texdiag/texdiag.rc
index 81f37844..180658be 100644
--- a/Texdiag/texdiag.rc
+++ b/Texdiag/texdiag.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_MAIN_ICON           ICON                    "directx.ico"
+IDI_MAIN_ICON           ICON                    "..\Common\directx.ico"
 
 
 #ifdef APSTUDIO_INVOKED
diff --git a/Texdiag/texdiag_Desktop_2019.vcxproj b/Texdiag/texdiag_Desktop_2019.vcxproj
index 33ca8f40..717a25df 100644
--- a/Texdiag/texdiag_Desktop_2019.vcxproj
+++ b/Texdiag/texdiag_Desktop_2019.vcxproj
@@ -134,7 +134,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -159,7 +159,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -183,7 +183,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -210,7 +210,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -237,7 +237,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -264,7 +264,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -297,7 +297,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texdiag/texdiag_Desktop_2019.vcxproj.filters b/Texdiag/texdiag_Desktop_2019.vcxproj.filters
index b4b97edd..80ea3674 100644
--- a/Texdiag/texdiag_Desktop_2019.vcxproj.filters
+++ b/Texdiag/texdiag_Desktop_2019.vcxproj.filters
@@ -15,8 +15,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texdiag/texdiag_Desktop_2019_Win10.vcxproj b/Texdiag/texdiag_Desktop_2019_Win10.vcxproj
index aace29f3..b4c0e481 100644
--- a/Texdiag/texdiag_Desktop_2019_Win10.vcxproj
+++ b/Texdiag/texdiag_Desktop_2019_Win10.vcxproj
@@ -191,7 +191,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -216,7 +216,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -240,7 +240,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -263,7 +263,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -290,7 +290,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -316,7 +316,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -342,7 +342,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -369,7 +369,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -395,7 +395,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -427,7 +427,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texdiag/texdiag_Desktop_2019_Win10.vcxproj.filters b/Texdiag/texdiag_Desktop_2019_Win10.vcxproj.filters
index b4b97edd..80ea3674 100644
--- a/Texdiag/texdiag_Desktop_2019_Win10.vcxproj.filters
+++ b/Texdiag/texdiag_Desktop_2019_Win10.vcxproj.filters
@@ -15,8 +15,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texdiag/texdiag_Desktop_2022.vcxproj b/Texdiag/texdiag_Desktop_2022.vcxproj
index 8dd21987..52bb996b 100644
--- a/Texdiag/texdiag_Desktop_2022.vcxproj
+++ b/Texdiag/texdiag_Desktop_2022.vcxproj
@@ -134,7 +134,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -159,7 +159,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -183,7 +183,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -210,7 +210,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -237,7 +237,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -264,7 +264,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -297,7 +297,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texdiag/texdiag_Desktop_2022.vcxproj.filters b/Texdiag/texdiag_Desktop_2022.vcxproj.filters
index b4b97edd..80ea3674 100644
--- a/Texdiag/texdiag_Desktop_2022.vcxproj.filters
+++ b/Texdiag/texdiag_Desktop_2022.vcxproj.filters
@@ -15,8 +15,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Texdiag/texdiag_Desktop_2022_Win10.vcxproj b/Texdiag/texdiag_Desktop_2022_Win10.vcxproj
index b9867769..cef646da 100644
--- a/Texdiag/texdiag_Desktop_2022_Win10.vcxproj
+++ b/Texdiag/texdiag_Desktop_2022_Win10.vcxproj
@@ -191,7 +191,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -216,7 +216,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -240,7 +240,7 @@
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -263,7 +263,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -290,7 +290,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -316,7 +316,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ControlFlowGuard>Guard</ControlFlowGuard>
       <SDLCheck>true</SDLCheck>
@@ -342,7 +342,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -369,7 +369,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -395,7 +395,7 @@
       <WarningLevel>Level4</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FloatingPointModel>Fast</FloatingPointModel>
-      <AdditionalIncludeDirectories>..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;..\DirectXTex;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;PROFILE;_CONSOLE;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -427,7 +427,10 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest" />
+    <Manifest Include="..\Common\settings.manifest" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
diff --git a/Texdiag/texdiag_Desktop_2022_Win10.vcxproj.filters b/Texdiag/texdiag_Desktop_2022_Win10.vcxproj.filters
index b4b97edd..80ea3674 100644
--- a/Texdiag/texdiag_Desktop_2022_Win10.vcxproj.filters
+++ b/Texdiag/texdiag_Desktop_2022_Win10.vcxproj.filters
@@ -15,8 +15,11 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <Manifest Include="settings.manifest">
+    <Manifest Include="..\Common\settings.manifest">
       <Filter>Resource Files</Filter>
     </Manifest>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\Common\CmdLineHelpers.h" />
+  </ItemGroup>
 </Project>
\ No newline at end of file

From 62c47b0195652b42f29ecf1659ce4997a9bb8551 Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Mon, 16 Sep 2024 16:31:37 -0700
Subject: [PATCH 02/11] Update DDSView hlsl.cmd to match recent changes to
 CompileShaders

---
 CMakeLists.txt                               | 21 +++-------
 Common/CmdLineHelpers.h                      |  2 +-
 DDSView/DDSView_Desktop_2019.vcxproj         |  7 +++-
 DDSView/DDSView_Desktop_2019.vcxproj.filters |  2 +-
 DDSView/DDSView_Desktop_2022.vcxproj         |  7 +++-
 DDSView/DDSView_Desktop_2022.vcxproj.filters |  2 +-
 DDSView/{ddsview.fx => ddsview.hlsl}         |  0
 DDSView/hlsl.cmd                             | 40 +++++++++++++-------
 Texassemble/texassemble.cpp                  |  2 +
 Texconv/texconv.cpp                          |  2 +
 Texdiag/texdiag.cpp                          |  2 +
 11 files changed, 51 insertions(+), 36 deletions(-)
 rename DDSView/{ddsview.fx => ddsview.hlsl} (100%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 102b4861..84b34336 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -483,33 +483,22 @@ endif()
 if(BUILD_SAMPLE AND BUILD_DX11 AND WIN32)
   list(APPEND TOOL_EXES ddsview)
 
-  if(NOT COMPILED_DDSVIEW_SHADERS)
-      if(USE_PREBUILT_SHADERS)
-          message(FATAL_ERROR "ERROR: Using prebuilt shaders requires the COMPILED_DDSVIEW_SHADERS variable is set")
-      endif()
-      set(COMPILED_DDSVIEW_SHADERS ${CMAKE_CURRENT_BINARY_DIR}/Shaders/Compiled)
-      file(MAKE_DIRECTORY ${COMPILED_DDSVIEW_SHADERS})
-  else()
-      file(TO_CMAKE_PATH ${COMPILED_DDSVIEW_SHADERS} COMPILED_DDSVIEW_SHADERS)
-  endif()
-
   add_executable(ddsview WIN32
     DDSView/ddsview.cpp
     DDSView/ddsview.rc
-    ${COMPILED_DDSVIEW_SHADERS}/ddsview_ps1D.inc)
+    ${COMPILED_SHADERS}/ddsview_ps1D.inc)
   target_link_libraries(ddsview PRIVATE ${PROJECT_NAME} d3d11.lib ole32.lib)
   source_group(ddsview REGULAR_EXPRESSION DDSView/*.*)
 
-  target_include_directories(ddsview PRIVATE ${COMPILED_DDSVIEW_SHADERS})
+  target_include_directories(ddsview PRIVATE ${COMPILED_SHADERS})
 
   if(NOT USE_PREBUILT_SHADERS)
-      #TODO: DIRECTX_FXC_TOOL
       add_custom_command(
-            OUTPUT "${COMPILED_DDSVIEW_SHADERS}/ddsview_ps1D.inc"
+            OUTPUT "${COMPILED_SHADERS}/ddsview_ps1D.inc"
             MAIN_DEPENDENCY "${PROJECT_SOURCE_DIR}/DDSView/hlsl.cmd"
-            DEPENDS "${PROJECT_SOURCE_DIR}/DDSView/ddsview.fx"
+            DEPENDS "DDSView/ddsview.hlsl"
             COMMENT "Generating HLSL shaders for DDSView..."
-            COMMAND COMMAND ${CMAKE_COMMAND} -E env CompileShadersOutput="${COMPILED_DDSVIEW_SHADERS}" hlsl.cmd > "${COMPILED_DDSVIEW_SHADERS}/hlsl.log"
+            COMMAND ${CMAKE_COMMAND} -E env CompileShadersOutput="${COMPILED_SHADERS}" $<$<BOOL:${DIRECTX_FXC_TOOL}>:LegacyShaderCompiler=${DIRECTX_FXC_TOOL}> hlsl.cmd > "${COMPILED_SHADERS}/hlsl_ddsview.log"
             WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/DDSView"
             USES_TERMINAL)
   endif()
diff --git a/Common/CmdLineHelpers.h b/Common/CmdLineHelpers.h
index f81c3c78..2cf26b18 100644
--- a/Common/CmdLineHelpers.h
+++ b/Common/CmdLineHelpers.h
@@ -353,4 +353,4 @@ namespace Helpers
 
         return desc;
     }
-}
\ No newline at end of file
+}
diff --git a/DDSView/DDSView_Desktop_2019.vcxproj b/DDSView/DDSView_Desktop_2019.vcxproj
index 62d6a7a4..b8b0a6f4 100644
--- a/DDSView/DDSView_Desktop_2019.vcxproj
+++ b/DDSView/DDSView_Desktop_2019.vcxproj
@@ -291,7 +291,7 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <None Include="ddsview.fx" />
+    <None Include="ddsview.hlsl" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
@@ -300,10 +300,13 @@
       <_ATGFXCPath>$(WindowsSDK_ExecutablePath_x64.Split(';')[0])</_ATGFXCPath>
       <_ATGFXCPath>$(_ATGFXCPath.Replace("x64",""))</_ATGFXCPath>
       <_ATGFXCPath Condition="'$(_ATGFXCPath)' != '' and !HasTrailingSlash('$(_ATGFXCPath)')">$(_ATGFXCPath)\</_ATGFXCPath>
+      <_ATGFXCVer>$([System.Text.RegularExpressions.Regex]::Match($(_ATGFXCPath), `10\.0\.\d+\.0`))</_ATGFXCVer>
+      <_ATGFXCVer Condition="'$(_ATGFXCVer)' != '' and !HasTrailingSlash('$(_ATGFXCVer)')">$(_ATGFXCVer)\</_ATGFXCVer>
     </PropertyGroup>
-    <Exec Condition="!Exists('Shaders/ddsview_vs.inc')" WorkingDirectory="$(ProjectDir)" Command="hlsl" EnvironmentVariables="WindowsSdkVerBinPath=$(_ATGFXCPath)" LogStandardErrorAsError="true" />
+    <Exec Condition="!Exists('Shaders/ddsview_vs.inc')" WorkingDirectory="$(ProjectDir)" Command="hlsl" EnvironmentVariables="WindowsSdkVerBinPath=$(_ATGFXCPath);WindowsSDKVersion=$(_ATGFXCVer);CompileShadersOutput=$(ProjectDir)\Shaders" LogStandardErrorAsError="true" />
     <PropertyGroup>
       <_ATGFXCPath />
+      <_ATGFXCVer />
     </PropertyGroup>
   </Target>
   <Target Name="ATGDeleteShaders" AfterTargets="Clean">
diff --git a/DDSView/DDSView_Desktop_2019.vcxproj.filters b/DDSView/DDSView_Desktop_2019.vcxproj.filters
index ab6eee79..32c0bff0 100644
--- a/DDSView/DDSView_Desktop_2019.vcxproj.filters
+++ b/DDSView/DDSView_Desktop_2019.vcxproj.filters
@@ -15,6 +15,6 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <None Include="ddsview.fx" />
+    <None Include="ddsview.hlsl" />
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/DDSView/DDSView_Desktop_2022.vcxproj b/DDSView/DDSView_Desktop_2022.vcxproj
index bfdb2b86..b7c27906 100644
--- a/DDSView/DDSView_Desktop_2022.vcxproj
+++ b/DDSView/DDSView_Desktop_2022.vcxproj
@@ -291,7 +291,7 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <None Include="ddsview.fx" />
+    <None Include="ddsview.hlsl" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets" />
@@ -300,10 +300,13 @@
       <_ATGFXCPath>$(WindowsSDK_ExecutablePath_x64.Split(';')[0])</_ATGFXCPath>
       <_ATGFXCPath>$(_ATGFXCPath.Replace("x64",""))</_ATGFXCPath>
       <_ATGFXCPath Condition="'$(_ATGFXCPath)' != '' and !HasTrailingSlash('$(_ATGFXCPath)')">$(_ATGFXCPath)\</_ATGFXCPath>
+      <_ATGFXCVer>$([System.Text.RegularExpressions.Regex]::Match($(_ATGFXCPath), `10\.0\.\d+\.0`))</_ATGFXCVer>
+      <_ATGFXCVer Condition="'$(_ATGFXCVer)' != '' and !HasTrailingSlash('$(_ATGFXCVer)')">$(_ATGFXCVer)\</_ATGFXCVer>
     </PropertyGroup>
-    <Exec Condition="!Exists('Shaders/ddsview_vs.inc')" WorkingDirectory="$(ProjectDir)" Command="hlsl" EnvironmentVariables="WindowsSdkVerBinPath=$(_ATGFXCPath)" LogStandardErrorAsError="true" />
+    <Exec Condition="!Exists('Shaders/ddsview_vs.inc')" WorkingDirectory="$(ProjectDir)" Command="hlsl" EnvironmentVariables="WindowsSdkVerBinPath=$(_ATGFXCPath);WindowsSDKVersion=$(_ATGFXCVer);CompileShadersOutput=$(ProjectDir)\Shaders" LogStandardErrorAsError="true" />
     <PropertyGroup>
       <_ATGFXCPath />
+      <_ATGFXCVer />
     </PropertyGroup>
   </Target>
   <Target Name="ATGDeleteShaders" AfterTargets="Clean">
diff --git a/DDSView/DDSView_Desktop_2022.vcxproj.filters b/DDSView/DDSView_Desktop_2022.vcxproj.filters
index ab6eee79..32c0bff0 100644
--- a/DDSView/DDSView_Desktop_2022.vcxproj.filters
+++ b/DDSView/DDSView_Desktop_2022.vcxproj.filters
@@ -15,6 +15,6 @@
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <None Include="ddsview.fx" />
+    <None Include="ddsview.hlsl" />
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/DDSView/ddsview.fx b/DDSView/ddsview.hlsl
similarity index 100%
rename from DDSView/ddsview.fx
rename to DDSView/ddsview.hlsl
diff --git a/DDSView/hlsl.cmd b/DDSView/hlsl.cmd
index aefdc0f8..80a01f22 100644
--- a/DDSView/hlsl.cmd
+++ b/DDSView/hlsl.cmd
@@ -5,16 +5,25 @@ rem Licensed under the MIT License.
 setlocal
 set error=0
 
+if %PROCESSOR_ARCHITECTURE%.==ARM64. (set FXCARCH=arm64) else (if %PROCESSOR_ARCHITECTURE%.==AMD64. (set FXCARCH=x64) else (set FXCARCH=x86))
+
 set FXCOPTS=/nologo /WX /Ges /Qstrip_reflect /Qstrip_debug
 
-set PCFXC="%WindowsSdkVerBinPath%x86\fxc.exe"
+if defined LegacyShaderCompiler goto fxcviaenv
+set PCFXC="%WindowsSdkVerBinPath%%FXCARCH%\fxc.exe"
 if exist %PCFXC% goto continue
-set PCFXC="%WindowsSdkBinPath%%WindowsSDKVersion%\x86\fxc.exe"
+set PCFXC="%WindowsSdkBinPath%%WindowsSDKVersion%\%FXCARCH%\fxc.exe"
 if exist %PCFXC% goto continue
-set PCFXC="%WindowsSdkDir%bin\%WindowsSDKVersion%\x86\fxc.exe"
+set PCFXC="%WindowsSdkDir%bin\%WindowsSDKVersion%\%FXCARCH%\fxc.exe"
 if exist %PCFXC% goto continue
 
 set PCFXC=fxc.exe
+goto continue
+
+:fxcviaenv
+set PCFXC="%LegacyShaderCompiler%"
+if not exist %PCFXC% goto needfxc
+goto continue
 
 :continue
 if not defined CompileShadersOutput set CompileShadersOutput=Shaders
@@ -23,45 +32,50 @@ set StrTrim=%StrTrim: ##=%
 set CompileShadersOutput=%StrTrim:##=%
 @if not exist "%CompileShadersOutput%" mkdir "%CompileShadersOutput%"
 
-
-set FXC=%PCFXC% ddsview.fx %FXCOPTS% /EVS /Tvs_4_1 /Fh%CompileShadersOutput%\ddsview_vs.inc
+set FXC=%PCFXC% ddsview.hlsl %FXCOPTS% /EVS /Tvs_4_1 /Fh%CompileShadersOutput%\ddsview_vs.inc
 echo %FXC%
 %FXC%
 @if ERRORLEVEL 1 goto error
 
-set FXC=%PCFXC% ddsview.fx %FXCOPTS% /EPS_1D /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps1D.inc
+set FXC=%PCFXC% ddsview.hlsl %FXCOPTS% /EPS_1D /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps1D.inc
 echo %FXC%
 %FXC%
 @if ERRORLEVEL 1 goto error
 
-set FXC=%PCFXC% ddsview.fx %FXCOPTS% /EPS_1DArray /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps1Darray.inc
+set FXC=%PCFXC% ddsview.hlsl %FXCOPTS% /EPS_1DArray /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps1Darray.inc
 echo %FXC%
 %FXC%
 @if ERRORLEVEL 1 goto error
 
-set FXC=%PCFXC% ddsview.fx %FXCOPTS% /EPS_2D /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps2D.inc
+set FXC=%PCFXC% ddsview.hlsl %FXCOPTS% /EPS_2D /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps2D.inc
 echo %FXC%
 %FXC%
 @if ERRORLEVEL 1 goto error
 
-set FXC=%PCFXC% ddsview.fx %FXCOPTS% /EPS_2DArray /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps2Darray.inc
+set FXC=%PCFXC% ddsview.hlsl %FXCOPTS% /EPS_2DArray /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps2Darray.inc
 echo %FXC%
 %FXC%
 @if ERRORLEVEL 1 goto error
 
-set FXC=%PCFXC% ddsview.fx %FXCOPTS% /EPS_3D /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps3D.inc
+set FXC=%PCFXC% ddsview.hlsl %FXCOPTS% /EPS_3D /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_ps3D.inc
 echo %FXC%
 %FXC%
 @if ERRORLEVEL 1 goto error
 
-set FXC=%PCFXC% ddsview.fx %FXCOPTS% /EPS_Cube /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_psCube.inc
+set FXC=%PCFXC% ddsview.hlsl %FXCOPTS% /EPS_Cube /Tps_4_1 /Fh%CompileShadersOutput%\ddsview_psCube.inc
 echo %FXC%
 %FXC%
 @if ERRORLEVEL 1 goto error
 
 @echo --- Shaders built ok ---
-@goto end
+endlocal
+exit /b 0
+
 :error
 @echo --- ERROR: Shader build failed ---
 exit /b 1
-:end
\ No newline at end of file
+
+:needfxc
+echo ERROR: CompileShaders requires FXC.EXE
+exit /b 1
+:end
diff --git a/Texassemble/texassemble.cpp b/Texassemble/texassemble.cpp
index 82b7b470..e9695a1e 100644
--- a/Texassemble/texassemble.cpp
+++ b/Texassemble/texassemble.cpp
@@ -280,6 +280,8 @@ namespace
         { nullptr, DXGI_FORMAT_UNKNOWN }
     };
 
+    #undef DEFFMT
+
     const SValue<DXGI_FORMAT> g_pFormatAliases[] =
     {
         { L"RGBA", DXGI_FORMAT_R8G8B8A8_UNORM },
diff --git a/Texconv/texconv.cpp b/Texconv/texconv.cpp
index 784d6f62..1dce6b3d 100644
--- a/Texconv/texconv.cpp
+++ b/Texconv/texconv.cpp
@@ -444,6 +444,8 @@ namespace
         { nullptr, DXGI_FORMAT_UNKNOWN }
     };
 
+    #undef DEFFMT
+
     const SValue<uint32_t> g_pFilters[] =
     {
         { L"POINT",                     TEX_FILTER_POINT },
diff --git a/Texdiag/texdiag.cpp b/Texdiag/texdiag.cpp
index cbbc0b78..fccf3435 100644
--- a/Texdiag/texdiag.cpp
+++ b/Texdiag/texdiag.cpp
@@ -325,6 +325,8 @@ namespace
         { nullptr, DXGI_FORMAT_UNKNOWN }
     };
 
+    #undef DEFFMT
+
     const SValue<uint32_t> g_pFilters[] =
     {
         { L"POINT",                     TEX_FILTER_POINT },

From 4b409a959cd9a45592f0283bf2d2d638cc649d82 Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Mon, 16 Sep 2024 17:03:33 -0700
Subject: [PATCH 03/11] Fix MinGW pipeline

---
 build/DirectXTex-GitHub-MinGW.yml | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/build/DirectXTex-GitHub-MinGW.yml b/build/DirectXTex-GitHub-MinGW.yml
index 996aaa3e..c9c6441f 100644
--- a/build/DirectXTex-GitHub-MinGW.yml
+++ b/build/DirectXTex-GitHub-MinGW.yml
@@ -63,6 +63,7 @@ variables:
   WIN11_SDK: '10.0.22000.0'
   URL_MINGW32: https://github.com/brechtsanders/winlibs_mingw/releases/download/12.2.0-14.0.6-10.0.0-ucrt-r2/winlibs-i686-posix-dwarf-gcc-12.2.0-llvm-14.0.6-mingw-w64ucrt-10.0.0-r2.zip
   HASH_MINGW32: 'fcd1e11b896190da01c83d5b5fb0d37b7c61585e53446c2dab0009debc3915e757213882c35e35396329338de6f0222ba012e23a5af86932db45186a225d1272'
+  CompiledShaderOutput: $(Build.BinariesDirectory)\Shaders
 
 jobs:
 - job: MINGW32_BUILD
@@ -156,7 +157,7 @@ jobs:
     displayName: CMake (MinGW32)
     inputs:
       cwd: '$(Build.SourcesDirectory)'
-      cmakeArgs: -B out -DCMAKE_BUILD_TYPE="Debug" -DDIRECTX_ARCH=x86 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x86-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.SourcesDirectory)\DirectXTex\Shaders\Compiled -DCOMPILED_DDSVIEW_SHADERS=$(Build.SourcesDirectory)\DDSView\Shaders
+      cmakeArgs: -B out -DCMAKE_BUILD_TYPE="Debug" -DDIRECTX_ARCH=x86 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x86-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.BinariesDirectory)\Shaders
   - task: CMake@1
     displayName: CMake (MinGW32) Build
     inputs:
@@ -166,7 +167,7 @@ jobs:
     displayName: CMake (MinGW32) w/ OpenEXR
     inputs:
       cwd: '$(Build.SourcesDirectory)'
-      cmakeArgs: -B out2 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_OPENEXR_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x86 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x86-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.SourcesDirectory)\DirectXTex\Shaders\Compiled -DCOMPILED_DDSVIEW_SHADERS=$(Build.SourcesDirectory)\DDSView\Shaders
+      cmakeArgs: -B out2 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_OPENEXR_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x86 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x86-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.BinariesDirectory)\Shaders
   - task: CMake@1
     displayName: CMake (MinGW32) Build  w/ OpenEXR
     inputs:
@@ -176,7 +177,7 @@ jobs:
     displayName: CMake (MinGW32) w/ libjpeg
     inputs:
       cwd: '$(Build.SourcesDirectory)'
-      cmakeArgs: -B out3 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_LIBJPEG_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x86 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x86-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.SourcesDirectory)\DirectXTex\Shaders\Compiled -DCOMPILED_DDSVIEW_SHADERS=$(Build.SourcesDirectory)\DDSView\Shaders
+      cmakeArgs: -B out3 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_LIBJPEG_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x86 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x86-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.BinariesDirectory)\Shaders
   - task: CMake@1
     displayName: CMake (MinGW32) Build w/ libjpeg
     inputs:
@@ -186,7 +187,7 @@ jobs:
     displayName: CMake (MinGW32) w/ libpng
     inputs:
       cwd: '$(Build.SourcesDirectory)'
-      cmakeArgs: -B out4 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_LIBPNG_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x86 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x86-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.SourcesDirectory)\DirectXTex\Shaders\Compiled -DCOMPILED_DDSVIEW_SHADERS=$(Build.SourcesDirectory)\DDSView\Shaders
+      cmakeArgs: -B out4 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_LIBPNG_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x86 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x86-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.BinariesDirectory)\Shaders
   - task: CMake@1
     displayName: CMake (MinGW32) Build w/ libpng
     inputs:
@@ -274,7 +275,7 @@ jobs:
     displayName: CMake (MinGW-W64)
     inputs:
       cwd: '$(Build.SourcesDirectory)'
-      cmakeArgs: -B out -DCMAKE_BUILD_TYPE="Debug" -DDIRECTX_ARCH=x64 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles"  -DVCPKG_TARGET_TRIPLET=x64-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.SourcesDirectory)\DirectXTex\Shaders\Compiled -DCOMPILED_DDSVIEW_SHADERS=$(Build.SourcesDirectory)\DDSView\Shaders
+      cmakeArgs: -B out -DCMAKE_BUILD_TYPE="Debug" -DDIRECTX_ARCH=x64 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles"  -DVCPKG_TARGET_TRIPLET=x64-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.BinariesDirectory)\Shaders
   - task: CMake@1
     displayName: CMake (MinGW-W64) Build
     inputs:
@@ -284,7 +285,7 @@ jobs:
     displayName: CMake (MinGW-W64) w/ OpenEXR
     inputs:
       cwd: '$(Build.SourcesDirectory)'
-      cmakeArgs: -B out2 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_OPENEXR_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x64 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x64-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.SourcesDirectory)\DirectXTex\Shaders\Compiled -DCOMPILED_DDSVIEW_SHADERS=$(Build.SourcesDirectory)\DDSView\Shaders
+      cmakeArgs: -B out2 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_OPENEXR_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x64 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x64-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.BinariesDirectory)\Shaders
   - task: CMake@1
     displayName: CMake (MinGW-W64) Build  w/ OpenEXR
     inputs:
@@ -294,7 +295,7 @@ jobs:
     displayName: CMake (MinGW-W64) w/ libjpeg
     inputs:
       cwd: '$(Build.SourcesDirectory)'
-      cmakeArgs: -B out3 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_LIBJPEG_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x64 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x64-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.SourcesDirectory)\DirectXTex\Shaders\Compiled -DCOMPILED_DDSVIEW_SHADERS=$(Build.SourcesDirectory)\DDSView\Shaders
+      cmakeArgs: -B out3 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_LIBJPEG_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x64 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x64-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.BinariesDirectory)\Shaders
   - task: CMake@1
     displayName: CMake (MinGW-W64) Build w/ libjpeg
     inputs:
@@ -304,7 +305,7 @@ jobs:
     displayName: CMake (MinGW-W64) w/ libpng
     inputs:
       cwd: '$(Build.SourcesDirectory)'
-      cmakeArgs: -B out4 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_LIBPNG_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x64 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x64-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.SourcesDirectory)\DirectXTex\Shaders\Compiled -DCOMPILED_DDSVIEW_SHADERS=$(Build.SourcesDirectory)\DDSView\Shaders
+      cmakeArgs: -B out4 -DCMAKE_BUILD_TYPE="Debug" -DENABLE_LIBPNG_SUPPORT=ON -DBUILD_TESTING=OFF -DDIRECTX_ARCH=x64 -DCMAKE_TOOLCHAIN_FILE="$(VCPKG_CMAKE_DIR)" -DCMAKE_CXX_COMPILER="g++.exe" -G "MinGW Makefiles" -DVCPKG_TARGET_TRIPLET=x64-mingw-static -DUSE_PREBUILT_SHADERS=ON -DCOMPILED_SHADERS=$(Build.BinariesDirectory)\Shaders
   - task: CMake@1
     displayName: CMake (MinGW-W64) Build w/ libpng
     inputs:

From 07c8ee11e387a314780615f41cf9d3d99fcd030c Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Mon, 16 Sep 2024 17:07:56 -0700
Subject: [PATCH 04/11] Fix again

---
 build/DirectXTex-GitHub-MinGW.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build/DirectXTex-GitHub-MinGW.yml b/build/DirectXTex-GitHub-MinGW.yml
index c9c6441f..027ea39b 100644
--- a/build/DirectXTex-GitHub-MinGW.yml
+++ b/build/DirectXTex-GitHub-MinGW.yml
@@ -63,7 +63,7 @@ variables:
   WIN11_SDK: '10.0.22000.0'
   URL_MINGW32: https://github.com/brechtsanders/winlibs_mingw/releases/download/12.2.0-14.0.6-10.0.0-ucrt-r2/winlibs-i686-posix-dwarf-gcc-12.2.0-llvm-14.0.6-mingw-w64ucrt-10.0.0-r2.zip
   HASH_MINGW32: 'fcd1e11b896190da01c83d5b5fb0d37b7c61585e53446c2dab0009debc3915e757213882c35e35396329338de6f0222ba012e23a5af86932db45186a225d1272'
-  CompiledShaderOutput: $(Build.BinariesDirectory)\Shaders
+  CompileShadersOutput: $(Build.BinariesDirectory)\Shaders
 
 jobs:
 - job: MINGW32_BUILD

From fb1739fd5f0b59d1be9c4d5a8dacf238d9364b27 Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Mon, 16 Sep 2024 21:31:04 -0700
Subject: [PATCH 05/11] Code review

---
 Common/CmdLineHelpers.h     | 17 ++++++++++++++---
 Texassemble/texassemble.cpp |  1 -
 Texconv/texconv.cpp         |  1 -
 Texdiag/texdiag.cpp         |  1 -
 4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/Common/CmdLineHelpers.h b/Common/CmdLineHelpers.h
index 2cf26b18..714f47a8 100644
--- a/Common/CmdLineHelpers.h
+++ b/Common/CmdLineHelpers.h
@@ -13,6 +13,17 @@
 #error Requires C++17 (and /Zc:__cplusplus with MSVC)
 #endif
 
+#include <algorithm>
+#include <cstdio>
+#include <cwchar>
+#include <filesystem>
+#include <fstream>
+#include <list>
+#include <memory>
+#include <set>
+#include <string>
+
+
 namespace Helpers
 {
     inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
@@ -39,7 +50,7 @@ namespace Helpers
     };
 
     template<typename T>
-    T LookupByName(const wchar_t *pName, const SValue<T> *pArray)
+    T LookupByName(const wchar_t _In_z_ *pName, const SValue<T> *pArray)
     {
         while (pArray->name)
         {
@@ -167,7 +178,7 @@ namespace Helpers
         }
     }
 
-    void SearchForFiles(const std::filesystem::path& path, std::list<SConversion>& files, bool recursive, const wchar_t* folder)
+    void SearchForFiles(const std::filesystem::path& path, std::list<SConversion>& files, bool recursive, _In_opt_z_ const wchar_t* folder)
     {
         // Process files
         WIN32_FIND_DATAW findData = {};
@@ -342,7 +353,7 @@ namespace Helpers
             if (errorText)
                 LocalFree(errorText);
 
-            for (wchar_t* ptr = desc; *ptr != 0; ++ptr)
+            for(wchar_t* ptr = desc; *ptr != 0; ++ptr)
             {
                 if (*ptr == L'\r' || *ptr == L'\n')
                 {
diff --git a/Texassemble/texassemble.cpp b/Texassemble/texassemble.cpp
index e9695a1e..86e4c71b 100644
--- a/Texassemble/texassemble.cpp
+++ b/Texassemble/texassemble.cpp
@@ -44,7 +44,6 @@
 #include <locale>
 #include <memory>
 #include <new>
-#include <set>
 #include <string>
 #include <tuple>
 #include <utility>
diff --git a/Texconv/texconv.cpp b/Texconv/texconv.cpp
index 1dce6b3d..feae09aa 100644
--- a/Texconv/texconv.cpp
+++ b/Texconv/texconv.cpp
@@ -45,7 +45,6 @@
 #include <locale>
 #include <memory>
 #include <new>
-#include <set>
 #include <string>
 #include <tuple>
 
diff --git a/Texdiag/texdiag.cpp b/Texdiag/texdiag.cpp
index fccf3435..cdbafdd3 100644
--- a/Texdiag/texdiag.cpp
+++ b/Texdiag/texdiag.cpp
@@ -44,7 +44,6 @@
 #include <locale>
 #include <memory>
 #include <new>
-#include <set>
 #include <string>
 #include <tuple>
 #include <vector>

From 9c396182d807441affe31ba73d3b8889b45c5016 Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Mon, 16 Sep 2024 23:53:16 -0700
Subject: [PATCH 06/11] Moved D3DX12.h to Common

---
 CMakeLists.txt                                | 10 +++++-----
 {DirectXTex => Common}/d3dx12.h               |  0
 DDSView/DDSView.rc                            |  2 +-
 DirectXTex/DirectXTex_Desktop_2019.vcxproj    | 12 +++++------
 .../DirectXTex_Desktop_2019_Win10.vcxproj     | 20 +++++++++----------
 ...ectXTex_Desktop_2019_Win10.vcxproj.filters |  2 +-
 DirectXTex/DirectXTex_Desktop_2022.vcxproj    | 12 +++++------
 .../DirectXTex_Desktop_2022_Win10.vcxproj     | 20 +++++++++----------
 ...ectXTex_Desktop_2022_Win10.vcxproj.filters |  2 +-
 DirectXTex/DirectXTex_GDK_2019.vcxproj        | 20 +++++++++----------
 .../DirectXTex_GDK_2019.vcxproj.filters       |  6 +++---
 DirectXTex/DirectXTex_GDK_2022.vcxproj        | 20 +++++++++----------
 .../DirectXTex_GDK_2022.vcxproj.filters       |  6 +++---
 DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj    | 10 +++++-----
 .../DirectXTex_GXDK_PC_2019.vcxproj.filters   |  6 +++---
 DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj    | 10 +++++-----
 .../DirectXTex_GXDK_PC_2022.vcxproj.filters   |  6 +++---
 DirectXTex/DirectXTex_Windows10_2022.vcxproj  | 14 ++++++-------
 .../DirectXTex_Windows10_2022.vcxproj.filters |  2 +-
 README.md                                     |  4 ++++
 Texassemble/texassemble.rc                    |  2 +-
 Texconv/Texconv.rc                            |  2 +-
 Texdiag/texdiag.rc                            |  2 +-
 23 files changed, 97 insertions(+), 93 deletions(-)
 rename {DirectXTex => Common}/d3dx12.h (100%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 84b34336..4b7f1539 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -143,7 +143,6 @@ elseif((BUILD_XBOX_EXTS_XBOXONE OR BUILD_XBOX_EXTS_SCARLETT) AND WIN32)
        Auxiliary/DirectXTexXboxTile.cpp)
 endif()
 
-
 if(BUILD_DX11 AND WIN32 AND (NOT (XBOX_CONSOLE_TARGET STREQUAL "durango")))
     set(SHADER_SOURCES
         DirectXTex/Shaders/BC6HEncode.hlsl
@@ -160,7 +159,7 @@ if(BUILD_DX12)
    list(APPEND LIBRARY_SOURCES DirectXTex/DirectXTexD3D12.cpp)
 
    if(NOT (DEFINED XBOX_CONSOLE_TARGET))
-       list(APPEND LIBRARY_SOURCES DirectXTex/d3dx12.h)
+       list(APPEND LIBRARY_SOURCES Common/d3dx12.h)
    endif()
 endif()
 
@@ -407,7 +406,6 @@ if(BUILD_TOOLS AND WIN32)
     Common/CmdLineHelpers.h
     Common/settings.manifest
     Texassemble/AnimatedGif.cpp)
-  target_include_directories(texassemble PRIVATE Common)
   target_compile_features(texassemble PRIVATE cxx_std_17)
   target_link_libraries(texassemble PRIVATE ${PROJECT_NAME} ole32.lib version.lib)
   source_group(texassemble REGULAR_EXPRESSION Texassemble/*.*)
@@ -422,7 +420,6 @@ if(BUILD_TOOLS AND BUILD_DX11 AND WIN32)
     Common/settings.manifest
     Texconv/ExtendedBMP.cpp
     Texconv/PortablePixMap.cpp)
-  target_include_directories(texconv PRIVATE Common)
   target_compile_features(texconv PRIVATE cxx_std_17)
   target_link_libraries(texconv PRIVATE ${PROJECT_NAME} ole32.lib shell32.lib version.lib)
   source_group(texconv REGULAR_EXPRESSION Texconv/*.*)
@@ -435,13 +432,16 @@ if(BUILD_TOOLS AND WIN32)
     Texdiag/texdiag.rc
     Common/CmdLineHelpers.h
     Common/settings.manifest)
-  target_include_directories(texdiag PRIVATE Common)
   target_compile_features(texdiag PRIVATE cxx_std_17)
   target_link_libraries(texdiag PRIVATE ${PROJECT_NAME} ole32.lib version.lib)
   source_group(texdiag REGULAR_EXPRESSION Texdiag/*.*)
   list(APPEND TOOL_EXES texdiag)
 endif()
 
+foreach(t IN LISTS TOOL_EXES ITEMS ${PROJECT_NAME})
+  target_include_directories(${t} PRIVATE Common)
+endforeach()
+
 if(BUILD_TOOLS AND WIN32)
   if(ENABLE_OPENEXR_SUPPORT)
     foreach(t IN LISTS TOOL_EXES)
diff --git a/DirectXTex/d3dx12.h b/Common/d3dx12.h
similarity index 100%
rename from DirectXTex/d3dx12.h
rename to Common/d3dx12.h
diff --git a/DDSView/DDSView.rc b/DDSView/DDSView.rc
index c1986b18..ebcaf050 100644
--- a/DDSView/DDSView.rc
+++ b/DDSView/DDSView.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_MAIN_ICON           ICON                    "..\Common\directx.ico"
+IDI_MAIN_ICON           ICON                    "..\\Common\\directx.ico"
 
 #ifdef APSTUDIO_INVOKED
 /////////////////////////////////////////////////////////////////////////////
diff --git a/DirectXTex/DirectXTex_Desktop_2019.vcxproj b/DirectXTex/DirectXTex_Desktop_2019.vcxproj
index 61e78836..9d7a6f66 100644
--- a/DirectXTex/DirectXTex_Desktop_2019.vcxproj
+++ b/DirectXTex/DirectXTex_Desktop_2019.vcxproj
@@ -141,7 +141,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -168,7 +168,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -195,7 +195,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -221,7 +221,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -249,7 +249,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -275,7 +275,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
diff --git a/DirectXTex/DirectXTex_Desktop_2019_Win10.vcxproj b/DirectXTex/DirectXTex_Desktop_2019_Win10.vcxproj
index 23c1d402..4cdc5fb8 100644
--- a/DirectXTex/DirectXTex_Desktop_2019_Win10.vcxproj
+++ b/DirectXTex/DirectXTex_Desktop_2019_Win10.vcxproj
@@ -196,7 +196,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -223,7 +223,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -250,7 +250,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -277,7 +277,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -303,7 +303,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -330,7 +330,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -358,7 +358,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -384,7 +384,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -411,7 +411,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -437,12 +437,12 @@
     </None>
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\Common\d3dx12.h" />
     <CLInclude Include="BC.h" />
     <ClCompile Include="BC.cpp" />
     <ClCompile Include="BC4BC5.cpp" />
     <ClCompile Include="BC6HBC7.cpp" />
     <ClInclude Include="BCDirectCompute.h" />
-    <ClInclude Include="d3dx12.h" />
     <CLInclude Include="DDS.h" />
     <ClInclude Include="filters.h" />
     <CLInclude Include="scoped.h" />
diff --git a/DirectXTex/DirectXTex_Desktop_2019_Win10.vcxproj.filters b/DirectXTex/DirectXTex_Desktop_2019_Win10.vcxproj.filters
index d8bca586..18d2b226 100644
--- a/DirectXTex/DirectXTex_Desktop_2019_Win10.vcxproj.filters
+++ b/DirectXTex/DirectXTex_Desktop_2019_Win10.vcxproj.filters
@@ -36,7 +36,7 @@
     <CLInclude Include="scoped.h">
       <Filter>Source Files</Filter>
     </CLInclude>
-    <ClInclude Include="d3dx12.h">
+    <ClInclude Include="..\Common\d3dx12.h">
       <Filter>Source Files</Filter>
     </ClInclude>
   </ItemGroup>
diff --git a/DirectXTex/DirectXTex_Desktop_2022.vcxproj b/DirectXTex/DirectXTex_Desktop_2022.vcxproj
index 06e10cdb..d79c3dc3 100644
--- a/DirectXTex/DirectXTex_Desktop_2022.vcxproj
+++ b/DirectXTex/DirectXTex_Desktop_2022.vcxproj
@@ -141,7 +141,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -168,7 +168,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -195,7 +195,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -221,7 +221,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -249,7 +249,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -275,7 +275,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN7_PLATFORM_UPDATE;_WIN32_WINNT=0x0601;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
diff --git a/DirectXTex/DirectXTex_Desktop_2022_Win10.vcxproj b/DirectXTex/DirectXTex_Desktop_2022_Win10.vcxproj
index a753d606..85d2ddc1 100644
--- a/DirectXTex/DirectXTex_Desktop_2022_Win10.vcxproj
+++ b/DirectXTex/DirectXTex_Desktop_2022_Win10.vcxproj
@@ -196,7 +196,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -223,7 +223,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -250,7 +250,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -277,7 +277,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -303,7 +303,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -330,7 +330,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -358,7 +358,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -384,7 +384,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -411,7 +411,7 @@
       <PreprocessorDefinitions>_UNICODE;UNICODE;WIN32;NDEBUG;PROFILE;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -437,12 +437,12 @@
     </None>
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\Common\d3dx12.h" />
     <CLInclude Include="BC.h" />
     <ClCompile Include="BC.cpp" />
     <ClCompile Include="BC4BC5.cpp" />
     <ClCompile Include="BC6HBC7.cpp" />
     <ClInclude Include="BCDirectCompute.h" />
-    <ClInclude Include="d3dx12.h" />
     <CLInclude Include="DDS.h" />
     <ClInclude Include="filters.h" />
     <CLInclude Include="scoped.h" />
diff --git a/DirectXTex/DirectXTex_Desktop_2022_Win10.vcxproj.filters b/DirectXTex/DirectXTex_Desktop_2022_Win10.vcxproj.filters
index d8bca586..18d2b226 100644
--- a/DirectXTex/DirectXTex_Desktop_2022_Win10.vcxproj.filters
+++ b/DirectXTex/DirectXTex_Desktop_2022_Win10.vcxproj.filters
@@ -36,7 +36,7 @@
     <CLInclude Include="scoped.h">
       <Filter>Source Files</Filter>
     </CLInclude>
-    <ClInclude Include="d3dx12.h">
+    <ClInclude Include="..\Common\d3dx12.h">
       <Filter>Source Files</Filter>
     </ClInclude>
   </ItemGroup>
diff --git a/DirectXTex/DirectXTex_GDK_2019.vcxproj b/DirectXTex/DirectXTex_GDK_2019.vcxproj
index a896fb51..814ed5a2 100644
--- a/DirectXTex/DirectXTex_GDK_2019.vcxproj
+++ b/DirectXTex/DirectXTex_GDK_2019.vcxproj
@@ -239,7 +239,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -265,7 +265,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -292,7 +292,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -318,7 +318,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;_LIB;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -344,7 +344,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -371,7 +371,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -394,7 +394,7 @@
     </Link>
     <ClCompile>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <MinimalRebuild>false</MinimalRebuild>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -419,7 +419,7 @@
     </Link>
     <ClCompile>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <MinimalRebuild>false</MinimalRebuild>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -444,7 +444,7 @@
     </Link>
     <ClCompile>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <MinimalRebuild>false</MinimalRebuild>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -462,8 +462,8 @@
     </FXCompile>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="..\Common\d3dx12.h" />
     <ClInclude Include="BC.h" />
-    <ClInclude Include="d3dx12.h" />
     <ClInclude Include="DDS.h" />
     <ClInclude Include="DirectXTex.h" />
     <ClInclude Include="DirectXTexP.h" />
diff --git a/DirectXTex/DirectXTex_GDK_2019.vcxproj.filters b/DirectXTex/DirectXTex_GDK_2019.vcxproj.filters
index b9cc3abf..dea8b959 100644
--- a/DirectXTex/DirectXTex_GDK_2019.vcxproj.filters
+++ b/DirectXTex/DirectXTex_GDK_2019.vcxproj.filters
@@ -35,12 +35,12 @@
     <ClInclude Include="scoped.h">
       <Filter>Source Files</Filter>
     </ClInclude>
-    <ClInclude Include="d3dx12.h">
-      <Filter>Source Files</Filter>
-    </ClInclude>
     <ClInclude Include="..\Auxiliary\DirectXTexXbox.h">
       <Filter>Auxiliary</Filter>
     </ClInclude>
+    <ClInclude Include="..\Common\d3dx12.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="DirectXTex.inl">
diff --git a/DirectXTex/DirectXTex_GDK_2022.vcxproj b/DirectXTex/DirectXTex_GDK_2022.vcxproj
index 52a37fda..f9c878df 100644
--- a/DirectXTex/DirectXTex_GDK_2022.vcxproj
+++ b/DirectXTex/DirectXTex_GDK_2022.vcxproj
@@ -239,7 +239,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -265,7 +265,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -292,7 +292,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -318,7 +318,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;_LIB;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -344,7 +344,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -371,7 +371,7 @@
     <ClCompile>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <Optimization>MaxSpeed</Optimization>
       <PreprocessorDefinitions>NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -394,7 +394,7 @@
     </Link>
     <ClCompile>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <MinimalRebuild>false</MinimalRebuild>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -419,7 +419,7 @@
     </Link>
     <ClCompile>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <MinimalRebuild>false</MinimalRebuild>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -444,7 +444,7 @@
     </Link>
     <ClCompile>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <MinimalRebuild>false</MinimalRebuild>
       <WarningLevel>EnableAllWarnings</WarningLevel>
@@ -462,8 +462,8 @@
     </FXCompile>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="..\Common\d3dx12.h" />
     <ClInclude Include="BC.h" />
-    <ClInclude Include="d3dx12.h" />
     <ClInclude Include="DDS.h" />
     <ClInclude Include="DirectXTex.h" />
     <ClInclude Include="DirectXTexP.h" />
diff --git a/DirectXTex/DirectXTex_GDK_2022.vcxproj.filters b/DirectXTex/DirectXTex_GDK_2022.vcxproj.filters
index b9cc3abf..dea8b959 100644
--- a/DirectXTex/DirectXTex_GDK_2022.vcxproj.filters
+++ b/DirectXTex/DirectXTex_GDK_2022.vcxproj.filters
@@ -35,12 +35,12 @@
     <ClInclude Include="scoped.h">
       <Filter>Source Files</Filter>
     </ClInclude>
-    <ClInclude Include="d3dx12.h">
-      <Filter>Source Files</Filter>
-    </ClInclude>
     <ClInclude Include="..\Auxiliary\DirectXTexXbox.h">
       <Filter>Auxiliary</Filter>
     </ClInclude>
+    <ClInclude Include="..\Common\d3dx12.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="DirectXTex.inl">
diff --git a/DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj b/DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj
index a0fc2541..20056345 100644
--- a/DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj
+++ b/DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj
@@ -107,7 +107,7 @@
       <PreprocessorDefinitions>_USE_GXDK;USE_XBOX_EXTS;_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -135,7 +135,7 @@
       <PreprocessorDefinitions>_USE_GXDK;USE_XBOX_EXTS;_USE_SCARLETT;_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -162,7 +162,7 @@
       <PreprocessorDefinitions>_USE_GXDK;USE_XBOX_EXTS;_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -190,7 +190,7 @@
       <PreprocessorDefinitions>_USE_GXDK;USE_XBOX_EXTS;_USE_SCARLETT;_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -211,6 +211,7 @@
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClInclude Include="..\Auxiliary\DirectXTexXbox.h" />
+    <ClInclude Include="..\Common\d3dx12.h" />
     <CLInclude Include="BC.h" />
     <ClCompile Include="..\Auxiliary\DirectXTexXboxDDS.cpp" />
     <ClCompile Include="..\Auxiliary\DirectXTexXboxDetile.cpp" />
@@ -220,7 +221,6 @@
     <ClCompile Include="BC4BC5.cpp" />
     <ClCompile Include="BC6HBC7.cpp" />
     <ClInclude Include="BCDirectCompute.h" />
-    <ClInclude Include="d3dx12.h" />
     <CLInclude Include="DDS.h" />
     <ClInclude Include="filters.h" />
     <CLInclude Include="scoped.h" />
diff --git a/DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj.filters b/DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj.filters
index b8a9acf4..e076b712 100644
--- a/DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj.filters
+++ b/DirectXTex/DirectXTex_GXDK_PC_2019.vcxproj.filters
@@ -39,12 +39,12 @@
     <CLInclude Include="scoped.h">
       <Filter>Source Files</Filter>
     </CLInclude>
-    <ClInclude Include="d3dx12.h">
-      <Filter>Source Files</Filter>
-    </ClInclude>
     <ClInclude Include="..\Auxiliary\DirectXTexXbox.h">
       <Filter>Auxiliary</Filter>
     </ClInclude>
+    <ClInclude Include="..\Common\d3dx12.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="BC.cpp">
diff --git a/DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj b/DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj
index 531e781a..36d69f0f 100644
--- a/DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj
+++ b/DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj
@@ -107,7 +107,7 @@
       <PreprocessorDefinitions>_USE_GXDK;USE_XBOX_EXTS;_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -135,7 +135,7 @@
       <PreprocessorDefinitions>_USE_GXDK;USE_XBOX_EXTS;_USE_SCARLETT;_UNICODE;UNICODE;WIN32;_DEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -162,7 +162,7 @@
       <PreprocessorDefinitions>_USE_GXDK;USE_XBOX_EXTS;_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -190,7 +190,7 @@
       <PreprocessorDefinitions>_USE_GXDK;USE_XBOX_EXTS;_USE_SCARLETT;_UNICODE;UNICODE;WIN32;NDEBUG;_LIB;_WIN32_WINNT=0x0A00;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <SDLCheck>true</SDLCheck>
       <ConformanceMode>true</ConformanceMode>
@@ -211,6 +211,7 @@
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClInclude Include="..\Auxiliary\DirectXTexXbox.h" />
+    <ClInclude Include="..\Common\d3dx12.h" />
     <CLInclude Include="BC.h" />
     <ClCompile Include="..\Auxiliary\DirectXTexXboxDDS.cpp" />
     <ClCompile Include="..\Auxiliary\DirectXTexXboxDetile.cpp" />
@@ -220,7 +221,6 @@
     <ClCompile Include="BC4BC5.cpp" />
     <ClCompile Include="BC6HBC7.cpp" />
     <ClInclude Include="BCDirectCompute.h" />
-    <ClInclude Include="d3dx12.h" />
     <CLInclude Include="DDS.h" />
     <ClInclude Include="filters.h" />
     <CLInclude Include="scoped.h" />
diff --git a/DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj.filters b/DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj.filters
index 4b1d4d70..c04634fa 100644
--- a/DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj.filters
+++ b/DirectXTex/DirectXTex_GXDK_PC_2022.vcxproj.filters
@@ -39,12 +39,12 @@
     <CLInclude Include="scoped.h">
       <Filter>Source Files</Filter>
     </CLInclude>
-    <ClInclude Include="d3dx12.h">
-      <Filter>Source Files</Filter>
-    </ClInclude>
     <ClInclude Include="..\Auxiliary\DirectXTexXbox.h">
       <Filter>Auxiliary</Filter>
     </ClInclude>
+    <ClInclude Include="..\Common\d3dx12.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="BC.cpp">
diff --git a/DirectXTex/DirectXTex_Windows10_2022.vcxproj b/DirectXTex/DirectXTex_Windows10_2022.vcxproj
index d5c7f386..e985e55e 100644
--- a/DirectXTex/DirectXTex_Windows10_2022.vcxproj
+++ b/DirectXTex/DirectXTex_Windows10_2022.vcxproj
@@ -57,9 +57,9 @@
     <ClCompile Include="DirectXTexWIC.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\Common\d3dx12.h" />
     <ClInclude Include="BC.h" />
     <ClInclude Include="BCDirectCompute.h" />
-    <ClInclude Include="d3dx12.h" />
     <ClInclude Include="DDS.h" />
     <ClInclude Include="DirectXTex.h" />
     <ClInclude Include="DirectXTexP.h" />
@@ -195,7 +195,7 @@
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
@@ -221,7 +221,7 @@
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
@@ -245,7 +245,7 @@
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
@@ -271,7 +271,7 @@
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
@@ -295,7 +295,7 @@
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
@@ -320,7 +320,7 @@
       <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
       <WarningLevel>EnableAllWarnings</WarningLevel>
       <PrecompiledHeaderFile>DirectXTexP.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(ProjectDir);..\Common;$(ProjectDir)Shaders\Compiled;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
       <AdditionalOptions>/Zc:twoPhase- /Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
diff --git a/DirectXTex/DirectXTex_Windows10_2022.vcxproj.filters b/DirectXTex/DirectXTex_Windows10_2022.vcxproj.filters
index caccf470..d52dd196 100644
--- a/DirectXTex/DirectXTex_Windows10_2022.vcxproj.filters
+++ b/DirectXTex/DirectXTex_Windows10_2022.vcxproj.filters
@@ -115,7 +115,7 @@
     <ClInclude Include="scoped.h">
       <Filter>Source Files</Filter>
     </ClInclude>
-    <ClInclude Include="d3dx12.h">
+    <ClInclude Include="..\Common\d3dx12.h">
       <Filter>Source Files</Filter>
     </ClInclude>
   </ItemGroup>
diff --git a/README.md b/README.md
index 7b8800a1..e34d0f62 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,10 @@ These components are designed to work without requiring any content from the leg
 
   + Contains optional source files for the DirectXTex library, such as adapter loading functions using the OpenEXR library, Xbox texture tiling extensions, etc.
 
+* ``Common\``
+
+  + Contains shared source headers used by the DirectXTex library and tools.
+
 * ``Texconv\``
 
   + This DirectXTex sample is an implementation of the [texconv](https://github.com/Microsoft/DirectXTex/wiki/Texconv) command-line texture utility from the DirectX SDK utilizing DirectXTex rather than D3DX.
diff --git a/Texassemble/texassemble.rc b/Texassemble/texassemble.rc
index 48cca03a..fdb26fb2 100644
--- a/Texassemble/texassemble.rc
+++ b/Texassemble/texassemble.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_MAIN_ICON           ICON                    "..\Common\directx.ico"
+IDI_MAIN_ICON           ICON                    "..\\Common\\directx.ico"
 
 
 #ifdef APSTUDIO_INVOKED
diff --git a/Texconv/Texconv.rc b/Texconv/Texconv.rc
index 98116cf0..32d12fca 100644
--- a/Texconv/Texconv.rc
+++ b/Texconv/Texconv.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_MAIN_ICON           ICON                    "..\Common\directx.ico"
+IDI_MAIN_ICON           ICON                    "..\\Common\\directx.ico"
 
 
 #ifdef APSTUDIO_INVOKED
diff --git a/Texdiag/texdiag.rc b/Texdiag/texdiag.rc
index 180658be..4cba3166 100644
--- a/Texdiag/texdiag.rc
+++ b/Texdiag/texdiag.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_MAIN_ICON           ICON                    "..\Common\directx.ico"
+IDI_MAIN_ICON           ICON                    "..\\Common\\directx.ico"
 
 
 #ifdef APSTUDIO_INVOKED

From 2ab174c9fe2f5faac009e0a2ced963c5959c2e49 Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Tue, 17 Sep 2024 00:34:57 -0700
Subject: [PATCH 07/11] Sync

---
 Common/CmdLineHelpers.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Common/CmdLineHelpers.h b/Common/CmdLineHelpers.h
index 714f47a8..1e5d8e23 100644
--- a/Common/CmdLineHelpers.h
+++ b/Common/CmdLineHelpers.h
@@ -26,6 +26,10 @@
 
 namespace Helpers
 {
+    struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } };
+
+    using ScopedHandle = std::unique_ptr<void, handle_closer>;
+
     inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }
 
     struct find_closer { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) FindClose(h); } };

From 154b14fc549ab531410e9fe812cf776047c74971 Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Tue, 17 Sep 2024 10:33:12 -0700
Subject: [PATCH 08/11] Code review

---
 Common/CmdLineHelpers.h     | 6 +++++-
 Texassemble/texassemble.cpp | 1 +
 Texconv/texconv.cpp         | 1 +
 Texdiag/texdiag.cpp         | 1 +
 4 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/Common/CmdLineHelpers.h b/Common/CmdLineHelpers.h
index 1e5d8e23..b3af3ee5 100644
--- a/Common/CmdLineHelpers.h
+++ b/Common/CmdLineHelpers.h
@@ -23,6 +23,10 @@
 #include <set>
 #include <string>
 
+#ifndef TOOL_VERSION
+#error Define TOOL_VERSION before including this header
+#endif
+
 
 namespace Helpers
 {
@@ -164,7 +168,7 @@ namespace Helpers
 
         if (!*version || wcscmp(version, L"1.0.0.0") == 0)
         {
-            swprintf_s(version, L"%03d (library)", DIRECTX_TEX_VERSION);
+            swprintf_s(version, L"%03d (library)", TOOL_VERSION);
         }
 
         if (versionOnly)
diff --git a/Texassemble/texassemble.cpp b/Texassemble/texassemble.cpp
index 86e4c71b..91a9f543 100644
--- a/Texassemble/texassemble.cpp
+++ b/Texassemble/texassemble.cpp
@@ -75,6 +75,7 @@
 #include "DirectXTexPNG.h"
 #endif
 
+#define TOOL_VERSION DIRECTX_TEX_VERSION
 #include "CmdLineHelpers.h"
 
 using namespace Helpers;
diff --git a/Texconv/texconv.cpp b/Texconv/texconv.cpp
index feae09aa..e096cc13 100644
--- a/Texconv/texconv.cpp
+++ b/Texconv/texconv.cpp
@@ -81,6 +81,7 @@
 #include "DirectXTexXbox.h"
 #endif
 
+#define TOOL_VERSION DIRECTX_TEX_VERSION
 #include "CmdLineHelpers.h"
 
 using namespace Helpers;
diff --git a/Texdiag/texdiag.cpp b/Texdiag/texdiag.cpp
index cdbafdd3..c8a8e214 100644
--- a/Texdiag/texdiag.cpp
+++ b/Texdiag/texdiag.cpp
@@ -71,6 +71,7 @@
 #include "DirectXTexPNG.h"
 #endif
 
+#define TOOL_VERSION DIRECTX_TEX_VERSION
 #include "CmdLineHelpers.h"
 
 using namespace Helpers;

From 7bef0abb4babe580662983ac0f762d5675af511d Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Tue, 17 Sep 2024 10:59:18 -0700
Subject: [PATCH 09/11] Fix /analyze error

---
 ScreenGrab/ScreenGrab12.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/ScreenGrab/ScreenGrab12.cpp b/ScreenGrab/ScreenGrab12.cpp
index 7f4024b4..eee5f60a 100644
--- a/ScreenGrab/ScreenGrab12.cpp
+++ b/ScreenGrab/ScreenGrab12.cpp
@@ -811,6 +811,7 @@ namespace
         if (FAILED(hr))
             return hr;
 
+        _Analysis_assume_(*pStaging);
         assert(*pStaging);
 
         // Transition the resource if necessary

From f5a7c8a8af7057bb6e6ae6dca97be263727c11da Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Tue, 17 Sep 2024 11:23:37 -0700
Subject: [PATCH 10/11] CMake cleanup

---
 CMakeLists.txt    | 5 +++++
 CMakePresets.json | 3 ++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4b7f1539..b6753e06 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -510,6 +510,10 @@ if(directxmath_FOUND)
   endforeach()
 endif()
 
+if(TOOL_EXES)
+  message("INFO: Building tools: ${TOOL_EXES}")
+endif()
+
 if(MSVC)
     foreach(t IN LISTS TOOL_EXES ITEMS ${PROJECT_NAME})
       target_compile_options(${t} PRIVATE /Wall /GR-)
@@ -570,6 +574,7 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
     endif()
 
     if(ENABLE_CODE_ANALYSIS)
+      message(STATUS "Building with Code Analysis (PREFIX)")
       foreach(t IN LISTS TOOL_EXES ITEMS ${PROJECT_NAME})
         target_compile_options(${t} PRIVATE /analyze /WX)
       endforeach()
diff --git a/CMakePresets.json b/CMakePresets.json
index c2581beb..7d21b962 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -353,7 +353,8 @@
     { "name": "x64-Debug-ICX"    , "description": "Intel oneAPI Compiler (Debug) with DX12", "inherits": [ "base", "x64", "Debug", "IntelLLVM" ] },
     { "name": "x64-Release-ICX"  , "description": "Intel oneAPI Compiler (Release) with DX12", "inherits": [ "base", "x64", "Release", "IntelLLVM" ] },
 
-    { "name": "x64-Fuzzing"      , "description": "MSVC for x64 (Release) with ASan", "inherits": [ "base", "x64", "Release", "MSVC", "Fuzzing" ] }
+    { "name": "x64-Fuzzing"      , "description": "MSVC for x64 (Release) with ASan", "inherits": [ "base", "x64", "Release", "MSVC", "Fuzzing" ] },
+    { "name": "x64-Analyze"      , "description": "MSVC for x64 (Debug) with DX12 using /analyze", "inherits": [ "base", "x64", "Debug", "MSVC" ], "cacheVariables": { "ENABLE_CODE_ANALYSIS": true } }
   ],
   "testPresets": [
     { "name": "x64-Debug"      , "configurePreset": "x64-Debug" },

From 06e51411ef5ca47b7a2045fecb42bf6b5bd1a5ef Mon Sep 17 00:00:00 2001
From: Chuck Walbourn <chuckw@microsoft.com>
Date: Tue, 17 Sep 2024 11:49:09 -0700
Subject: [PATCH 11/11] CMake update

---
 CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b6753e06..8999965e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -511,7 +511,7 @@ if(directxmath_FOUND)
 endif()
 
 if(TOOL_EXES)
-  message("INFO: Building tools: ${TOOL_EXES}")
+  message(STATUS "Building tools: ${TOOL_EXES}")
 endif()
 
 if(MSVC)