Add dynamic OS version check

This commit is contained in:
Benjamin Moir
2025-11-16 04:26:55 +10:00
parent 627c3c3a1e
commit 6c761f2786
5 changed files with 56 additions and 16 deletions
+4
View File
@@ -1,5 +1,6 @@
cmake_minimum_required(VERSION 3.20)
project(XboxAudio2 LANGUAGES CXX ASM_MASM)
add_subdirectory(lib)
file(GLOB_RECURSE XAUDIO_SOURCES CONFIGURE_DEPENDS "include/*.h" "source/*.cpp" "source/*.h" "source/*.asm")
add_library(XAudio2_9 SHARED ${XAUDIO_SOURCES})
@@ -12,3 +13,6 @@ target_link_libraries(XAudio2_9 PRIVATE ${FFMPEG_LIBRARIES})
find_package(wil CONFIG REQUIRED)
target_link_libraries(XAudio2_9 PRIVATE WIL::WIL)
target_link_directories(XAudio2_9 PRIVATE lib)
target_link_libraries(XAudio2_9 PRIVATE kernelx)
+2
View File
@@ -0,0 +1,2 @@
*.exp
*.lib
+18
View File
@@ -0,0 +1,18 @@
file(GLOB DEF_FILES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/*.def")
cmake_path(CONVERT "${DEF_FILES}" TO_NATIVE_PATH_LIST DEF_FILES)
foreach(DEF_FILE ${DEF_FILES})
get_filename_component(DEF_NAME_WE "${DEF_FILE}" NAME_WE)
execute_process(
COMMAND lib
/machine:x64
"/def:${DEF_FILE}"
"/out:${CMAKE_CURRENT_SOURCE_DIR}\\${DEF_NAME_WE}.lib"
RESULT_VARIABLE LIB_RESULT
ERROR_VARIABLE LIB_ERROR)
if(NOT LIB_RESULT EQUAL 0)
message(FATAL_ERROR "${LIB_ERROR}")
endif()
endforeach()
+3
View File
@@ -0,0 +1,3 @@
LIBRARY kernelx.dll
EXPORTS
GetVersionExW
+29 -16
View File
@@ -47,25 +47,38 @@ BOOL WINAPI DllMain(
_In_ DWORD fdwReason,
_In_ LPVOID lpvReserved)
{
OSVERSIONINFOW OsVersion = { sizeof(OsVersion) };
if (fdwReason != DLL_PROCESS_ATTACH)
return TRUE;
// TODO: Dynamic check
#if 1
OrdinalProc1 = GetProcAddress(hinstDLL, "CreateAudioReverb");
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateFX");
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateXAudio2Object");
OrdinalProc5 = GetProcAddress(hinstDLL, "X3DAudioCalculate");
OrdinalProc6 = GetProcAddress(hinstDLL, "X3DAudioInitialize");
#else
OrdinalProc1 = GetProcAddress(hinstDLL, "XAudio2Create");
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioReverb");
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateFX");
OrdinalProc5 = GetProcAddress(hinstDLL, "X3DAudioCalculate");
OrdinalProc6 = GetProcAddress(hinstDLL, "X3DAudioInitialize");
#endif
// This should link to kernelx.dll!GetVersionExW.
#pragma warning(suppress : 28159)
if (!GetVersionExW(&OsVersion))
return FALSE;
// 6.2.10698.0 is the oldest known OS version with CreateXAudio2Object.
if (OsVersion.dwMajorVersion > 6 ||
(OsVersion.dwMajorVersion == 6 && OsVersion.dwMinorVersion > 2) ||
(OsVersion.dwMajorVersion == 6 && OsVersion.dwMinorVersion == 2 && OsVersion.dwBuildNumber >= 10698))
{
OrdinalProc1 = GetProcAddress(hinstDLL, "CreateAudioReverb");
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateFX");
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateXAudio2Object");
OrdinalProc5 = GetProcAddress(hinstDLL, "X3DAudioCalculate");
OrdinalProc6 = GetProcAddress(hinstDLL, "X3DAudioInitialize");
}
else
{
OrdinalProc1 = GetProcAddress(hinstDLL, "XAudio2Create");
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioReverb");
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateFX");
OrdinalProc5 = GetProcAddress(hinstDLL, "X3DAudioCalculate");
OrdinalProc6 = GetProcAddress(hinstDLL, "X3DAudioInitialize");
}
return TRUE;
}