[WINMM] Sync wine commit ebae298 as a fix for CORE-15336 (#1031)
[reactos.git] / dll / win32 / winmm / joystick.c
index ac4fc4e..92bd48d 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include "config.h"
+#include "winemm.h"
 
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
-#include <stdarg.h>
-#include <stdio.h>
+
 #include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
+
 #ifdef HAVE_SYS_IOCTL_H
 #include <sys/ioctl.h>
 #endif
 
-#include "winemm.h"
-#include "windef.h"
-#include "winbase.h"
-#include "mmsystem.h"
-#include "wingdi.h"
-#include "winuser.h"
-#include "winnls.h"
-
-#include "mmddk.h"
-
-#include "wine/debug.h"
-
 WINE_DEFAULT_DEBUG_CHANNEL(winmm);
 
 #define MAXJOYSTICK (JOYSTICKID2 + 30)
@@ -69,12 +55,21 @@ static      WINE_JOYSTICK   JOY_Sticks[MAXJOYSTICK];
  */
 static BOOL JOY_LoadDriver(DWORD dwJoyID)
 {
-    if (dwJoyID >= MAXJOYSTICK)
+    static BOOL winejoystick_missing = FALSE;
+
+    if (dwJoyID >= MAXJOYSTICK || winejoystick_missing)
        return FALSE;
     if (JOY_Sticks[dwJoyID].hDriver)
        return TRUE;
 
     JOY_Sticks[dwJoyID].hDriver = OpenDriverA("winejoystick.drv", 0, dwJoyID);
+
+    if (!JOY_Sticks[dwJoyID].hDriver)
+    {
+        /* The default driver is missing, don't attempt to load it again */
+        winejoystick_missing = TRUE;
+    }
+
     return (JOY_Sticks[dwJoyID].hDriver != 0);
 }
 
@@ -137,7 +132,7 @@ MMRESULT WINAPI joyConfigChanged(DWORD flags)
 /**************************************************************************
  *                             joyGetNumDevs           [WINMM.@]
  */
-UINT WINAPI joyGetNumDevs(void)
+UINT WINAPI DECLSPEC_HOTPATCH joyGetNumDevs(void)
 {
     UINT       ret = 0;
     int                i;
@@ -153,7 +148,7 @@ UINT WINAPI joyGetNumDevs(void)
 /**************************************************************************
  *                             joyGetDevCapsW          [WINMM.@]
  */
-MMRESULT WINAPI joyGetDevCapsW(UINT_PTR wID, LPJOYCAPSW lpCaps, UINT wSize)
+MMRESULT WINAPI DECLSPEC_HOTPATCH joyGetDevCapsW(UINT_PTR wID, LPJOYCAPSW lpCaps, UINT wSize)
 {
     if (wID >= MAXJOYSTICK)    return JOYERR_PARMS;
     if (!JOY_LoadDriver(wID))  return MMSYSERR_NODRIVER;
@@ -167,7 +162,7 @@ MMRESULT WINAPI joyGetDevCapsW(UINT_PTR wID, LPJOYCAPSW lpCaps, UINT wSize)
 /**************************************************************************
  *                             joyGetDevCapsA          [WINMM.@]
  */
-MMRESULT WINAPI joyGetDevCapsA(UINT_PTR wID, LPJOYCAPSA lpCaps, UINT wSize)
+MMRESULT WINAPI DECLSPEC_HOTPATCH joyGetDevCapsA(UINT_PTR wID, LPJOYCAPSA lpCaps, UINT wSize)
 {
     JOYCAPSW   jcw;
     MMRESULT   ret;
@@ -216,7 +211,7 @@ MMRESULT WINAPI joyGetDevCapsA(UINT_PTR wID, LPJOYCAPSA lpCaps, UINT wSize)
 /**************************************************************************
  *                              joyGetPosEx             [WINMM.@]
  */
-MMRESULT WINAPI joyGetPosEx(UINT wID, LPJOYINFOEX lpInfo)
+MMRESULT WINAPI DECLSPEC_HOTPATCH joyGetPosEx(UINT wID, LPJOYINFOEX lpInfo)
 {
     TRACE("(%d, %p);\n", wID, lpInfo);