]> Repos - portaudio/commitdiff
wasapi: Check for the supported Windows version explicitly in PaWasapi_Initialize... winrt
authordmitrykos <dmitrykos@neutroncode.com>
Thu, 5 Aug 2021 17:23:39 +0000 (20:23 +0300)
committerdmitrykos <dmitrykos@neutroncode.com>
Thu, 5 Aug 2021 17:23:39 +0000 (20:23 +0300)
src/hostapi/wasapi/pa_win_wasapi.c

index cad4b81c08b38e66097d81c6126302e809dd0f6c..1890743cab4d9d26153b311db7b5b654fcde1a54 100644 (file)
@@ -1207,6 +1207,8 @@ static BOOL IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WO
 }
 #endif
 // Get Windows version
+// note: We are trying to get Windows version starting from Windows Vista. Earlier OS versions
+//       will fall into WINDOWS_UNKNOWN case.
 static EWindowsVersion GetWindowsVersion()
 {
 #ifndef PA_WINRT
@@ -1229,14 +1231,14 @@ static EWindowsVersion GetWindowsVersion()
         {
             OSVERSIONINFOW ver = { sizeof(OSVERSIONINFOW), 0, 0, 0, 0, {0} };
 
-            PRINT(("WASAPI: getting Windows version with RtlGetVersion()\n"));
-
             if (fnRtlGetVersion(&ver) == NTSTATUS_SUCCESS)
             {
                 dwMajorVersion = ver.dwMajorVersion;
                 dwMinorVersion = ver.dwMinorVersion;
                 dwBuild        = ver.dwBuildNumber;
             }
+            
+            PRINT(("WASAPI: getting Windows version with RtlGetVersion(): major=%d, minor=%d, build=%d\n", dwMajorVersion, dwMinorVersion, dwBuild));
         }
 
         #undef NTSTATUS_SUCCESS
@@ -1249,17 +1251,15 @@ static EWindowsVersion GetWindowsVersion()
 
             if ((fnGetVersion = (LPFN_GETVERSION)GetProcAddress(GetModuleHandleA("kernel32"), "GetVersion")) != NULL)
             {
-                DWORD dwVersion;
-
-                PRINT(("WASAPI: getting Windows version with GetVersion()\n"));
-
-                dwVersion = fnGetVersion();
+                DWORD dwVersion = fnGetVersion();
 
                 dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
                 dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
 
                 if (dwVersion < 0x80000000)
                     dwBuild = (DWORD)(HIWORD(dwVersion));
+                
+                PRINT(("WASAPI: getting Windows version with GetVersion(): major=%d, minor=%d, build=%d\n", dwMajorVersion, dwMinorVersion, dwBuild));
             }
         }
 
@@ -2319,9 +2319,16 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
     PaWasapiHostApiRepresentation *paWasapi;
 
 #ifndef PA_WINRT
+    // Fail safely for any Windows version below Windows Vista
+    if (GetWindowsVersion() == WINDOWS_UNKNOWN)
+    {
+        PRINT(("WASAPI: Unsupported Windows version!\n"));
+        return paNoError;
+    }
+
     if (!SetupAVRT())
     {
-        PRINT(("WASAPI: No AVRT! (not VISTA?)\n"));
+        PRINT(("WASAPI: avrt.dll missing! Windows integrity broken?\n"));
         return paNoError;
     }
 #endif
@@ -2349,11 +2356,11 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
 
     // Fill basic interface info
     *hostApi                             = &paWasapi->inheritedHostApiRep;
-    (*hostApi)->info.structVersion         = 1;
-    (*hostApi)->info.type                 = paWASAPI;
-    (*hostApi)->info.name                 = "Windows WASAPI";
+    (*hostApi)->info.structVersion       = 1;
+    (*hostApi)->info.type                = paWASAPI;
+    (*hostApi)->info.name                = "Windows WASAPI";
     (*hostApi)->info.deviceCount         = 0;
-    (*hostApi)->info.defaultInputDevice     = paNoDevice;
+    (*hostApi)->info.defaultInputDevice  = paNoDevice;
     (*hostApi)->info.defaultOutputDevice = paNoDevice;
     (*hostApi)->Terminate                = Terminate;
     (*hostApi)->OpenStream               = OpenStream;